| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- """
- 日志配置模块
- 支持日志轮换、不同级别的日志记录
- """
- import os
- import logging
- from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
- from datetime import datetime
- class LogConfig:
- """日志配置类"""
-
- def __init__(self, app=None):
- self.app = app
- if app is not None:
- self.init_app(app)
-
- def init_app(self, app):
- """初始化日志配置"""
- # 确保logs目录存在
- log_dir = os.path.join(app.instance_path, '..', 'logs')
- if not os.path.exists(log_dir):
- os.makedirs(log_dir)
-
- # 设置日志级别
- log_level = app.config.get('LOG_LEVEL', 'INFO')
-
- # 清除默认的handlers
- app.logger.handlers.clear()
-
- # 设置应用日志级别
- app.logger.setLevel(getattr(logging, log_level.upper()))
-
- # 创建格式化器
- formatter = logging.Formatter(
- '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
- )
-
- # 1. 控制台处理器
- console_handler = logging.StreamHandler()
- console_handler.setLevel(logging.INFO)
- console_handler.setFormatter(formatter)
- app.logger.addHandler(console_handler)
-
- # 2. 应用日志文件处理器(按大小轮换)
- app_log_file = os.path.join(log_dir, 'app.log')
- app_file_handler = RotatingFileHandler(
- app_log_file,
- maxBytes=10*1024*1024, # 10MB
- backupCount=5,
- encoding='utf-8'
- )
- app_file_handler.setLevel(logging.INFO)
- app_file_handler.setFormatter(formatter)
- app.logger.addHandler(app_file_handler)
-
- # 3. 错误日志文件处理器(按时间轮换)
- error_log_file = os.path.join(log_dir, 'error.log')
- error_file_handler = TimedRotatingFileHandler(
- error_log_file,
- when='midnight',
- interval=1,
- backupCount=30, # 保留30天
- encoding='utf-8'
- )
- error_file_handler.setLevel(logging.ERROR)
- error_file_handler.setFormatter(formatter)
- app.logger.addHandler(error_file_handler)
-
- # 4. 全局错误日志处理器(按时间轮换)
- global_error_log_file = os.path.join(log_dir, 'global_error.log')
- global_error_handler = TimedRotatingFileHandler(
- global_error_log_file,
- when='midnight',
- interval=1,
- backupCount=30, # 保留30天
- encoding='utf-8'
- )
- global_error_handler.setLevel(logging.ERROR)
- global_error_handler.setFormatter(formatter)
-
- # 创建全局错误日志器
- global_error_logger = logging.getLogger('global_error')
- global_error_logger.setLevel(logging.ERROR)
- global_error_logger.addHandler(global_error_handler)
- global_error_logger.propagate = False # 不传播到父日志器
-
- # 5. 访问日志处理器
- access_log_file = os.path.join(log_dir, 'access.log')
- access_handler = TimedRotatingFileHandler(
- access_log_file,
- when='midnight',
- interval=1,
- backupCount=7, # 保留7天
- encoding='utf-8'
- )
- access_handler.setLevel(logging.INFO)
- access_handler.setFormatter(formatter)
-
- # 创建访问日志器
- access_logger = logging.getLogger('access')
- access_logger.setLevel(logging.INFO)
- access_logger.addHandler(access_handler)
- access_logger.propagate = False
-
- # 设置werkzeug日志级别(减少Flask开发服务器的日志噪音)
- werkzeug_logger = logging.getLogger('werkzeug')
- werkzeug_logger.setLevel(logging.WARNING)
-
- # 将日志器保存到app配置中,方便其他地方使用
- app.config['LOGGERS'] = {
- 'app': app.logger,
- 'global_error': global_error_logger,
- 'access': access_logger
- }
|