backtrader/logger_manager.py

75 lines
2.5 KiB
Python
Raw Permalink Normal View History

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()