[python] logging system

gunny·2024년 4월 12일
0

Python

목록 보기
25/29

python logging basic에 이어서 로깅 시스템에 대해 알아보자.

https://velog.io/@heyggun/python-logging-basic-logging-level-log-%EB%82%A8%EA%B8%B0%EB%8A%94-%EB%B2%95-log-file%EB%A1%9C-%EC%A0%80%EC%9E%A5

python logging system

logging 시스템은 다음과 같은 구성요소들로 이루어진다.

  • Loggers : 애플리케이션 코드가 직접 사용할 수 있는 인터페이스 제공
  • Handlers : Loggers에 의해 생성된 LogRecord를 처리해 적절한 위치로 보냄
  • Filters : 출력되어야 하는 로그를 필터링
  • Formaters : LogRecord의 출력 형태를 지정

로그 이벤트는 LogRecord 형태로 Loggers에서부터 Handlers, Formatters 순서로 전달된다.

https://docs.python.org/3.7/howto/logging.html#logging-flow

(1) Loggers

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의 레벨이 정해지지 않은 경우 (logger.setLevel(...)을 설정하지 않은 경우) 자신의 부모 logger의 레벨을 사용한다. 부모의 로그 레벨이 정해지지 않으면 그 부모의 로그 레벨을 참고한다. Root logger는 기본으로 WARNING 으로 설정되어 있다.
  • 자식 logger는 메시지를 자기 부모 logger의 handler에게 전달한다. 부모 logger에 handler가 설정되어 있으면 자식 logger에서 handler를 다시 설정해야 하는 중복 업무를 줄일 수 있다. (Logger.propagate=False)로 설정해줌으로써, propagation을 막을 수 있다.

(2) Handlers

로그 메시지를 출력하는 Handler는

  • Handler.setLevel() : 처리할 메시지의 최소 레벨 설정.
    Logger의 설정 레벨과 다를 수 있다. Logger에서 통과가 된 로그 메시지가 Handler에서 filtering 가 될 수 있다.
  • Handler.setFormatter() : Handler가 사용할 formatter 설정
  • Hanlder.addFilter(), Handler.removeFilter() : filter 객체를 추가 및 제거

(3) Formatters

최종적으로 출력될 로그의 formatting에 관여한다.

import logging
logging.Formatter(
  fmt = None, # 메시지 출력 형태. None일 경우 raw 메시지를 출력.
  datefmt = None, # 날짜 출력 형태. None일 경우 '%Y-%m-%d %H:%M:%S'.
  style = '%' # '%', '{', '$' 중 하나. `fmt`의 style을 결정.
)

참고사이트

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글