import sys from pathlib import Path from loguru import logger as _logger from ..config import config class Logger: """单例日志类""" _instance = None _logger_id = None # 用于存储logger id以便重新配置 def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance._initialized = False cls._instance._logger = _logger cls._instance._setup() return cls._instance def _remove_existing_handlers(self): """移除现有的日志处理器""" if self._logger_id is not None: self._logger.remove(self._logger_id) self._logger_id = None def _setup(self): """私有方法:初始化日志配置""" try: # 移除所有默认处理器 self._logger.remove() self._remove_existing_handlers() # 创建日志目录 log_dir = Path(config.logging.path) log_dir.mkdir(parents=True, exist_ok=True) log_file = log_dir / config.logging.file # 配置日志 self._logger_id = self._logger.add( log_file.with_stem(f"{log_file.stem}_{{time:YYYY-MM-DD}}"), rotation="1 day", # 每天滚动日志 retention=f"{config.logging.retention_days} days", level=config.logging.level, format=config.logging.format, encoding="utf-8", enqueue=True, # 线程安全 compression="zip" # 压缩旧日志 ) # 使用用户配置的控制台输出 if config.logging.console_format: self._logger.add(sys.stdout, level=config.logging.level, format=config.logging.console_format) except Exception as e: self._logger.error(f"日志配置初始化失败: {str(e)}") raise # 创建全局单例实例 logger = Logger()._logger