log_config.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. """
  2. 日志配置模块
  3. 支持日志轮换、不同级别的日志记录
  4. """
  5. import os
  6. import logging
  7. from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
  8. from datetime import datetime
  9. class LogConfig:
  10. """日志配置类"""
  11. def __init__(self, app=None):
  12. self.app = app
  13. if app is not None:
  14. self.init_app(app)
  15. def init_app(self, app):
  16. """初始化日志配置"""
  17. # 确保logs目录存在
  18. log_dir = os.path.join(app.instance_path, '..', 'logs')
  19. if not os.path.exists(log_dir):
  20. os.makedirs(log_dir)
  21. # 设置日志级别
  22. log_level = app.config.get('LOG_LEVEL', 'INFO')
  23. # 清除默认的handlers
  24. app.logger.handlers.clear()
  25. # 设置应用日志级别
  26. app.logger.setLevel(getattr(logging, log_level.upper()))
  27. # 创建格式化器
  28. formatter = logging.Formatter(
  29. '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
  30. )
  31. # 1. 控制台处理器
  32. console_handler = logging.StreamHandler()
  33. console_handler.setLevel(logging.INFO)
  34. console_handler.setFormatter(formatter)
  35. app.logger.addHandler(console_handler)
  36. # 2. 应用日志文件处理器(按大小轮换)
  37. app_log_file = os.path.join(log_dir, 'app.log')
  38. app_file_handler = RotatingFileHandler(
  39. app_log_file,
  40. maxBytes=10*1024*1024, # 10MB
  41. backupCount=5,
  42. encoding='utf-8'
  43. )
  44. app_file_handler.setLevel(logging.INFO)
  45. app_file_handler.setFormatter(formatter)
  46. app.logger.addHandler(app_file_handler)
  47. # 3. 错误日志文件处理器(按时间轮换)
  48. error_log_file = os.path.join(log_dir, 'error.log')
  49. error_file_handler = TimedRotatingFileHandler(
  50. error_log_file,
  51. when='midnight',
  52. interval=1,
  53. backupCount=30, # 保留30天
  54. encoding='utf-8'
  55. )
  56. error_file_handler.setLevel(logging.ERROR)
  57. error_file_handler.setFormatter(formatter)
  58. app.logger.addHandler(error_file_handler)
  59. # 4. 全局错误日志处理器(按时间轮换)
  60. global_error_log_file = os.path.join(log_dir, 'global_error.log')
  61. global_error_handler = TimedRotatingFileHandler(
  62. global_error_log_file,
  63. when='midnight',
  64. interval=1,
  65. backupCount=30, # 保留30天
  66. encoding='utf-8'
  67. )
  68. global_error_handler.setLevel(logging.ERROR)
  69. global_error_handler.setFormatter(formatter)
  70. # 创建全局错误日志器
  71. global_error_logger = logging.getLogger('global_error')
  72. global_error_logger.setLevel(logging.ERROR)
  73. global_error_logger.addHandler(global_error_handler)
  74. global_error_logger.propagate = False # 不传播到父日志器
  75. # 5. 访问日志处理器
  76. access_log_file = os.path.join(log_dir, 'access.log')
  77. access_handler = TimedRotatingFileHandler(
  78. access_log_file,
  79. when='midnight',
  80. interval=1,
  81. backupCount=7, # 保留7天
  82. encoding='utf-8'
  83. )
  84. access_handler.setLevel(logging.INFO)
  85. access_handler.setFormatter(formatter)
  86. # 创建访问日志器
  87. access_logger = logging.getLogger('access')
  88. access_logger.setLevel(logging.INFO)
  89. access_logger.addHandler(access_handler)
  90. access_logger.propagate = False
  91. # 设置werkzeug日志级别(减少Flask开发服务器的日志噪音)
  92. werkzeug_logger = logging.getLogger('werkzeug')
  93. werkzeug_logger.setLevel(logging.WARNING)
  94. # 将日志器保存到app配置中,方便其他地方使用
  95. app.config['LOGGERS'] = {
  96. 'app': app.logger,
  97. 'global_error': global_error_logger,
  98. 'access': access_logger
  99. }