【问题标题】:Uvicorn log the errror message instead of INFO:uvicorn.error:ApplicationUvicorn 记录错误消息而不是 INFO:uvicorn.error:Application
【发布时间】:2021-08-11 10:20:03
【问题描述】:

我正在试用 uvicorn,每当服务器运行时,它都会显示INFO:uvicorn.error:Application。如何查看导致错误的原因?如何在日志中打印错误?

» uvicorn serve:app --reload --log-level debug
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [207627] using statreload
INFO:     Started server process [207629]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:uvicorn.error:Application startup complete.

我尝试过log-level,但它似乎不起作用

» uvicorn serve:app --reload --log-level trace
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [207665] using statreload
INFO:     Started server process [207667]
INFO:     Waiting for application startup.
TRACE:    ASGI [1] Started scope={'type': 'lifespan', 'asgi': {'version': '3.0', 'spec_version': '2.0'}}
TRACE:    ASGI [1] Receive {'type': 'lifespan.startup'}
TRACE:    ASGI [1] Send {'type': 'lifespan.startup.complete'}
TRACE:uvicorn.asgi:ASGI [1] Send {'type': 'lifespan.startup.complete'}
INFO:     Application startup complete.
INFO:uvicorn.error:Application startup complete.

【问题讨论】:

    标签: python logging fastapi uvicorn asgi


    【解决方案1】:

    找不到错误的原因是不是错误,是logger的名字(设置在uvicorn/main.py):

    logger = logging.getLogger("uvicorn.error")
    

    如果您查看该模块的 startup() 函数内部,则会有一个 logger.info(... 使用名为 uvicorn.error 的记录器生成您看到的日志消息。

    有一个关于记录器名称令人困惑的开放问题(在撰写本文时它是开放的)(但好消息是它只是一个名称而不是错误):https://github.com/encode/uvicorn/issues/562

    【讨论】:

      【解决方案2】:

      Ben 解释了部分原因。我不认为是 uvicorn 的错误,但提问者没有正确配置记录器。

      Uvicorn 有一些内部记录器,例如 uvicornuvicorn:accessuvicorn.erroruvicorn.asgi。而uvicorn.error logger 默认传播 msg。

      INFO: Application startup complete.uvicorn.error 记录器记录。 INFO:uvicorn.error:Application startup complete. 由一些父记录器记录,可能是 root 处理程序。

      解决方案是停止由两个记录器处理的消息。

      1. 停止为父记录器设置处理程序,可能是root记录器。 (首选)

      2. 或者禁用uvicorn.error传播。

        logger = logging.getLogger("uvicorn.error")
        logger.propagate = False
        

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 2012-02-11
        • 2023-03-19
        • 2020-01-29
        • 2022-11-20
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        相关资源
        最近更新 更多