Python

[Python] logging - 일정 주기로 로그 파일 회전하기

비번변경 2024. 7. 24. 18:59

개요

이전에 2022.02.14-[logging] Logger/Handler/Formatter 글에서 Python의 Logger를 살펴보았었다. 기존에는 여러 Log 핸들러 중에서 StreamHandler와 FileHandler를 사용했는데, 이번 글에서는 TimedRotatingFileHandler를 사용해 로그를 남겨보려고 한다.

 

 

TimedRotatingFileHandler

TimedRotatingFileHandler는 특정 시간 간격을 기준으로 로그 파일을 회전시키는 핸들러다.

일반적인 FileHandler는 정해진 파일 하나에 계속해서 로그를 누적시키기 때문에 로그 파일 하나의 용량이 대단히 커질 수 있다. 하지만 TimedRotatingFileHandler는 특정 주기, 예로 들어 하루에 한 번이나 일주일에 한 번 로그 파일을 롤링시키기 때문에 로그 파일의 용량을 좀 더 편리하게 관리할 수 있다.

 

비슷하게 RotatingFileHandler는 로그 파일의 용량을 기준으로 로그 파일을 회전시킨다.

 

생성자

TimedRotatingFileHandler는 다음과 같이 생성할 수 있다.

logging.handlers.TimedRotatingFileHandler(filename, 
                                          when='h', interval=1, backupCount=0, 
                                          encoding=None, 
                                          delay=False,
                                          utc=False, atTime=None)

여러가지 매개변수 중 로그 파일 회전과 관련된 부분은 다음과 같다.

- when : 파일 회전 주기의 유형을 지정한다. 초(S), 분(M), 시(H), 일(D), 자정(midnight), 특정 요일(W0 ~ W6) 간격 등을 지정할 수 있다. 기본값은 H이다.

- interval : 시간 간격을 지정한다. 예로 들어, when이 H이고 interval이 2이면 2시간 마다 로그 파일을 회전한다.

- backupCount : 로그 파일을 보관할 파일의 수를 지정한다. 만약 backupCount 보다 많은 개수의 파일이 생성되면 가장 오래된 파일을 삭제한다.

- atTime : 자정이나 특정 요일에 로그 파일을 회전시키는 경우, 회전시키는 시각을 지정한다.

 

 

사용 예시

다음의 요구사항을 만족하는 로거를 생성해보자.

  • INFO LEVEL 이상의 로그를 출력한다.
  • 출력하는 모든 로그는 file로 저장한다.
  • 로그 파일은 매 분 간격으로 회전한다.
  • 최대 3개의 백업 로그 파일을 유지한다.
  • 로그 발생 시각, Log Level과 그 메세지를 출력한다.

 

코드

import logging
from logging.handlers import TimedRotatingFileHandler

# Logger
logger = logging.getLogger("stu")
logger.setLevel(logging.DEBUG)

# Handler
file_handler = TimedRotatingFileHandler(filename="run.log", when='M', interval=1, backupCount=3)
file_handler.setLevel(logging.INFO)
file_handler.suffix = '%Y-%m-%d_%H-%M'

# Formatter
formatter = logging.Formatter(
    fmt="%(asctime)s [%(levelname)s] %(message)s",
    datefmt=None,
    style='%'
)
file_handler.setFormatter(formatter)

logger.addHandler(file_handler)

 

참고로 suffix는 회전된 로그 파일 뒤에 붙는 문자열로, "{filename}.{suffix}" 형식으로 파일이 생성된다. suffix의 형식은 when 값에 따라서 정해져 있는 것 같다.

 

실행 결과

위의 로거로 로그 파일을 생성하면 현재 로그와 백업 로그 포함해서 총 4개의 파일 수가 유지된다.

 

 

 

참고 문서

https://docs.python.org/3.7/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler

https://yurimkoo.github.io/python/2019/08/11/logging.html