Python Web框架-FastAPI教程-使用日志logging 作者:马育民 • 2026-05-10 08:34 • 阅读:10001 # 介绍 FastAPI 本身**没有内置专属日志系统**,但它完全兼容 Python 标准库的 `logging` 模块,这是最稳定、官方推荐的日志方案。 本文有 **开箱即用的完整配置**,包含: 1. 基础日志(控制台输出) 2. 生产级日志(文件+控制台+切割) 3. 统一捕获 FastAPI/Uvicorn 日志 4. 路由中使用日志 --- # 基础日志配置 直接复制到你的 `main.py` 即可使用 ```python from fastapi import FastAPI import logging # 1. 基础日志配置 logging.basicConfig( level=logging.INFO, # 日志级别:DEBUG/INFO/WARNING/ERROR format="%(asctime)s | %(levelname)s | %(name)s | %(message)s", # 日志格式 datefmt="%Y-%m-%d %H:%M:%S" ) # 获取日志器 logger = logging.getLogger(__name__) # 2. 创建 FastAPI 实例 app = FastAPI() # 3. 测试路由 @app.get("/") def home(): logger.info("访问了首页") return {"message": "Hello FastAPI"} ``` ### 运行后控制台输出: ``` 2025-12-19 15:30:00 | INFO | __main__ | 访问了首页 ``` --- # 生产环境日志配置 这是企业常用配置,支持: - 同时输出到**控制台 + 文件** - 日志自动按**大小/时间**切割 - 统一捕获 Uvicorn + FastAPI 系统日志 ```python from fastapi import FastAPI import logging from logging.handlers import RotatingFileHandler # ====================================== # 生产级日志配置 # ====================================== def setup_logger(): # 根日志器 logger = logging.getLogger() logger.setLevel(logging.INFO) # 日志格式 formatter = logging.Formatter( "%(asctime)s | %(levelname)-8s | %(name)s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) # 1. 控制台输出 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) # 2. 文件输出(自动切割,最多 5 个文件,每个最大 10MB) file_handler = RotatingFileHandler( "app.log", maxBytes=10 * 1024 * 1024, # 10MB backupCount=5, encoding="utf-8" ) file_handler.setFormatter(formatter) # 清空默认处理器,避免重复打印 logger.handlers.clear() logger.addHandler(console_handler) logger.addHandler(file_handler) # 捕获 Uvicorn 日志 logging.getLogger("uvicorn").handlers = logger.handlers logging.getLogger("uvicorn.access").handlers = logger.handlers return logger # 初始化日志 logger = setup_logger() # 创建 FastAPI app = FastAPI(title="日志演示") # 测试路由 @app.get("/test") def test_log(): logger.debug("调试信息(默认不显示)") logger.info("普通信息") logger.warning("警告信息") logger.error("错误信息") return {"status": "日志测试完成"} ``` --- # 日志级别说明 | 级别 | 说明 | 使用场景 | |------|------|----------| | `DEBUG` | 调试 | 开发时排查问题 | | `INFO` | 普通信息 | 接口访问、程序启动 | | `WARNING` | 警告 | 非严重异常 | | `ERROR` | 错误 | 接口报错、功能失败 | | `CRITICAL` | 致命错误 | 程序崩溃 | 设置 `level=logging.INFO` 会输出 **INFO 及以上级别**。 --- # 在路由/依赖/工具函数中使用日志 可以在**任何地方**导入使用: ```python # 其他文件 utils.py import logging logger = logging.getLogger(__name__) def my_func(): logger.info("工具函数执行") ``` --- # 统一捕获请求异常 配合日志做错误追踪非常方便: ```python from fastapi import Request import time @app.middleware("http") async def log_requests(request: Request, call_next): start_time = time.time() # 记录请求 logger.info(f"请求地址: {request.url.path} | 方法: {request.method}") response = await call_next(request) # 记录耗时 duration = round(time.time() - start_time, 4) logger.info(f"请求完成 | 耗时: {duration}s") return response ``` --- # 总结 1. FastAPI 使用 Python **标准 logging**,无需额外安装库 2. 生产环境必须用 **文件 + 切割** 防止日志过大 3. 可以统一捕获 Uvicorn + 业务日志 4. 全局一个 `logger`,任何文件都能导入使用 原文出处:http://www.malaoshi.top/show_1GW3HffqofIZ.html