Python Web框架-FastAPI教程-使用日志logging

介绍

FastAPI 本身没有内置专属日志系统,但它完全兼容 Python 标准库的 logging 模块,这是最稳定、官方推荐的日志方案。

本文有 开箱即用的完整配置,包含:

  1. 基础日志(控制台输出)
  2. 生产级日志(文件+控制台+切割)
  3. 统一捕获 FastAPI/Uvicorn 日志
  4. 路由中使用日志

基础日志配置

直接复制到你的 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

总结

  1. FastAPI 使用 Python 标准 logging,无需额外安装库
  2. 生产环境必须用 文件 + 切割 防止日志过大
  3. 可以统一捕获 Uvicorn + 业务日志
  4. 全局一个 logger,任何文件都能导入使用

原文出处:/show_1GW3HffqofIZ.html