본문 바로가기

Python Logging

logging 모듈 사용법

 

logging — Logging facility for Python — Python 3.10.5 documentation

logging — Logging facility for Python Source code: Lib/logging/__init__.py This module defines functions and classes which implement a flexible event logging system for applications and libraries. The key benefit of having the logging API provided by a s

docs.python.org

logging 기본 사용법 

Example 

#logging_example1.py
logging.getLogger().setLevel(logging.INFO)
logging.info('info로그')
 

실행 

 
python logging_example1.py​
INFO:root:info로그
 
 

logging 모듈은 크게 다음과 같은 분류로 되어있다.

  • Loggers : 인터페이스 제공
  • Handlers : Loggers에 의해 생성된 레코드를 적절한 위치로 보냄
  • Filters : 로그 필터링
  • Formatters : 레코드의 출력 형태 지정

위의 방식은 root Logger를 사용한 방법이며 Logger오브젝트를 따로 만들어 원하는 목적에 맞게 사용할 수 있다.

Logger Object 

여기서는 로거 오브젝트를 만들어 사용하는 방법에 대해 다룬다.
커스텀 로거를 사용하기 위해서는 다음과 같은 과정을 거친다.

  1. Logger 오브젝트 생성
  2. Logger 레벨 설정
  3. 핸들러 설정
  4. 로그 출력
#logging_example2.py
import logging

my_logger = logging.getLogger('myLogger')   #1

my_logger.setLevel(logging.INFO)            #2
stream_handler = logging.StreamHandler()
my_logger.addHandler(stream_handler)        #3

my_logger.info('info log')                  #4
 

Logger 

log를 생성하는 메소드들은 여러개가 있다.

  • debug
  • info
  • warning
  • error
  • critical

각 메소드들은 설정된 레벨에 따라 출력된다. 레벨은 debug가 가장 낮으며 critical이 가장 높다. 로그는 설정된 레벨보다 높은 로그만 출력된다. ex) level = INFO이면, INFO, WARNING, ERROR, CRITICAL만 출력

Handler 

핸들러는 간단히 StreamHandler, FileHandler가 있다. StreamHandler는 콘솔에 로그를 출력하며 FileHandler는 지정된 파일에 로그를 출력한다. 핸들러는 Logger에 없을수도 있으며 두개 이상일수도 있다.

Logger 오브젝트에서 설정하는 setLevel은 핸들러로 보내는 로그를 지정하며, Handler에서 지정하는 setLevel을 통해 최종 로그가 결정됨. ex) Logger는 DEBUG레벨로 지정, 핸들러는 INFO레벨로 지정한다면 Logger는 모든 로그를 핸들러에게 보내지만 핸들러는 INFO레벨 이상의 로그만 출력하게 된다.

Formatter 

Formatter는 최종 출력 로그 메시지를 지정하며 사용 가능한 포멧은 다음과 같다.

  • %(levelname)s : 로그를 출력한 메소드의 level을 출력한다.
  • %(asctime)s : 시간을 출력한다.
    • datefmt=’%m/%d %H:%M:%S’
  • %(message)s : 로그 메시지를 출력한다

Example 

#logging_example3.py
import logging

my_logger = logging.getLogger('myLogger')       #1
my_logger.setLevel(logging.DEBUG)         

jh_format = logging.Formatter('[%(levelname)s] %(asctime)s %(message)s ', datefmt='%m/%d %H:%M:%S')     #2

jh_handler = logging.StreamHandler()        #3
jh_handler.setLevel(logging.INFO)
jh_handler.setFormatter(jh_format)
my_logger.addHandler(jh_handler)        

my_logger.debug('debug log')                    #4
my_logger.info('info log')                  
my_logger.warning('warning log')
 
  1. my_logger 오브젝트 생성과, DEBUG레벨로 설정
  2. 포멧으로 사용할 jh_format 선언
  3. jh_handler 설정
    1. Stream핸들러로 설정하고
    2. 레벨은 INFO(Logger객체는 DEBUG레벨임)
    3. formatter는 2.에서 선언한 jh_format 사용
    4. my_logger오브젝트에 핸들러 추가
  4. debug, info, warning 로그 출력

결과 

[INFO] 02/21 17:45:01 info log 
[WARNING] 02/21 17:45:01 warning log
 

my_logger는 모든 로그를 핸들러로 보냈지만, 현재 my_logger에 있는 핸들러는 jh_handler밖에 없고,

해당 핸들러는 INFO레벨로 설정되어 있으므로 DEBUG 메시지는 출력하지 않음.