오늘은 python 프로그램의 log를 관리할 수 있는 logging 모듈에 대해서 알아봅시다
사실 가벼운 스크립트에서 로깅은 그냥 print 쓰면 가장 쉽고 편하긴 하지만 ㅎㅎㅎ
어느정도 완성도 있는 프로그램을 작성하는데에는 logging에 익숙해지는것이 좋다
logging은 Python 내장 모듈이고 아래 document에서 자세한 설명을 확인할 수 있음
https://docs.python.org/ko/3/howto/logging.html(한글)
https://docs.python.org/3/howto/logging.html(영어)
logging에서는 아래 5가지 status를 제공함. status의 심각도는 오름차순
수준 | 사용할 때 |
DEBUG | 상세한 정보. 보통 문제를 진단할 때만 필요합니다. |
INFO | 예상대로 작동하는지에 대한 확인. |
WARNING | 예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제(예를 들어 ‘디스크 공간 부족’)에 대한 표시. 소프트웨어는 여전히 예상대로 작동합니다. |
ERROR | 더욱 심각한 문제로 인해, 소프트웨어가 일부 기능을 수행하지 못했습니다. |
CRITICAL | 심각한 에러. 프로그램 자체가 계속 실행되지 않을 수 있음을 나타냅니다. |
logging 모듈을 정교하게 사용하기 위해서는 아래 4개의 component에 대해 이해해야함
- Loggers : log 출력 설정을 customize하고 로그를 설정된 handler로 보내는 역할을 함
- Handlers : log message의 목적지(like console, file, network socket..)를 설정함
- Formatters : log의 출력 양식을 설정함. timestamp나 logger의 name등을 message에 포함 시킬 수 있음
- Filters : 보다 더 정교하고 선별적인 로그 출력 레코드를 구성하기 위한 필터 기능
그럼 이제 위 component들을 이해하기 위한 예제를 봅시다.
import logging
# create a logger
# example_logger의 이름을 갖는 logger를 생성
logger = logging.getLogger('example_logger')
# example_logger의 기본 출력 level을 DEBUG로 설정
logger.setLevel(logging.DEBUG)
# create a console handler with a custom formatter
# 목적지가 Stream인 handler를 생성
console_handler = logging.StreamHandler()
# handler의 기본 출력 level을 DEBUG로 설정
console_handler.setLevel(logging.DEBUG)
# time stamp - logger name - event level - log message 양식의 formatter 생성
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# handler에 formatter 연결
console_handler.setFormatter(formatter)
# logger에 handler 연결
logger.addHandler(console_handler)
# log messages at different levels
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
위 예제에 대한 출력은 아래와 같음
만약 아래와 같이 handler의 기본 출력 level을 WARNING으로 설정하면 어떻게 될까?
# handler의 기본 출력 level을 WARNING으로 설정
console_handler.setLevel(logging.WARNING)
콘솔에서의 출력이 WARNING이상의 level을 가진 log만 출력하게 되었다!
이렇게 일정 수준의 log만 선별해서 출력하고 싶을때 handler의 setLevel을 조절하여 관리할 수 있다.
추가적으로 filter에 대한 설명은 아래 문서에서 확인할 수 있다.
https://docs.python.org/3/library/logging.html#filter
console과 file 동시 logging하기
console handler와 file handler를 logger에 연결하여 동시에 logging해보자.
import logging
logger = logging.getLogger('example_logger')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)
console_handler.setFormatter(formatter)
#file handler 생성
file_handler = logging.FileHandler('example_logger.log')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(console_handler)
#file handler 추가 연결
logger.addHandler(file_handler)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
console의 출력 level은 WARNING, file의 level은 DEBUG로 설정했다.
위 코드를 실행하면 example_logger.log 파일이 생성되고 동시에 console에 WARNING이상의 log가 출력된다.
이렇게 동시에 file과 console 모두에서 서로 다른 level을 갖는 로그를 출력할 수 있다.
'Python' 카테고리의 다른 글
파이썬 필수 템! 리스트 컴프리헨션(지능형리스트) (0) | 2023.03.15 |
---|---|
Python 상속이 성능에 영향이 있을까?? (4) | 2023.03.15 |