# -*- coding:utf-8 -*- # 日志管理模块 import os import logging from typing import Optional from datetime import datetime class LoggerManager: """日志管理类,用于配置和创建日志器""" @staticmethod def setup_logger(name: str, log_file: Optional[str] = None, level: int = logging.INFO, format_str: str = '%(asctime)s - %(name)s - %(levelname)s - %(message)s', console_output: bool = True) -> logging.Logger: """ 设置并返回一个日志器 Args: name: 日志器名称 log_file: 日志文件路径,None表示不输出到文件 level: 日志级别 format_str: 日志格式 console_output: 是否输出到控制台 Returns: 配置好的日志器 """ # 创建日志器 logger = logging.getLogger(name) logger.setLevel(level) # 创建格式化器 formatter = logging.Formatter(format_str) # 如果指定了日志文件 if log_file: # 确保日志目录存在 log_dir = os.path.dirname(log_file) if log_dir and not os.path.exists(log_dir): os.makedirs(log_dir) # 创建文件处理器 file_handler = logging.FileHandler(log_file) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # 如果需要输出到控制台 if console_output: # 创建控制台处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) return logger @staticmethod def get_timestamped_log_path(base_dir: str, prefix: str, ext: str = '.log') -> str: """ 生成带时间戳的日志文件路径 Args: base_dir: 基础目录 prefix: 文件名前缀 ext: 文件扩展名 Returns: 完整的日志文件路径 """ # 确保基础目录存在 if not os.path.exists(base_dir): os.makedirs(base_dir) # 生成时间戳 timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') # 构建文件名 filename = f"{prefix}_{timestamp}{ext}" return os.path.join(base_dir, filename) # 创建一个全局日志器 def get_logger(name: str = 'repo_test', log_file: Optional[str] = None, level: int = logging.INFO) -> logging.Logger: """ 获取全局日志器 Args: name: 日志器名称 log_file: 日志文件路径 level: 日志级别 Returns: 日志器 """ return LoggerManager.setup_logger(name, log_file, level) # 默认日志器 default_logger = get_logger()