본문으로 바로가기

소개

 

FileHandler 를 사용하면 로그파일은 크기가 제한없이 커지는데요.

로그 파일 회전을 지원하는 RotatingFileHandler 을 알아보겠습니다.

 

RotatingFileHandler

  • filename: 파일이름

  • mode: 쓰기 모드 (default: 'a')

  • maxBytes: 백업할 로그 파일의 최대 크기 (Bytes)

  • backupCount: 백업 로그 파일 개수

 

 

예제 1

 

다음 예제는 FileHandler 을 사용하여 로그파일 크기가 500 KB 까지 반복합니다.

import logging
import os

def loop():
    i, file_size = 0, 0
    while file_size < 500*1024: # 500 KB
        file_size = os.path.getsize(log_file_path)
        logger.debug(i)
        i += 1

    print(f'{file_size} Byte')

if __name__ == '__main__':
    log_dir = 'log'
    log_fname = 'debug.log'
    if not os.path.exists(log_dir):
        os.mkdir(log_dir)

    logger = logging.getLogger('jvv')
    logger.setLevel(logging.DEBUG)
    
    log_file_path = os.path.join(log_dir, log_fname)

    file_handler = logging.FileHandler(log_file_path)
    formatter = logging.Formatter('[%(levelname)s] :: %(asctime)s :: %(module)s :: %(name)s :: %(message)s\n')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

    loop()
512064 Byte

 

 

예제 2

 

백업파일 크기 1KB, 백업파일 개수 5개로 지정했습니다.

import logging
from logging.handlers import RotatingFileHandler
import os

def loop():
    i = 0
    while len(os.listdir(log_dir)) < 5:
        logger.debug(i)
        i += 1
    
    for file in os.listdir(log_dir):
        _path = os.path.join(log_dir, file)
        _size = os.path.getsize(_path)
        print(f'{file} size: {_size}')

if __name__ == '__main__':
    log_dir = 'log'
    log_fname = 'debug.log'
    if not os.path.exists(log_dir):
        os.mkdir(log_dir)

    logger = logging.getLogger('jvv')
    logger.setLevel(logging.DEBUG)
    
    path = os.path.join(log_dir, log_fname)
    rot_file_handler = RotatingFileHandler(path, mode='a', maxBytes=1024, backupCount=5)
    formatter = logging.Formatter('[%(levelname)s] :: %(asctime)s :: %(module)s ::%(name)s :: %(message)s\n')
    rot_file_handler.setFormatter(formatter)
    logger.addHandler(rot_file_handler)

    logger.debug('20200817')

    loop()
debug.log size: 59
debug.log.1 size: 1003
debug.log.2 size: 1003
debug.log.3 size: 1003
debug.log.4 size: 999

 

 

다음과 같이 진행해보았습니다.

while i < 1000:
    logger.debug(i)
    i += 1
debug.log size: 960
debug.log.1 size: 1020
debug.log.2 size: 1020
debug.log.3 size: 1020
debug.log.4 size: 1020
debug.log.5 size: 1020

 

뒤로 밀면서 덮어쓰여지는 것을 확인할 수 있습니다.

 

 

 

참고

 

logging.handlers — 로깅 처리기 — Python 3.8.5 문서

소스 코드: Lib/logging/handlers.py 다음과 같은 유용한 처리기가 패키지에서 제공됩니다. 3개의 처리기(StreamHandler, FileHandler, NullHandler)는 실제로는 logging 모듈 자체에 정의되어 있지만, 다른 처리기들�

docs.python.org