Uvicorn记录错误信息,而不是INFO: Uvicorn .error:Application



我正在尝试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.

找不到错误的原因是它不是错误,它是记录器的名称(在uvicorn/main.py中设置):

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

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

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

Ben解释了部分原因。我不认为是uvicorn的bug,但是提问者没有正确配置日志。

Uvicorn有一些内部记录器,如uvicorn,uvicorn:access,uvicorn.error,uvicorn.asgi。默认情况下,uvicorn.error记录器传播msg。

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

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

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

  2. 禁用uvicorn.error传播

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

我为此创建了另一个解决方案。我创建了一个类NameFilter,它过滤掉不同的记录器名称并直接重命名它们。

logger.py祝辞使用

name_filter = NameFilter()
console_handler.addFilter(name_filter)

logger.py祝辞类

class NameFilter(logging.Filter):
def filter(self, record):
if record.name == 'uvicorn.error':
record.name = 'fastapi'
return True

最新更新