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을 결정.
)