핸들러의 종류
| 종류 | 설명 | 선언된 파일 | 
|---|---|---|
| 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