본문 바로가기

IT/개발

파이썬으로 날자별로 생성되는 로그 파일 만들기(logging 모듈)

반응형

파이썬에서 print 출력을 날짜별로 분리된 파일로 로깅하기 위해서는 로깅(logging) 모듈을 사용하면 됩니다.

로깅 모듈을 사용하면 메시지를 다양한 수준(level)에서 기록할 수 있습니다.

 

1. 날짜별로 로그 파일을 분리하여 저장하는 방법

 

TimedRotatingFileHandler를 이용하여 로깅하는 방법도 있지만 여기서는 간단하게

파일명에 날자를 포함하여 저장하는 방법을 사용해서 만들어 보겠습니다.

 

예를 들어, 2024314일에 실행하면 app_2024-03-14.log 파일에 로그가 기록됩니다.

또 다음 날 실행하면 새로운 날짜로 명명된 파일에 로그가 기록되고 기존 파일은 그대로 유지됩니다.

 

이 방법은 로그 파일이 날짜별로 무한정 생성되기 때문에 주기적인 관리가 필요합니다.

 

import logging
import os
from datetime import datetime

# 현재 날짜를 포함한 로그 파일 이름 생성
current_date = datetime.now().strftime("%Y-%m-%d")
log_file_name = f"app_{current_date}.log"  # 예: app_2024-03-14.log
log_file_path = os.path.join("logs", log_file_name)

# 로그 디렉터리 생성 (디렉터리가 존재하지 않는 경우)
os.makedirs(os.path.dirname(log_file_path), exist_ok=True)

# 로거 설정
logger = logging.getLogger("MyLogger")
logger.setLevel(logging.INFO)

# FileHandler 설정
file_handler = logging.FileHandler(log_file_path)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

logger.addHandler(file_handler)

# 사용 예
logger.info("프로그램 시작")
logger.info("프로그램 진행중")
logger.error("에러 발생")

 

이렇게 하면 하위 logs 폴더 아래에 오늘 날자로 파일이 생성되고 로그가 쌓이게 됩니다.

 

2. 콘솔과 파일에 동시에 출력하기

 

메시지를 콘솔과 파일에 동시에 출력하는 것도 가능합니다.

 

메시지를 콘솔과 파일에 동시에 출력하려면, 파이썬의 logging 모듈을 사용하여 로거(logger)에 콘솔 핸들러(ConsoleHandler)와 파일 핸들러(FileHandler)를 모두 추가해야 합니다

 

import logging
import os
from datetime import datetime

# 로거 설정
logger = logging.getLogger('MyAppLogger')
logger.setLevel(logging.DEBUG)  # DEBUG 레벨 이상의 모든 메시지 기록

# 콘솔 핸들러 설정
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)  # INFO 레벨 이상의 메시지를 콘솔에 출력

# 파일 핸들러 설정
log_file_name = f"app_{datetime.now().strftime('%Y-%m-%d')}.log"
log_file_path = os.path.join("logs", log_file_name)
os.makedirs(os.path.dirname(log_file_path), exist_ok=True)  # 로그 디렉터리 생성
file_handler = logging.FileHandler(log_file_path)
file_handler.setLevel(logging.DEBUG)  # DEBUG 레벨 이상의 메시지를 파일에 기록

# 로그 메시지 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 핸들러를 로거에 추가
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 로그 메시지 테스트
logger.debug("디버그 메시지")
logger.info("정보 메시지")
logger.warning("경고 메시지")
logger.error("에러 메시지")
logger.critical("크리티컬 메시지")

 

이런식으로 콘솔과 파일에 동시에 출력을 확인 할 수 있습니다. 

반응형