77 lines
2.5 KiB
Python
77 lines
2.5 KiB
Python
import logging
|
|
import os
|
|
from datetime import datetime
|
|
from utils import load_config
|
|
|
|
|
|
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 = load_config()
|
|
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', {}).get('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', {}).get('store', False):
|
|
log_dir = self.config.get('log', {}).get('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() |