介绍
FastAPI 本身没有内置专属日志系统,但它完全兼容 Python 标准库的 logging 模块,这是最稳定、官方推荐的日志方案。
本文有 开箱即用的完整配置,包含:
- 基础日志(控制台输出)
- 生产级日志(文件+控制台+切割)
- 统一捕获 FastAPI/Uvicorn 日志
- 路由中使用日志
基础日志配置
直接复制到你的 main.py 即可使用
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 系统日志
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 及以上级别。
在路由/依赖/工具函数中使用日志
可以在任何地方导入使用:
# 其他文件 utils.py
import logging
logger = logging.getLogger(__name__)
def my_func():
logger.info("工具函数执行")
统一捕获请求异常
配合日志做错误追踪非常方便:
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
总结
- FastAPI 使用 Python 标准 logging,无需额外安装库
- 生产环境必须用 文件 + 切割 防止日志过大
- 可以统一捕获 Uvicorn + 业务日志
- 全局一个
logger,任何文件都能导入使用