본문 바로가기
코딩취미/Python

파이썬으로 실무형 로그 시스템 구축하기 – 로그 레벨 분리 + 자동 파일 분할까지

by 브링블링 2025. 4. 7.
반응형

파이썬으로 실무형 로그 시스템 구축하기 – 로그 레벨 분리 + 자동 파일 분할까지

파이썬으로 개발을 하다 보면 로그는 어느 순간부터 없어선 안 되는 필수 요소가 됩니다.
처음에는 print() 함수로도 충분하다고 생각하지만, 시간이 지날수록 로그를 다음처럼 관리하고 싶어지죠:

  • 로그를 INFO, ERROR, DEBUG처럼 레벨별로 나누고 싶다
  • 너무 큰 로그 파일은 자동으로 새 파일로 분할하고 싶다
  • 콘솔에도 출력되면서, 파일로도 저장되길 바란다
  • 전체 구조는 깔끔하고 재사용 가능했으면 좋겠다

이 글에서는 위 요구사항을 만족하는 파이썬 표준 로그 시스템을 직접 구현해보겠습니다.
추가 라이브러리 설치 없이 logging 모듈만으로 구현하며, 실제 서비스 환경에서도 충분히 쓸 수 있는 형태입니다.

 

✅ 목표 기능 요약

  1. 로그 레벨별로 다른 파일에 저장
  2. 각 로그 파일은 일정 크기를 넘으면 자동 분할
  3. 콘솔과 파일에 동시에 출력
  4. 모듈화해서 프로젝트 어디서든 쉽게 사용 가능

🛠️ 로그 유틸리티 구현하기 (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 프로젝트에서 활용 가능합니다.

반응형