import logging import os from datetime import datetime from config_manager import get_config_manager class Logger: """日志管理类,负责创建和配置日志器""" _instance = None @classmethod def get_logger(cls): """获取日志器单例""" if cls._instance is None: cls._instance = Logger() return cls._instance.logger def __init__(self): """初始化日志器配置""" self.config = get_config_manager() self.logger = logging.getLogger('finance_data') # 设置根日志级别为 DEBUG (最低级别),确保捕获所有级别的日志 self.logger.setLevel(logging.DEBUG) # 清除已有的处理器 if self.logger.handlers: self.logger.handlers.clear() # 控制台处理器 - 使用配置文件中的级别 console_handler = logging.StreamHandler() # 设置日志级别 log_level = self.config.get('log.level', 'INFO').upper() level_mapping = { 'DEBUG': logging.DEBUG, 'INFO': logging.INFO, 'WARNING': logging.WARNING, 'ERROR': logging.ERROR, 'CRITICAL': logging.CRITICAL } console_handler.setLevel(level_mapping.get(log_level, logging.INFO)) console_handler.setFormatter(logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )) self.logger.addHandler(console_handler) # 文件处理器 - 总是保存所有级别的日志 if self.config.get('log.store', False): log_dir = self.config.get('log.path', 'logs') os.makedirs(log_dir, exist_ok=True) # 使用当天日期作为文件名 today = datetime.now().strftime('%Y_%m_%d') log_file = os.path.join(log_dir, f'{today}.log') file_handler = logging.FileHandler( log_file, encoding='utf-8', mode='a' # 使用追加模式 ) # 文件处理器始终设置为 DEBUG 级别,保存所有日志 file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(logging.Formatter( '%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' )) self.logger.addHandler(file_handler) # 提供全局访问点 def get_logger(): """获取日志器实例""" return Logger.get_logger()