1. Logger는 사용가능한 interface를 보여준다.
2. Handlers는 log records를 적절한 destination에 보내준다.
3. Filters는 어떤 log record를 출력할지 결정하기 위해 세밀한 기능을 제공한다.
4. Formatters는 final output 안에서 log record의 layout를 지정한다.
logger는 직접적으로 instance화 되지 않고, module level function logging.getLogger(name)을 통해서만 instance화 된다. getLogger에 같은 name을 이용해서 여러번 호출해도 같은 Logger object에 대한 reference를 반환한다.
logging levels에는 다음과 같은 5가지가 있다.
1. CRITICAL
2. ERROR
3. WARNING
4. INFO
5. DEBUG
6. NOTSET
Handler는 직접 instance화 되지 않고, 이 class는 더 유용한 subclass들의 base처럼 행동한다. 하지만 subclass들은 Handler.__init__()을 호출해야한다.
Formatter objects는 LogRecord를 string으로 변환한다. base Formatter는 문자열 형식을 지정한다.
Filters는 level을 이용한 filtering보다 더 정교한 filtering을 하기 위해 Handler와 Logger에 의해 사용된다. base filter class는 logger hierachy에 특정 point만 허용한다.
Logging은 어떤 software가 실행될 때 event들을 추적하기 위한 수단이다. software 개발자들은 특정 event가 일어났을 때 그것을 나타내기 위해 logging calls을 추가한다. event들은 message에 의해 기술된다.
Logging은 간단한 logging 사용을 위해 간편한 함수들의 set을 제공한다. (debug(), info(), warning(), error(), critical()).
Logging 함수는 level이나 event의 severity에 따라서 이름이 지어졌다. 표준화된 level과 applicability는 아래와 같다.
Level | When it’s used |
---|---|
DEBUG | 문제를 진단할 때 관심있는 부분의 detail한 정보 |
INFO | 예상한대로 잘 동작하는지에 대한 확인 |
WARNING | 뭔가 잘못됬거나 미래에 문제가 생길 것을 나타낸다. 예상대로 작동 중 |
ERROR | 심각한 문제로 인해 software가 어떤 기능을 사용할 수 없다. |
CRITICAL | 프로그램이 작동할 수 없는 정도의 심각한 에러 |
default level은 WARNING이다. logging package가 다르게 수행하도록 구성되지 않은 경우에 WARNING 또는 더 높은 단계만 추적된다.
추적된 event들은 다른 방법들로 handle될 수 있다. 가장 simple한 방법은 console에 추적된 event를 출력하는 것이고, 다른 보편적인 방법은 disk file에 쓰는 것이다.
import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything
위와 같은 script를 실행시킨다면 아래와 같은 결과를 보게 될 것이다.
WARNING:root:Watch out!
INFO message는 나타나지 않는다. 왜냐하면 default level이 WARNING이기 때문이다. 출력된 message는 해당 level의 indication과 logging call에 제공된 event에 대한 묘사를 포함한다.
가장 보편적인 상황이 파일에 logging event를 기록하는 것이다.
import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('And non-ASCII stuff, too, like Øresund and Malmö')
위와 같은 script를 실행시킨다면 아래와 같은 결과를 얻게 된다.
DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too
ERROR:root:And non-ASCII stuff, too, like Øresund and Malmö
여기서는 logging level을 DEBUG로 설정하였기 때문에 모든 메세지가 출력된다.
basicCongfig()는 debug(), info()보다 먼저 호출되어야 한다. 일회성 간단한 구성 기능으로 의도되었으므로 첫 번째 호출 만 실제로 어떤 작업을 수행합니다. 후속 호출은 사실상 무단입니다.
#1
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')
>>> DEBUG:This message should appear on the console
>>> INFO:So should this
>>> WARNING:And this, too
#2
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')
>>> 2010-12-12 11:41:42,612 is when this event was logged.