""" 统一的日志配置工具 用于在整个项目中统一管理日志配置,避免重复日志输出 """ import logging from typing import Optional def setup_logger( name: str, level: int = logging.INFO, propagate: bool = False, formatter_string: Optional[str] = None ) -> logging.Logger: """ 设置并配置logger,避免重复日志输出 @param name: logger名称,通常使用 __name__ @param level: 日志级别,默认为 INFO @param propagate: 是否向父级logger传播,默认为False,避免重复输出 @param formatter_string: 自定义格式字符串,如果不提供则使用默认格式 @return: 配置好的logger对象 """ logger = logging.getLogger(name) # 避免重复添加处理器导致重复日志 if not logger.handlers: logger.setLevel(level) # 创建控制台处理器 handler = logging.StreamHandler() # 设置日志格式 if formatter_string is None: formatter_string = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' formatter = logging.Formatter(formatter_string) handler.setFormatter(formatter) # 添加处理器 logger.addHandler(handler) # 控制日志传播 logger.propagate = propagate return logger def get_api_logger(module_name: str) -> logging.Logger: """ 为API模块获取标准logger配置 @param module_name: 模块名称,通常使用 __name__ @return: 配置好的logger对象 """ return setup_logger( name=module_name, level=logging.INFO, propagate=False # API层不传播到父级,避免与uvicorn日志冲突 ) def get_service_logger(module_name: str) -> logging.Logger: """ 为Service模块获取标准logger配置 @param module_name: 模块名称,通常使用 __name__ @return: 配置好的logger对象 """ return setup_logger( name=module_name, level=logging.INFO, propagate=False # Service层不传播到父级,保持独立 ) def get_utils_logger(module_name: str) -> logging.Logger: """ 为工具模块获取标准logger配置 @param module_name: 模块名称,通常使用 __name__ @return: 配置好的logger对象 """ return setup_logger( name=module_name, level=logging.INFO, propagate=False # 工具层不传播到父级,保持独立 ) # 主应用日志配置函数 def configure_root_logging(level: int = logging.INFO) -> None: """ 配置根日志系统,只在应用启动时调用一次 @param level: 根日志级别 """ # 检查是否已经配置过,避免重复配置 if not logging.getLogger().handlers: logging.basicConfig( level=level, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' )