본문 바로가기
Python

[Python] logging을 알아보자!

by 토니초이 2023. 3. 19.

오늘은 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가 출력된다.

console 출력내용
example_logger.py

이렇게 동시에 file과 console 모두에서 서로 다른 level을 갖는 로그를 출력할 수 있다.