# app/logging_config.py import logging import logging.handlers # ✅ 这里导入 handlers import os from datetime import datetime, timezone, timedelta def setup_logging_with_rotation(): """配置带轮转的日志系统""" # 创建日志目录 log_dir = "logs" os.makedirs(log_dir, exist_ok=True) # 主日志文件 main_log_file = os.path.join(log_dir, "app.log") # 配置根日志记录器 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) # 清除现有的处理器 root_logger.handlers.clear() # 1. 控制台处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.INFO) # 2. 文件处理器 - 轮转,最大10MB,保留5个备份 file_handler = logging.handlers.RotatingFileHandler( # ✅ 使用完整的路径 main_log_file, maxBytes=10 * 1024 * 1024, # 10MB backupCount=5, encoding='utf-8' ) file_handler.setLevel(logging.DEBUG) # 3. 错误日志处理器 - 单独记录错误 error_log_file = os.path.join(log_dir, "error.log") error_handler = logging.handlers.RotatingFileHandler( error_log_file, maxBytes=5 * 1024 * 1024, # 5MB backupCount=3, encoding='utf-8' ) error_handler.setLevel(logging.ERROR) # 设置日志格式 detailed_formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) simple_formatter = logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s', datefmt='%H:%M:%S' ) console_handler.setFormatter(simple_formatter) file_handler.setFormatter(detailed_formatter) error_handler.setFormatter(detailed_formatter) # 添加过滤器到错误处理器 class ErrorFilter(logging.Filter): def filter(self, record): return record.levelno >= logging.ERROR error_handler.addFilter(ErrorFilter()) # 添加处理器 root_logger.addHandler(console_handler) root_logger.addHandler(file_handler) root_logger.addHandler(error_handler) # 配置第三方库的日志级别 logging.getLogger("uvicorn").setLevel(logging.WARNING) logging.getLogger("uvicorn.access").setLevel(logging.WARNING) logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING) logging.getLogger("sqlalchemy.orm").setLevel(logging.WARNING) # 配置我们应用的日志级别 logging.getLogger("app").setLevel(logging.DEBUG) logging.getLogger("app.api.v1").setLevel(logging.DEBUG) logging.getLogger("app.core.security").setLevel(logging.DEBUG) root_logger.info(f"✅ 轮转日志系统初始化完成") root_logger.info(f" 主日志文件: {main_log_file}") root_logger.info(f" 错误日志文件: {error_log_file}") return root_logger