""" 日志工具模块 提供统一的日志记录功能 """ import logging import sys from logging.handlers import RotatingFileHandler from pathlib import Path from typing import Optional from config import Config class ColoredFormatter(logging.Formatter): """带颜色的日志格式化器(用于控制台输出)""" # ANSI颜色代码 COLORS = { 'DEBUG': '\033[36m', # 青色 'INFO': '\033[32m', # 绿色 'WARNING': '\033[33m', # 黄色 'ERROR': '\033[31m', # 红色 'CRITICAL': '\033[35m', # 紫色 'RESET': '\033[0m' # 重置 } def format(self, record): """格式化日志记录""" log_color = self.COLORS.get(record.levelname, self.COLORS['RESET']) record.levelname = f"{log_color}{record.levelname}{self.COLORS['RESET']}" return super().format(record) def setup_logger( name: str, level: Optional[str] = None, log_file: Optional[Path] = None ) -> logging.Logger: """ 设置日志记录器 Args: name: 日志记录器名称 level: 日志级别 log_file: 日志文件路径 Returns: 配置好的日志记录器 """ logger = logging.getLogger(name) # 避免重复添加处理器 if logger.handlers: return logger # 设置日志级别 log_level = getattr(logging, level or Config.LOG_LEVEL) logger.setLevel(log_level) # 控制台处理器 console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(log_level) console_formatter = ColoredFormatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) console_handler.setFormatter(console_formatter) logger.addHandler(console_handler) # 文件处理器 if log_file or Config.LOG_FILE: file_path = log_file or Config.LOG_FILE file_path.parent.mkdir(parents=True, exist_ok=True) file_handler = RotatingFileHandler( file_path, maxBytes=Config.LOG_MAX_BYTES, backupCount=Config.LOG_BACKUP_COUNT, encoding='utf-8' ) file_handler.setLevel(log_level) file_formatter = logging.Formatter( Config.LOG_FORMAT, datefmt='%Y-%m-%d %H:%M:%S' ) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) return logger def get_logger(name: str) -> logging.Logger: """ 获取日志记录器 Args: name: 日志记录器名称 Returns: 日志记录器实例 """ return setup_logger(name)