로깅은 어떤 소프트웨어가 실행될 때 발생하는 이벤트를 추적하는 수단이다. 소프트웨어 개발자는 코드에 로깅 호출을 추가하여 특정 이벤트가 발생했음을 나타낸다. 파이썬에는 로그를 출력해주는 기본 내장 모듈 logging이 있다. 보통 log는 서버에서 많이 사용하는데, 어느 상황이든 상관없이 로그를 출력하고 싶을 때 사용하면 된다.
import logging
# logger 생성
logger = logging.getLogger()
# 로그의 출력 기준 설정
logger.setLevel(logging.INFO)
# log 출력 형식
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# log 콘솔에 출력
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
# log를 파일에 출력
file_handler = logging.FileHandler('example.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
for i in range(5):
logger.debug(f'{i}번째 debug message')
logger.info(f'{i}번째 info message')
logger.warning(f'{i}번째 warn message')
logger.error(f'{i}번째 error message')
logger.critical(f'{i}번째 critical message')
- logging.getLogger()를 통해 logger를 생성
이때, 파라미터로 아무것도 넣어주지 않으면 root logger가 생성되고, 로거의 이름을 넣어주면 해당 이름으로 생성된다. (임의의 이름으로 생성된 logger는 모두 root logger의 자손이 된다.)
- logger의 출력 기준을 설정
이벤트의 심각도는 DEBUG, INFO, WARNING, ERROR, CRITICAL 순이다. CRITICAL이 가장 심각한 수준이다.
기본 설정은 WARNING으로 DEBUG와 INFO log들은 출력되지 않는다. setLevel 함수로 어느 수준의 이벤트까지 출력을 한 것인지 설정해 줄 수 있다. logger.setLevel(logging.INFO)로 설정한 경우, INFO에 대한 log도 출력으로 확인할 수 있다.
- formatter로 저장될 log의 포맷 지정
%(asctime)s - %(name)s - %(levelname)s - %(message)s
각각 시간, logger의 이름, INFO/ERROR 등의 log레벨의 종류, 메시지이다.
- log를 출력할 stream_handler와 file_handler를 선언
Handler 객체는 (로그 메시지의 심각도를 기반으로) 적절한 로그 메시지를 처리기의 지정된 대상으로 전달하는 역할을 한다. Logger 객체는 addHandler() 메서드를 사용하여 0개 이상의 처리기 객체를 자신에게 추가 할 수 있다. 예를 들어, 응용 프로그램은 모든 로그 메시지를 로그 파일로 보내고, 에러(error)와 그 이상의 모든 로그 메시지를 표준 출력으로 보내고, 모든 심각한 에러(critical) 메시지를 전자 메일 주소로 보낼 수 있다. 이 시나리오에서는 각 처리기가 특정 심각도의 메시지를 특정 위치로 보내는 3개의 개별 처리기가 필요하다.
streamhandler는 콘솔 창에서 로그를 보여준다. file_handler는 파일에 로그를 쓰는 것으로 파일명을 파라미터로 넣어주면 된다. 위에서 선언한 formatter도 적용해준다.
2022-08-16 00:43:49,025 - root - INFO - info message
2022-08-16 00:43:49,025 - root - WARNING - info message
2022-08-16 00:43:49,025 - root - ERROR - info message
2022-08-16 00:43:49,025 - root - CRITICAL - info message
log를 출력해보면 console창에 출력도 되고 example.log라는 파일에도 잘 출력된 것을 확인할 수 있습니다. 중요한 것은 setLevel을 INFO로 지정했기 때문에 DEBUG에 해당되는 에러는 출력되지 않는다.
(참고) 로깅의 적절한 사용