python项目在日志中 打印出详细的请求参数和返回的响应
为了打印出详细的请求参数和返回的响应,你可以使用FastAPI的中间件。以下是如何实现这一目标的示例:
- 添加中间件以捕获请求和响应:
from fastapi import FastAPI, Request
import loggingapp = FastAPI()# 设置日志配置
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)@app.middleware("http")
async def log_request_response(request: Request, call_next):# 记录请求信息body = await request.body()logger.info(f"Request: {request.method} {request.url} - Body: {body.decode('utf-8')}")response = await call_next(request)# 记录响应信息response_body = b""async for chunk in response.body_iterator:response_body += chunkresponse.body_iterator = async_iterator([response_body])logger.info(f"Response: {response.status_code} - Body: {response_body.decode('utf-8')}")return response# 注册你的路由
from app.api import router as api_router
app.include_router(api_router)
- 更新路由文件以包含日志中间件:
# main.py
from fastapi import FastAPI
from app.api import router as api_routerapp = FastAPI()# 包含日志中间件
@app.middleware("http")
async def log_request_response(request: Request, call_next):body = await request.body()logger.info(f"Request: {request.method} {request.url} - Body: {body.decode('utf-8')}")response = await call_next(request)response_body = b""async for chunk in response.body_iterator:response_body += chunkresponse.body_iterator = async_iterator([response_body])logger.info(f"Response: {response.status_code} - Body: {response_body.decode('utf-8')}")return response# 注册路由
app.include_router(api_router)if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)
这个中间件在处理请求时,会先记录请求的方法、URL和请求体内容,然后在返回响应之前记录响应的状态码和响应体内容。
请确保你的logging
配置正确,方便记录详细日志信息。通过这种方式,你可以在日志中查看每个请求和响应的详细信息,从而更好地调试和监控你的应用程序。
辅助logging的详细配置信息:
import logginglogging_config = {"version": 1,"disable_existing_loggers": False,"formatters": {"default": {"()": "uvicorn.logging.DefaultFormatter","fmt": "%(levelprefix)s %(asctime)s %(message)s","datefmt": "%Y-%m-%d %H:%M:%S",},"access": {"()": "uvicorn.logging.AccessFormatter","fmt": "%(levelprefix)s %(asctime)s %(client_addr)s - '%(request_line)s' %(status_code)s","datefmt": "%Y-%m-%d %H:%M:%S",},},"handlers": {"default": {"formatter": "default","class": "logging.StreamHandler","stream": "ext://sys.stdout",},"access": {"formatter": "access","class": "logging.StreamHandler","stream": "ext://sys.stdout",},},"loggers": {"uvicorn": {"handlers": ["default"],"level": "DEBUG","propagate": False,},"uvicorn.access": {"handlers": ["access"],"level": "DEBUG","propagate": False,},},
}logging.config.dictConfig(logging_config)