"""
日志配置模块
支持日志轮换、不同级别的日志记录
"""
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
        }
