import logging import sys import os from datetime import datetime, timedelta LOG_DIR = "./logs" # 日志文件目录 LOG_RETENTION_DAYS = 7 # 日志保留天数 def _remove_old_logs(log_dir, retention_days): """删除超过保留天数的日志文件""" if not os.path.exists(log_dir): os.makedirs(log_dir) now = datetime.now() for filename in os.listdir(log_dir): file_path = os.path.join(log_dir, filename) if os.path.isfile(file_path) and filename.startswith("run_") and filename.endswith(".log"): # 提取文件日期 try: log_date_str = filename[4:14] log_date = datetime.strptime(log_date_str, "%Y-%m-%d") if now - log_date > timedelta(days=retention_days): os.remove(file_path) print(f"删除旧日志: {filename}") except ValueError: continue def _reset_logger(log): """重置日志配置,移除旧的 Handler 并添加新的 Handler""" for handler in log.handlers: handler.close() log.removeHandler(handler) del handler log.handlers.clear() log.propagate = False # 控制台输出的日志处理器 console_handle = logging.StreamHandler(sys.stdout) console_handle.setFormatter( logging.Formatter( "[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d] - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) ) # 生成带有当前日期的日志文件路径 date_str = datetime.now().strftime("%Y-%m-%d") log_file_path = os.path.join(LOG_DIR, f"run_{date_str}.log") # 文件日志处理器 file_handle = logging.FileHandler(log_file_path, encoding="utf-8") file_handle.setFormatter( logging.Formatter( "[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d] - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) ) # 将处理器添加到日志 log.addHandler(file_handle) log.addHandler(console_handle) # 删除旧的日志文件 _remove_old_logs(LOG_DIR, LOG_RETENTION_DAYS) def setup_logging(): """设置日志配置""" log = logging.getLogger("log") _reset_logger(log) log.setLevel(logging.INFO) # 日志级别 return log def setup_logging(): """设置日志配置""" log = logging.getLogger() # 获取 Flask 默认的日志记录器 _reset_logger(log) log.setLevel(logging.INFO) # 设置日志级别为 INFO return log # 创建日志实例 logger = setup_logging() def log_exception(sender, exception, **extra): """记录异常日志""" sender.logger.debug('处理过程发生异常: %s', exception)