""" 로깅 유틸리티 모듈 중앙화된 로깅 설정 및 관리 """ import logging import os from logging.handlers import RotatingFileHandler from typing import Optional from ..config import get_settings settings = get_settings() def setup_logger( name: str, log_file: Optional[str] = None, level: str = None ) -> logging.Logger: """ 로거 설정 및 반환 Args: name: 로거 이름 log_file: 로그 파일 경로 (선택사항) level: 로그 레벨 (선택사항) Returns: 설정된 로거 인스턴스 """ logger = logging.getLogger(name) # 이미 핸들러가 설정된 경우 중복 방지 if logger.handlers: return logger # 로그 레벨 설정 log_level = level or settings.logging.level logger.setLevel(getattr(logging, log_level.upper())) # 포맷터 설정 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s' ) # 콘솔 핸들러 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) # 파일 핸들러 (선택사항) if log_file or settings.logging.file_path: file_path = log_file or settings.logging.file_path # 로그 디렉토리 생성 log_dir = os.path.dirname(file_path) if log_dir and not os.path.exists(log_dir): os.makedirs(log_dir, exist_ok=True) # 로테이팅 파일 핸들러 (10MB, 5개 파일 유지) file_handler = RotatingFileHandler( file_path, maxBytes=10*1024*1024, # 10MB backupCount=5, encoding='utf-8' ) file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger def get_logger(name: str) -> logging.Logger: """ 로거 인스턴스 반환 (간편 함수) Args: name: 로거 이름 Returns: 로거 인스턴스 """ return setup_logger(name) # 애플리케이션 전역 로거 app_logger = setup_logger("tk_mp_app", settings.logging.file_path)