Python/Python 예제 코드
logging을 사용하여 레벨별로 다른 파일에 로그를 저장하는 예제
webnautes
2024. 6. 20. 20:35
반응형
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') |
반응형