핸들러의 종류

종류 설명 선언된 파일
Handler 여러 핸들러를 추상화한 클래스(인터페이스) logging.__init__.py
StreamHandler 콘솔(sys.stderr 또는 sys.stdout)에 출력 logging.__init__.py
FileHandler 지정된 파일에 출력(기록) logging.__init__.py
NullHandler 모든 로그 레코드를 처리하지 않고 단순히 버리는(=아무것도 하지 않는) 역할 logging.__init__.py
RotatingFileHandler 파일의 크기가 일정 수준을 넘으면 자동으로 파일을 교체(로테이션) logging.handlers.py
TimedRotatingFileHandler 시간의 흐름에 따라 자동으로 파일을 교체(로테이션) logging.handlers.py
SMTPHandler 로그를 메일로 전송 logging.handlers.py
SocketHandler TCP/IP 소켓을 통해 네트워크로 로그 전송 logging.handlers.py
DatagramHandler UDP를 통해 네트워크로 로그 전송 logging.handlers.py
HTTPHandler HTTP GET 또는 POST 요청을 통해 로그 전송 logging.handlers.py
SysLogHandler Unix/Linux 표준 로깅 메커니즘을 사용, syslog서버로 전송도 가능 logging.handlers.py
NTEventLogHandler Windows 운영체제 전용, 로그를 Windows 이벤트 뷰어에 기록 logging.handlers.py
WatchedFileHandler 파일이 외부에서 삭제되거나 리네임될 때 자동으로 다시 열어 로깅을 계속함 logging.handlers.py
BufferingHandler 로그 레코드를 메모리 버퍼에 쌓아둠 logging.handlers.py
MemoryHandler BufferingHandler와 유사하지만, 특정 레벨의 로그가 들어올 때만 플러시 logging.handlers.py
QueueHandler 로그 레코드를 queue.Queue 객체로 넣어 처리 logging.handlers.py

사용해보기

  • StreamHandler, FileHandler 와 같이 기본적인 핸들러는 제외한다.

TimedRotatingFileHandler

  • 시간의 흐름에 따라 자동으로 파일을 교체(로테이션)하는 핸들러
  • 기본적으로 파일에 로그를 기록하는 파일 핸들러이며
  • 조건에 따라 로그를 기록하는 파일을 바꾸는 RotateHandler 이다.
  • 기본적으로 지정된 로그파일에 로그를 기록하며, 일정 시간이 지나면 과거 로그를 별도 로그 파일로 옮긴다.
  • 오래된 파일을 지워주기도 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import logging
from logging.handlers import TimedRotatingFileHandler
import time
from typing import Literal

LOG_LEVEL_TYPE = Literal["DEBUG", "INFO", "WARNING", "ERROR"]
LOG_WHEN = Literal["S", "M", "H", "D", "midnight", "W{0}", "W{1}", "W{2}", "W{3}", "W{4}", "W{5}", "W{6}"]

def timed_rotating_logging():
    
    # timed rotating file handler
    # 위치 : logging.handlers.TimedRotatingFileHandler
    # 로그를 특정 시간 간격이나 날짜 변화에 따라 자동으로 새 파일로 전환(롤오버)해준다.
    
    logger_name = "timed_rotating_file_handler_logger"
    logger = logging.getLogger(logger_name)
    
    handler = TimedRotatingFileHandler(
        filename = "logs/timed_rotating",   # 파일이름, 이름 뒤에 날짜가 붙게 된다.
        when = "S",                         # 롤오버가 발생하는 주기 (midnight, h, d s ..)
        interval = 10,                      # when 주기의 간격 10 + when(s) = 10초마다
        backupCount = 10,                   # 보관할 백업 파일의 최대 개수 (e.g.최대 10개만 보관)
        encoding = "utf-8",                 # 파일 인코딩
        delay = True,                       # 핸들러가 실제로 로그를 기록하기 전까지 파일 열기를 지연 (첫 로그 발생 시 파일 생성)
        utc = False,                        # 현지 시간으로 계산할지, UTC로 계산할지 (True / False)
        atTime = None,                      # when='midnight' 또는 when='d'일 때, 정확히 몇 시에 롤오버를 수행할지 지정.
        errors = "이건 뭐지"                  # 파일 인코딩/디코딩 오류 발생 시 오류 처리 방식을 지정 (string)
    )
    
    formatter = logging.Formatter(
        fmt = "%(asctime)s %(name)s %(message)s"
    )
    
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    
    for i in range(10):
        logger.warning(f"{i} :: 반복적인 메시지입니다.")
        time.sleep(3)
  • 로그 폴더에는 아래와 같이 파일이 생겼다.
  • timed_rotating 파일에 가장 최근의 로그가 쌓인다.
1
2
3
4
ls -al rotating_logs
>> rw-r--r--@  1 user  ... Nov  4 00:59 timed_rotating
>> -rw-r--r--@  1 user  ... Nov  4 00:59 timed_rotating.2025-11-04_00-59-23
>> -rw-r--r--@  1 user  ... Nov  4 00:59 timed_rotating.2025-11-04_00-59-35

Reference

https://docs.python.org/3/library/logging.html
https://docs.python.org/ko/3/howto/logging.html

Comments