반응형
파이썬으로 실무형 로그 시스템 구축하기 – 로그 레벨 분리 + 자동 파일 분할까지
파이썬으로 개발을 하다 보면 로그는 어느 순간부터 없어선 안 되는 필수 요소가 됩니다.
처음에는 print() 함수로도 충분하다고 생각하지만, 시간이 지날수록 로그를 다음처럼 관리하고 싶어지죠:
- 로그를 INFO, ERROR, DEBUG처럼 레벨별로 나누고 싶다
- 너무 큰 로그 파일은 자동으로 새 파일로 분할하고 싶다
- 콘솔에도 출력되면서, 파일로도 저장되길 바란다
- 전체 구조는 깔끔하고 재사용 가능했으면 좋겠다
이 글에서는 위 요구사항을 만족하는 파이썬 표준 로그 시스템을 직접 구현해보겠습니다.
추가 라이브러리 설치 없이 logging 모듈만으로 구현하며, 실제 서비스 환경에서도 충분히 쓸 수 있는 형태입니다.
✅ 목표 기능 요약
- 로그 레벨별로 다른 파일에 저장
- 각 로그 파일은 일정 크기를 넘으면 자동 분할
- 콘솔과 파일에 동시에 출력
- 모듈화해서 프로젝트 어디서든 쉽게 사용 가능
🛠️ 로그 유틸리티 구현하기 (log_utils.py)
우선 로그 시스템을 유틸리티 모듈로 분리하여 구성합니다. 각 로그 레벨별로 로거를 따로 생성하고, 해당 레벨의 로그만 해당 파일에 기록되도록 설정합니다.
import logging
import os
from logging.handlers import RotatingFileHandler
def get_level_name(level):
return logging.getLevelName(level).lower()
def setup_level_logger(level, log_dir="logs", max_bytes=1 * 1024 * 1024, backup_count=5):
"""
지정된 로그 레벨의 로그만 기록하는 로거를 생성
"""
os.makedirs(log_dir, exist_ok=True)
level_name = get_level_name(level)
logger = logging.getLogger(level_name)
logger.setLevel(level)
log_file = os.path.join(log_dir, f"{level_name}_log.txt")
# 이미 설정된 로거는 재사용
if logger.hasHandlers():
return logger
# 핸들러 생성
handler = RotatingFileHandler(
log_file, maxBytes=max_bytes, backupCount=backup_count, encoding='utf-8'
)
# 로그 필터: 해당 레벨만 기록
class LevelFilter(logging.Filter):
def filter(self, record):
return record.levelno == level
handler.addFilter(LevelFilter())
formatter = logging.Formatter("[%(asctime)s] [%(levelname)s] %(message)s")
handler.setFormatter(formatter)
handler.setLevel(level)
# 콘솔 핸들러도 설정
console = logging.StreamHandler()
console.setFormatter(formatter)
console.setLevel(level)
console.addFilter(LevelFilter())
logger.addHandler(handler)
logger.addHandler(console)
return logger
🔍 핵심 포인트
- LevelFilter 클래스를 통해 로거마다 지정된 로그 레벨만 기록하도록 설정합니다.
- RotatingFileHandler는 파일 크기 초과 시 자동으로 .1, .2 등 백업 파일을 생성합니다.
- 로그 디렉터리는 자동 생성되며, 로그 파일은 레벨별로 분리됩니다.
반응형
🧪 사용 예시 (main.py)
from log_utils import setup_level_logger
import logging
# 레벨별 로거 생성
info_logger = setup_level_logger(logging.INFO)
error_logger = setup_level_logger(logging.ERROR)
debug_logger = setup_level_logger(logging.DEBUG)
# 로그 기록
info_logger.info("시스템이 정상적으로 시작되었습니다.")
debug_logger.debug("디버그: config 변수 값 확인 완료")
error_logger.error("에러 발생: DB 연결 실패")
# 로그 다량 기록 (파일 분할 테스트)
for i in range(5000):
info_logger.info(f"진행 중... {i}/5000")
📁 결과 파일 구조
코드를 실행하면 다음과 같은 로그 파일이 생성됩니다:
logs/
├── info_log.txt
├── debug_log.txt
├── error_log.txt
파일이 1MB를 초과하면 자동으로 아래처럼 백업됩니다:
logs/
├── info_log.txt
├── info_log.txt.1
├── info_log.txt.2
💡 유용한 팁
- 로그 레벨을 CRITICAL, WARNING으로 확장해도 동일하게 설정 가능
- 날짜 기준으로 로그 파일을 분리하고 싶다면 TimedRotatingFileHandler를 사용
- JSON 포맷이나 CSV 형식으로도 로그 저장 가능
- 멀티프로세싱 환경에서는 QueueHandler 사용 고려
✅ 마무리
logging 모듈은 기본 기능만 잘 써도 실무에서 충분히 쓸 수 있는 강력한 로그 시스템을 만들 수 있습니다.
레벨별 파일 분리와 자동 파일 분할은 개발자와 운영자 모두에게 큰 도움이 됩니다.
지금 소개한 방식은 API 서버, 크롤러, 백엔드 시스템, 배치 작업 등 거의 모든 Python 프로젝트에서 활용 가능합니다.
반응형
'코딩취미 > Python' 카테고리의 다른 글
PySide6 프로그램 종료 시 반드시 호출되는 함수는 있을까? (0) | 2025.04.21 |
---|---|
파이썬 Enum 클래스 완벽 정리 – 왜, 어떻게 써야 할까? (0) | 2025.04.10 |
PySide6와 pprint: 순환 참조와 재귀 에러 문제 해결하기 (0) | 2025.03.22 |
PySide6에서 QTableWidget UI 커스터마이징: 컬럼 숨기기, 셀 색상 변경, 팝업 기능 추가 (0) | 2025.03.21 |
PySide6에서 QTableWidget 헤더 및 테이블 스타일 설정하기 (0) | 2025.03.20 |