python Uvicorn记录errror消息而不是INFO:uvicorn,error:Application

unftdfkk  于 2023-04-19  发布在  Python
关注(0)|答案(3)|浏览(517)

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

enxuqcxy1#

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

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

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

nqwrtyyt

nqwrtyyt2#

Ben解释了部分原因,我不认为是uvicorn的bug,但提问者没有正确配置logger。
Uvicorn有一些内部日志记录器,如uvicornuvicorn:accessuvicorn.erroruvicorn.asgi。默认情况下,uvicorn.error日志记录器会传播消息。
INFO: Application startup complete.是由uvicorn.error记录器记录的。INFO:uvicorn.error:Application startup complete.是由某个父记录器记录的,可能是root处理程序。
解决方案是停止由两个记录器处理的消息。
1.停止设置父记录器的处理程序,可能是root记录器。(首选)
1.关闭uvicorn.error传播。

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

tvokkenx3#

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

相关问题