python logging basic에 이어서 로깅 시스템에 대해 알아보자.
logging 시스템은 다음과 같은 구성요소들로 이루어진다.
로그 이벤트는 LogRecord
형태로 Loggers에서부터 Handlers, Formatters 순서로 전달된다.
https://docs.python.org/3.7/howto/logging.html#logging-flow
Loggers는 1. 로그를 생성할 수 있는 method를 제공(Logger.debug()
, Logger.info()
), 2. 로그 레벨과 Logger에 적용된 filter를 바탕으로 처리할 메시지 판단, 3. 적절한 Handler 들에게 로그 메시지에 부가정보가 더해진 LogRecord
인스턴스 전달
Logger 객체는 logging.getLogger(name)
method를 통해 사용할 수 있다.
name
이 주어진 경우, 해당 이름에 해당하는 logger를 name
이 주어지지 않은 경우 root logger를 전달받는다.name
은 마침표(.)로 구분되는 계층구조로, getLogger('foo.bar')
는 getLogger('foo')의 자식 logger를 반환한다.(logger.setLevel(...)
을 설정하지 않은 경우) 자신의 부모 logger의 레벨을 사용한다. 부모의 로그 레벨이 정해지지 않으면 그 부모의 로그 레벨을 참고한다. Root logger는 기본으로 WARNING
으로 설정되어 있다.(Logger.propagate=False)
로 설정해줌으로써, propagation을 막을 수 있다. 로그 메시지를 출력하는 Handler는
Handler.setLevel()
: 처리할 메시지의 최소 레벨 설정.Handler.setFormatter()
: Handler가 사용할 formatter 설정Hanlder.addFilter()
, Handler.removeFilter()
: filter 객체를 추가 및 제거최종적으로 출력될 로그의 formatting에 관여한다.
import logging
logging.Formatter(
fmt = None, # 메시지 출력 형태. None일 경우 raw 메시지를 출력.
datefmt = None, # 날짜 출력 형태. None일 경우 '%Y-%m-%d %H:%M:%S'.
style = '%' # '%', '{', '$' 중 하나. `fmt`의 style을 결정.
)