Uvicorn/FastAPI 重复记录

Rya*_*dge 14 logging fastapi uvicorn

我的 FastAPI 应用程序似乎将很多事情记录两次。

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [21360] using statreload
INFO:     Started server process [21362]
INFO:uvicorn.error:Started server process [21362]
INFO:     Waiting for application startup.
INFO:uvicorn.error:Waiting for application startup.
INFO:     Application startup complete.
INFO:uvicorn.error:Application startup complete.
^CINFO:     Shutting down
INFO:uvicorn.error:Shutting down
INFO:     Waiting for application shutdown.
INFO:uvicorn.error:Waiting for application shutdown.
INFO:     Application shutdown complete.
INFO:uvicorn.error:Application shutdown complete.
INFO:     Finished server process [21362]
INFO:uvicorn.error:Finished server process [21362]
INFO:     Stopping reloader process [21360]
Run Code Online (Sandbox Code Playgroud)

这包括引发的任何异常,您将获得整个堆栈跟踪两次。我看到一些答案建议删除 Uvicorn 的日志处理程序,但这感觉不对。如果日志记录事件发生在堆栈的 Uvicorn 层而不是 FastAPI 中怎么办?

有没有办法只获取一次日志输出而不覆盖 uvicorn 的日志处理程序?

Bai*_*ong 8

只需删除uvicorn处理程序:

logging.getLogger("uvicorn").handlers.clear()
Run Code Online (Sandbox Code Playgroud)


Sim*_*mba 7

FastAPI 不做太多日志记录。fastapi无论有没有它,你如何跑步gunicorn?~~从你提供的信息中,还不足以判断重复项来自哪里。~~但无论如何,我们仍然可以找到解决方案。

uvicorn.error是用于uvicorn错误消息的内部记录器。 propagate是此记录器的默认行为。重复行之一必须来自 handler on uvicorn.error,另一行来自上/父记录器。

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

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

  2. 禁用uvicorn.error传播。

    logger = logging.getLogger("uvicorn.error")
    logger.propagate = False
    
    Run Code Online (Sandbox Code Playgroud)

当您使用最新版本的 uvicorn 时,运行gunicorn+ uvicornwith时这应该不是问题。UvicornWorker