logging을 사용하여 레벨별로 다른 파일에 로그를 저장하는 예제

logging을 사용하여 레벨별로 다른 파일에 로그를 저장하는 예제입니다. 데이터를 편하게 저장할 방법을 고민해보다가 찾은 방법입니다. INFO 레벨로 출력한 데이터만 따로 저장할 수 있습니다. 



2024. 5. 20  최초작성



실행해보면 log.txt와 화면에는 모든 로그가 출력됩니다.

 

2024-06-20 20:31:43,663 - DEBUG - This is a debug message

2024-06-20 20:31:43,663 - INFO - This is an info message

2024-06-20 20:31:43,664 - WARNING - This is a warning message

2024-06-20 20:31:43,664 - ERROR - This is an error message

2024-06-20 20:31:43,664 - CRITICAL - This is a critical message



현재날짜/시간이 이름에 포함된 csv 파일에는 INFO 로그에 출력한 원래 문자열만 출력됩니다. 이것을 데이터를 기록하는데 사용했습니다.

 

This is an info message



한번 더 실행해보면 log.txt에는 로그가 누적되지만 csv 파일은 현재날짜/시간 이름이 포함된 새로운 파일이 생성됩니다. 

 

import logging
from datetime import datetime


# 현재 시간을 문자열로 변환합니다.
current_time_str = datetime.now().strftime('%Y%m%d_%H%M%S')


# 로거 생성합니다.
logger = logging.getLogger('data_logger')
logger.setLevel(logging.DEBUG)  # 모든 메시지를 처리하도록 로거의 기본 레벨을 DEBUG로 설정합니다.


# INFO레벨만 출력하기위한 필터 클래스를 정의합니다.
class InfoFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.INFO


# INFO 레벨의 로그를 파일에 출력할 핸들러를 생성합니다. 파일 이름에 현재날짜/시간을 포함시킵니다.
data_handler = logging.FileHandler('data_' + current_time_str + '.csv')
data_handler.setLevel(logging.INFO)
data_handler.addFilter(InfoFilter())

# 모든 레벨의 로그를 파일에 출력할 핸들러를 생성합니다. 파일 이름은 log.txt로 고정합니다.
log_handler = logging.FileHandler('log.txt')
log_handler.setLevel(logging.DEBUG) 

# 화면에 모든 레벨의 로그를 출력할 핸들러를 생성합니다.
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 로그 매세지를 보여줄 포맷터를 생성합니다.
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# 핸들러에 포맷터를 설정합니다.
# data_handler.setFormatter(formatter) # data_handler는 포맷터를 지정하지 않고 원래 데이터를 그대로 보여줍니다.
log_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# 로거에 3개의 핸들러를 추가합니다.
logger.addHandler(data_handler)   # INFO 레벨의 로그를 파일에 기록
logger.addHandler(log_handler)      # 모든 레벨의 로그를 파일에 기록  
logger.addHandler(console_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')


시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.

블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.



영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com


제가 쓴 책도 한번 검토해보세요 ^^