Uvicorn记录错误信息而不是INFO:uvicorn.error:应用程序。

3

我正在尝试使用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.
3个回答

3

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

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

如果你查看该模块的startup()函数,你会发现有一条使用名为uvicorn.error的记录器生成的日志信息,这就是你看到的日志消息。目前(撰写本文时)有一个关于记录器名称令人困惑的问题(但好消息是这只是一个名称而不是错误):https://github.com/encode/uvicorn/issues/562

1
Ben解释了部分原因。我不认为这是uvicorn的错误,而是提问者没有正确配置记录器。
Uvicorn有一些内部记录器,如uvicornuvicorn:accessuvicorn.erroruvicorn.asgi。默认情况下,uvicorn.error记录器会传播消息。 INFO: Application startup complete.uvicorn.error记录器记录。 INFO:uvicorn.error:Application startup complete.由某个父记录器记录,可能是root处理程序。
解决方法是停止一个消息被两个记录器处理。
  1. Stop setting up handler for parent logger, probably root logger. (preferred)

  2. Or Disable uvicorn.error propagating.

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

0
我为此创建了另一种解决方案。 我创建了一个名为 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接