我正在尝试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.error
logger记录。INFO:uvicorn.error:Application startup complete.
由某个父记录器记录,可能是root
处理程序。
解决方案是停止由两个记录器处理的msg。
-
停止为父记录器设置处理程序,可能是
root
记录器。(首选) -
或禁用
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