""" Logging Configuration 日志配置 """ import logging import sys from typing import Any from logging.handlers import RotatingFileHandler from pathlib import Path from app.core.config import get_settings settings = get_settings() # Log directory LOG_DIR = Path("./logs") LOG_DIR.mkdir(exist_ok=True) def setup_logging(name: str = "yg_dataset") -> logging.Logger: """Setup application logging""" logger = logging.getLogger(name) logger.setLevel(logging.DEBUG if settings.DEBUG else logging.INFO) # Avoid duplicate handlers if logger.handlers: return logger # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.DEBUG if settings.DEBUG else logging.INFO) console_formatter = logging.Formatter( fmt="%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)d | %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) # File handler file_handler = RotatingFileHandler( LOG_DIR / f"{name}.log", maxBytes=10 * 1024 * 1024, # 10MB backupCount=5, encoding="utf-8" ) file_handler.setLevel(logging.INFO) file_formatter = logging.Formatter( fmt="%(asctime)s | %(levelname)-8s | %(name)s:%(funcName)s:%(lineno)d | %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) return logger # Create default logger logger = setup_logging() class LoggerMixin: """Mixin to add logging capability to classes""" @property def log(self) -> logging.Logger: """Get logger for this class""" return logging.getLogger(self.__class__.__module__ + "." + self.__class__.__name__)