""" 日志管理类 日志输出到运行目录指定文件夹 日志文件按照:YYYY-MM-dd.log 格式输出 """ import logging import sys import os from datetime import datetime class LogHelper: # 内部日志级别映射表 _LEVEL_MAP = { 'DEBUG': 10, 'INFO': 20, 'WARNING': 30, 'ERROR': 40, 'CRITICAL': 50 } def __init__(self, level='INFO', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=None, log_dir="logs", logger_name=None): """ 初始化日志配置 :param level: 日志级别,默认为 logging.INFO :param format: 日志格式字符串 :param handlers: 日志处理器列表,默认为空(会自动添加控制台处理器) :param log_dir: 日志存储目录,默认为"logs" """ self.level = self._LEVEL_MAP.get(level.upper(), 20) # 默认INFO self.format = format self.handlers = handlers if handlers is not None else [] self.log_dir = log_dir self.logger_name = logger_name # 确保日志目录存在 os.makedirs(self.log_dir, exist_ok=True) 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) return self # 支持链式调用 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) file_handler.setFormatter(logging.Formatter(self.format)) self.handlers.append(file_handler) return self # 支持链式调用 def setup(self): """应用日志配置(自动添加日期文件处理器)""" # 如果未提供任何处理器,默认添加控制台和日期文件处理器 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