No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

85 líneas
2.7KB

  1. import logging
  2. import sys
  3. import os
  4. from datetime import datetime, timedelta
  5. LOG_DIR = "./logs" # 日志文件目录
  6. LOG_RETENTION_DAYS = 7 # 日志保留天数
  7. def _remove_old_logs(log_dir, retention_days):
  8. """删除超过保留天数的日志文件"""
  9. if not os.path.exists(log_dir):
  10. os.makedirs(log_dir)
  11. now = datetime.now()
  12. for filename in os.listdir(log_dir):
  13. file_path = os.path.join(log_dir, filename)
  14. if os.path.isfile(file_path) and filename.startswith("run_") and filename.endswith(".log"):
  15. # 提取文件日期
  16. try:
  17. log_date_str = filename[4:14]
  18. log_date = datetime.strptime(log_date_str, "%Y-%m-%d")
  19. if now - log_date > timedelta(days=retention_days):
  20. os.remove(file_path)
  21. print(f"删除旧日志: {filename}")
  22. except ValueError:
  23. continue
  24. def _reset_logger(log):
  25. """重置日志配置,移除旧的 Handler 并添加新的 Handler"""
  26. for handler in log.handlers:
  27. handler.close()
  28. log.removeHandler(handler)
  29. del handler
  30. log.handlers.clear()
  31. log.propagate = False
  32. # 控制台输出的日志处理器
  33. console_handle = logging.StreamHandler(sys.stdout)
  34. console_handle.setFormatter(
  35. logging.Formatter(
  36. "[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d] - %(message)s",
  37. datefmt="%Y-%m-%d %H:%M:%S",
  38. )
  39. )
  40. # 生成带有当前日期的日志文件路径
  41. date_str = datetime.now().strftime("%Y-%m-%d")
  42. log_file_path = os.path.join(LOG_DIR, f"run_{date_str}.log")
  43. # 文件日志处理器
  44. file_handle = logging.FileHandler(log_file_path, encoding="utf-8")
  45. file_handle.setFormatter(
  46. logging.Formatter(
  47. "[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d] - %(message)s",
  48. datefmt="%Y-%m-%d %H:%M:%S",
  49. )
  50. )
  51. # 将处理器添加到日志
  52. log.addHandler(file_handle)
  53. log.addHandler(console_handle)
  54. # 删除旧的日志文件
  55. _remove_old_logs(LOG_DIR, LOG_RETENTION_DAYS)
  56. def setup_logging():
  57. """设置日志配置"""
  58. log = logging.getLogger("log")
  59. _reset_logger(log)
  60. log.setLevel(logging.INFO) # 日志级别
  61. return log
  62. def setup_logging():
  63. """设置日志配置"""
  64. log = logging.getLogger() # 获取 Flask 默认的日志记录器
  65. _reset_logger(log)
  66. log.setLevel(logging.INFO) # 设置日志级别为 INFO
  67. return log
  68. # 创建日志实例
  69. logger = setup_logging()
  70. def log_exception(sender, exception, **extra):
  71. """记录异常日志"""
  72. sender.logger.debug('处理过程发生异常: %s', exception)