core.logger 源代码

"""
日志管理模块
提供统一的日志记录功能
"""
import logging
import sys
from pathlib import Path
from typing import Optional


[文档] class ColoredFormatter(logging.Formatter): """彩色日志格式化器""" # ANSI 颜色代码 COLORS = { 'DEBUG': '\033[36m', # 青色 'INFO': '\033[32m', # 绿色 'WARNING': '\033[33m', # 黄色 'ERROR': '\033[31m', # 红色 'CRITICAL': '\033[35m', # 紫色 } RESET = '\033[0m' BOLD = '\033[1m'
[文档] def format(self, record): # 获取日志级别对应的颜色 levelname = record.levelname color = self.COLORS.get(levelname, self.RESET) # 给日志级别添加颜色和加粗 record.levelname = f"{self.BOLD}{color}{levelname}{self.RESET}" # 格式化消息 return super().format(record)
[文档] class ScenarioToolLogger: """统一的日志管理器(单例模式)""" _instance: Optional[logging.Logger] = None
[文档] @classmethod def get_logger(cls, name: str = "scenario_tool") -> logging.Logger: """ 获取日志实例(单例模式) Args: name: 日志器名称 Returns: logging.Logger: 日志器实例 """ if cls._instance is None: cls._instance = cls._setup_logger(name) return cls._instance
@classmethod def _setup_logger(cls, name: str) -> logging.Logger: """ 配置日志器 Args: name: 日志器名称 Returns: logging.Logger: 配置好的日志器 """ logger = logging.getLogger(name) logger.setLevel(logging.DEBUG) # 避免重复添加处理器 if logger.handlers: return logger # 控制台处理器(彩色输出) console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) console_formatter = ColoredFormatter( '%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) console_handler.setFormatter(console_formatter) # 文件处理器(使用轮转,最大 10MB,保留 5 个备份) log_dir = Path("logs") log_dir.mkdir(exist_ok=True) from logging.handlers import RotatingFileHandler file_handler = RotatingFileHandler( log_dir / "scenario_tool.log", maxBytes=10*1024*1024, # 10MB backupCount=5, encoding='utf-8' ) file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s' ) file_handler.setFormatter(file_formatter) logger.addHandler(console_handler) logger.addHandler(file_handler) return logger
[文档] @classmethod def reset(cls): """重置日志器(主要用于测试)""" if cls._instance: for handler in cls._instance.handlers[:]: handler.close() cls._instance.removeHandler(handler) cls._instance = None
# 便捷函数
[文档] def get_logger(name: str = "scenario_tool") -> logging.Logger: """获取日志器的便捷函数""" return ScenarioToolLogger.get_logger(name)