2025-04-19 13:59:06 +08:00
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
from datetime import datetime
|
2025-04-19 14:22:18 +08:00
|
|
|
from config_manager import get_config_manager
|
2025-04-19 13:59:06 +08:00
|
|
|
|
|
|
|
|
|
|
|
class Logger:
|
|
|
|
"""日志管理类,负责创建和配置日志器"""
|
|
|
|
_instance = None
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def get_logger(cls):
|
|
|
|
"""获取日志器单例"""
|
|
|
|
if cls._instance is None:
|
|
|
|
cls._instance = Logger()
|
|
|
|
return cls._instance.logger
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
"""初始化日志器配置"""
|
2025-04-19 14:22:18 +08:00
|
|
|
self.config = get_config_manager()
|
2025-04-19 13:59:06 +08:00
|
|
|
self.logger = logging.getLogger('finance_data')
|
|
|
|
|
|
|
|
# 设置根日志级别为 DEBUG (最低级别),确保捕获所有级别的日志
|
|
|
|
self.logger.setLevel(logging.DEBUG)
|
|
|
|
|
|
|
|
# 清除已有的处理器
|
|
|
|
if self.logger.handlers:
|
|
|
|
self.logger.handlers.clear()
|
|
|
|
|
|
|
|
# 控制台处理器 - 使用配置文件中的级别
|
|
|
|
console_handler = logging.StreamHandler()
|
2025-04-19 14:22:18 +08:00
|
|
|
|
2025-04-19 13:59:06 +08:00
|
|
|
# 设置日志级别
|
2025-04-19 14:22:18 +08:00
|
|
|
log_level = self.config.get('log.level', 'INFO').upper()
|
2025-04-19 13:59:06 +08:00
|
|
|
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)
|
|
|
|
|
|
|
|
# 文件处理器 - 总是保存所有级别的日志
|
2025-04-19 14:22:18 +08:00
|
|
|
if self.config.get('log.store', False):
|
|
|
|
log_dir = self.config.get('log.path', 'logs')
|
2025-04-19 13:59:06 +08:00
|
|
|
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' # 使用追加模式
|
|
|
|
)
|
2025-04-19 14:22:18 +08:00
|
|
|
|
2025-04-19 13:59:06 +08:00
|
|
|
# 文件处理器始终设置为 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()
|