如何在FastAPI中实现请求日志记录和监控

1. 简介

FastAPI是一款高性能的Web框架,它提供了简洁的API设计和强大的自动文档生成功能,同时支持异步处理和易于测试等特性,在Python后端开发中有着广泛的应用。在实际应用中,我们通常需要实现对请求进行日志记录和监控,以便于问题的排查和性能的优化。本文将介绍如何在FastAPI中实现请求日志记录和监控。

2. 实现请求日志记录

2.1 安装依赖包

在FastAPI中实现请求日志记录,需要使用到Python的logging模块。在开始之前,我们需要安装对应的依赖包:

pip install loguru

Loguru是Python的一款日志库,它提供了Python中logging模块所没有的强大功能,如自动旋转日志文件、根据不同的日志等级输出到不同的地方、结构化日志等。

2.2 配置日志

在FastAPI项目中,我们通常会在main.py文件中进行启动时的配置。在这里,我们需要进行日志的配置。具体的配置内容可以根据自己的需要进行定义。以下是一个示例:

import logging

from loguru import logger

from fastapi import FastAPI

app = FastAPI()

logger.remove()

logger.add("logs/error.log", level="ERROR", rotation="10 MB")

logger.add("logs/debug.log", rotation="10 MB")

@app.on_event("startup")

async def startup():

logger.info("Application started")

@app.on_event("shutdown")

async def shutdown():

logger.info("Application stopped")

在这个示例中,我们使用loguru创建了两个日志文件:logs/error.log和logs/debug.log。error.log记录了应用中的错误信息,debug.log记录了调试信息。当日志文件大小达到10MB时,会自动进行轮转,即创建新的日志文件继续记录日志。我们可以在FastAPI的startup和shutdown事件中记录应用的启动和停止信息。

2.3 记录请求日志

在配置好日志之后,我们就可以开始在请求中进行日志的记录了。以下是一个示例:

from typing import Optional

from loguru import logger

from fastapi import FastAPI

app = FastAPI()

@app.get("/")

async def read_root(user_agent: Optional[str] = None):

logger.info(f"User-Agent: {user_agent}")

return {"Hello": "World"}

在这个示例中,我们为根路径的处理函数增加了一个user_agent参数,并在函数内部使用loguru记录了请求中的User-Agent信息。我们可以根据需要自定义日志的格式和内容。

3. 实现请求监控

除了进行日志记录之外,我们还需要对请求进行监控以便于及时发现问题和进行性能优化。在FastAPI的文档中,提供了一些API的性能监控工具,如/me/docs/stats。

3.1 使用自定义中间件

除了FastAPI提供的监控工具之外,我们还可以实现自己的监控中间件,并将其集成到应用中。以下是一个示例:

import time

from fastapi import FastAPI, Request

from loguru import logger

app = FastAPI()

@app.middleware("http")

async def monitor_requests(request: Request, call_next):

start_time = time.time()

response = await call_next(request)

elapsed_time = int((time.time() - start_time) * 1000)

logger.info(f"Request: {request.method} {request.url.path} elapsed time: 0.2481ms response status: {response.status_code}")

return response

@app.get("/")

async def read_root():

return {"Hello": "World"}

在这个示例中,我们创建了一个名为monitor_requests的中间件,在应用的每个HTTP请求进入处理函数之前都会先被调用。在该中间件中,我们记录了请求的消耗时间、请求路径以及响应状态码等信息。

4. 总结

本文介绍了如何在FastAPI中实现请求日志记录和监控。通过使用Loguru和自定义中间件,我们可以方便地记录请求中的信息和进行请求性能监控。这些工具和技术可以帮助我们更好地排查问题、做出优化和调整。

后端开发标签