1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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
|