使用loguru-在Fastapi应用上记录请求参数的Python日志记录

问题描述

我有一个fastapi应用程序,我想记录对其进行的每个请求。我正在尝试使用loguru和uvicorn,但是我不知道如何打印标题和与每个请求关联的请求参数(如果有)。

我想要这样的东西:

=

有办法吗?谢谢您的帮助。

这里有一些链接:

loguru uvicorn fastapi

解决方法

您可以使用中间件记录每个请求:

import sys

import uvicorn

from fastapi import FastAPI,Request
from loguru import logger
from starlette.routing import Match

logger.remove()
logger.add(sys.stdout,colorize=True,format="<green>{time:HH:mm:ss}</green> | {level} | <level>{message}</level>")
app = FastAPI()


@app.middleware("http")
async def log_middle(request: Request,call_next):
    logger.debug(f"{request.method} {request.url}")
    routes = request.app.router.routes
    logger.debug("Params:")
    for route in routes:
        match,scope = route.matches(request)
        if match == Match.FULL:
            for name,value in scope["path_params"].items():
                logger.debug(f"\t{name}: {value}")
    logger.debug("Headers:")
    for name,value in request.headers.items():
        logger.debug(f"\t{name}: {value}")

    response = await call_next(request)
    return response


@app.get("/{param1}/{param2}")
async def path_operation(param1: str,param2: str):
    return {'param1': param1,'param2': param2}


if __name__ == "__main__":
    uvicorn.run("app:app",host="localhost",port=8001)

更新:还可以使用对路由器级别的依赖(感谢下面的评论中的@lsabi):

import sys

import uvicorn

from fastapi import FastAPI,Request,APIRouter,Depends
from loguru import logger
from starlette.routing import Match

logger.remove()
logger.add(sys.stdout,format="<green>{time:HH:mm:ss}</green> | {level} | <level>{message}</level>")
app = FastAPI()

router = APIRouter()


async def logging_dependency(request: Request):
    logger.debug(f"{request.method} {request.url}")
    logger.debug("Params:")
    for name,value in request.path_params.items():
        logger.debug(f"\t{name}: {value}")
    logger.debug("Headers:")
    for name,value in request.headers.items():
        logger.debug(f"\t{name}: {value}")


@router.get("/{param1}/{param2}")
async def path_operation(param1: str,'param2': param2}

app.include_router(router,dependencies=[Depends(logging_dependency)])

if __name__ == "__main__":
    uvicorn.run("app:app",port=8001)

curl http://localhost:8001/admin/home

输出:

16:06:43 | DEBUG | GET http://localhost:8001/admin/home
16:06:43 | DEBUG | Params:
16:06:43 | DEBUG |  param1: admin
16:06:43 | DEBUG |  param2: home
16:06:43 | DEBUG | Headers:
16:06:43 | DEBUG |  host: localhost:8001
16:06:43 | DEBUG |  user-agent: curl/7.64.0
16:06:43 | DEBUG |  accept: */*

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...