是否可以为 FastApi 添加 uvicorn 日志的响应时间?

Sci*_*nus 10 python logging fastapi uvicorn

我的记录器看起来像这样:

log_config = {
    "version": 1,
    "disable_existing_loggers": True,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(asctime)s::%(levelname)s::%(name)s::%(filename)s::%(funcName)s::%(message)s",
            "datefmt": "%Y-%m-%dT%H:%M:%S%z",
            "use_colors": False,
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "datefmt": "%Y-%m-%dT%H:%M:%S%z",
            "fmt": '%(asctime)s::%(levelprefix)s %(client_addr)s - "%(request_line)s" %(msecs)d %(status_code)s',
            "use_colors": False,
        },
    },
    "handlers":
    {
        "default":
        {
            "formatter": "default",
            "class": 'logging.FileHandler',
            "filename": CONFIG[SECTION]["default"]
        },
        "access":
        {
            "formatter": "access",
            "class": 'logging.FileHandler',
            "filename": CONFIG[SECTION]["access"]
        },
    },
    "loggers":
    {
        "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
        "uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
    }
}
Run Code Online (Sandbox Code Playgroud)

启动配置:

uvicorn.run(
    app="app.main:app",
    host="0.0.0.0",
    port=8000,
    reload=True,
    log_config=log_config,
    proxy_headers=True,
    forwarded_allow_ips='*',
    log_level="info"
)
Run Code Online (Sandbox Code Playgroud)

我没有找到在访问格式中添加响应时间的方法。我似乎也无法在任何地方找到默认的参数列表。我该如何处理这个问题?

Noo*_*aku 0

我还必须为 FastAPI 创建一些自定义日志,最终我使用中间件来获得我想要的结果。

您可以在此处找到有关如何执行此操作的完整教程。

基本上,您不需要将记录器包含在 FastAPI 类中,而是将其作为中间件包含在内。

代替:

uvicorn.run(
    app="app.main:app",
    host="0.0.0.0",
    port=8000,
    reload=True,
    log_config=log_config,
    proxy_headers=True,
    forwarded_allow_ips='*',
    log_level="info"
)
Run Code Online (Sandbox Code Playgroud)

使用这样的方法:

app.add_middleware(
    RouterLoggingMiddleware,
    logger=logging.getLogger(__name__)
)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。