파이썬 로깅 라이브러리의 구조

구성 요소

  • 파이썬 로깅 라이브러리는 Logger, Handler, Formatter 라는 세 가지 주요 요소로 구성된다.
  • 이 세 구성 요소 간에 전달되는 정보를 담은 데이터 구조가 LogRecord 이다.

Logger(로거)

  • 역할 : 로깅 시스템의 진입점이자 구심점이 되는 객체. 개발자가 로깅 메시지를 생성하고 관리하는 역할을 한다.
  • 로깅 메시지 생성 : logger.debug(), logger.error() 등 메서드를 사용해 로그 레코드를 생성한다.
  • 레벨 검사 : 자신에게 설정된 로그 레벨 미만의 메시지는 처리하지 않고 무시한다.
  • 핸들러 전달 : 생성 및 레벨 검사에서 통과된 로그 레코드를 하나 이상의 Handler 에 전달한다.
  • 계층 구조 : 로거는 계층적 구조를 가질 수 있으며(e.g. main.sub) 메시지는 기본적으로 상위 로거로 전파(propagation) 된다.

Handler(핸들러)

  • 역할 : Logger 로부터 받은 로그 레코드를 실제 출력 위치로 전송하는 역할을 한다.
  • 출력 대상 결정 : 콘솔(스트림), 파일, 이메일, HTTP 서버 등 다양한 대상으로 로그 전송
  • 포매터 연결 : Formatter 객체를 연결해 로그 레코드를 원하는 문자열 형식으로 변환한다.
  • 레벨 검사 : 핸들러 자체의 레벨이 설정되어 있어, 해당 레벨 이하의 로그 레코드는 처리하지 않는다.
  • 개발자가 직접 핸들러가 처리할 로직을 구성하여 새로 만들 수도 있다.
종류 설명
StreamHandler 콘솔(sys.stderr 또는 sys.stdout)에 출력
FileHandler 지정된 파일에 출력(기록)
RotatingFileHandler 파일의 크기가 일정 수준을 넘으면 자동으로 파일을 교체(로테이션)
TimedRotatingFileHandler 시간의 흐름에 따라 자동으로 파일을 교체(로테이션)
SMTPHandler 로그를 메일로 전송

Formatter(포매터)

  • 역할 : Logger가 생서한 로그 레코드 객체를 사용자가 원하는 형식의 문자열로 변환한다.
  • 주요 기능 : 템플릿 정의 - 로그 메시지에 포함될 정보와 순서를 정의한다.
  • 예시 포맷 문자열 : "%(asctime)s - %(name)s - %(message)s"

LogRecord(로그레코드)

  • 로깅 이벤트에 대한 모든 정보를 담고 있는 객체
  • 역할 : Logger, Handler, Formatter 사이를 이동하는 데이터 패키지 역할
  • 메시지 텍스트, 로깅 레벨, 타임스탬프, 파일명, 라인 번호 등 모든 관련 컨텍스트 정보를 포함한다.

파이썬 로깅의 흐름

로깅 준비

No 흐름 설명
1 로거 생성 로깅을 수행할 로거를 생성하고, 로그레벨 등 관련 설정을 수행한다.
2 핸들러 생성 로거가 만든 로그 레코드를 전송하는 핸들러를 생성하고, 로그레벨 등 관련 설정을 수행한다.
3 포매터 생성 로그 레코드를 지정 형식의 로그 메시지로 만드는 포매터를 생성하고, 관련 설정을 수행한다.
4 포매터 할당 핸들러에 포매터를 할당한다.
5 핸들러 할당 로거에 핸들러를 할당한다.

로깅

No 흐름 설명
1 로깅 메서드 호출 생성된 Logger 인스턴스를 통해 로깅 메서드(e.g. logger.info())를 호출한다.
2 로그 레코드 생성 메서드 호출의 결과로 로그 레코드(LogRecord)인스턴스가 생성된다.
3 로거 레벨 필터링 Logger 는 자신에게 설정된 로그 레벨을 확인해, 로그 레코드가 해당 레벨 이상이면 처리하도록 한다.
4 핸들러 전달 필터링을 통과한 로그 레코드는 해당 Logger에 등록된 모든 Handler에 전달된다.
5 핸들러 레벨 필터링 Handler 자신에게 설정된 로그 레벨을 확인하고, 전달받은 로그 레코드를 처리할지 결정한다.
6 포맷 변환 Handler에 연결된 Formatter 인스턴스가 로그 레코드의 정보를 지정된 형식의 문자열로 변환한다.
7 전파(propagation) 로그 레코드가 계층 구조를 따라 상위 로거로 전달된다.(설정값에 따름)
상위 로거도 3~8번 단계를 거친다.
8 최종 출력 변환된 문자열 로그 메시지는 Handler가 지정한 대상(파일, 콘솔, 이메일 등)으로 최종 출력된다.

Reference

https://docs.python.org/3/library/logging.html
https://docs.python.org/ko/3/howto/logging.html

Comments