Files
MADataManagment/LogHelper.py

90 lines
3.1 KiB
Python
Raw Permalink Normal View History

2025-08-20 17:30:14 +08:00
"""
日志管理类
日志输出到运行目录指定文件夹
日志文件按照YYYY-MM-dd.log 格式输出
"""
2025-08-18 14:05:59 +08:00
import logging
import sys
2025-08-20 17:30:14 +08:00
import os
from datetime import datetime
2025-08-18 14:05:59 +08:00
class LogHelper:
2025-08-20 17:30:14 +08:00
# 内部日志级别映射表
_LEVEL_MAP = {
'DEBUG': 10,
'INFO': 20,
'WARNING': 30,
'ERROR': 40,
'CRITICAL': 50
}
2025-08-18 14:05:59 +08:00
def __init__(self,
2025-08-20 17:30:14 +08:00
level='INFO',
2025-08-18 14:05:59 +08:00
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
2025-08-20 17:30:14 +08:00
handlers=None,
log_dir="logs",
logger_name=None):
2025-08-18 14:05:59 +08:00
"""
初始化日志配置
:param level: 日志级别默认为 logging.INFO
:param format: 日志格式字符串
:param handlers: 日志处理器列表默认为空会自动添加控制台处理器
2025-08-20 17:30:14 +08:00
:param log_dir: 日志存储目录默认为"logs"
2025-08-18 14:05:59 +08:00
"""
2025-08-20 17:30:14 +08:00
self.level = self._LEVEL_MAP.get(level.upper(), 20) # 默认INFO
2025-08-18 14:05:59 +08:00
self.format = format
self.handlers = handlers if handlers is not None else []
2025-08-20 17:30:14 +08:00
self.log_dir = log_dir
self.logger_name = logger_name
# 确保日志目录存在
os.makedirs(self.log_dir, exist_ok=True)
2025-08-18 14:05:59 +08:00
def add_console_handler(self, stream=sys.stdout, encoding='utf-8'):
"""添加控制台处理器"""
console_handler = logging.StreamHandler(stream)
console_handler.setFormatter(logging.Formatter(self.format))
if encoding:
console_handler.encoding = encoding
self.handlers.append(console_handler)
2025-08-20 17:30:14 +08:00
return self # 支持链式调用
2025-08-18 14:05:59 +08:00
2025-08-20 17:30:14 +08:00
def _get_daily_log_path(self):
"""生成基于当前日期的日志文件路径"""
today = datetime.now().strftime("%Y-%m-%d")
filename = f"{today}.log"
return os.path.join(self.log_dir, filename)
def _add_daily_file_handler(self, encoding='utf-8'):
"""添加按日期自动创建的文件处理器"""
log_path = self._get_daily_log_path()
file_handler = logging.FileHandler(log_path, encoding=encoding)
2025-08-18 14:05:59 +08:00
file_handler.setFormatter(logging.Formatter(self.format))
self.handlers.append(file_handler)
2025-08-20 17:30:14 +08:00
return self # 支持链式调用
2025-08-18 14:05:59 +08:00
def setup(self):
2025-08-20 17:30:14 +08:00
"""应用日志配置(自动添加日期文件处理器)"""
# 如果未提供任何处理器,默认添加控制台和日期文件处理器
if not self.handlers:
self.add_console_handler()
self._add_daily_file_handler()
# 获取或创建logger
logger = logging.getLogger(self.logger_name)
logger.setLevel(self.level)
# 移除所有现有处理器(避免重复添加)
for handler in logger.handlers[:]:
logger.removeHandler(handler)
# 添加配置的处理器
for handler in self.handlers:
logger.addHandler(handler)
# 确保日志消息不会传递给父logger避免重复记录
logger.propagate = False
return logger