본문 바로가기

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

webnautes 2024. 6. 20.
반응형

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


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

댓글