如何禁用Uvicorn的日志记录?

问题描述 投票:0回答:4

我正在开发 FastAPI - Uvicorn。我想禁用 uvicorn 的日志记录。我只需要服务器记录的日志。

我参考了这个博客并实现了日志记录。

python logging fastapi alembic uvicorn
4个回答
15
投票

您可以更改日志级别以仅获取所需的消息,有很多可能的选项

uvicorn main:app --log-level critical

7
投票

我想我也有同样的问题。

要禁用记录器,必须首先找到应禁用的记录器。我通过关注 this stackoverflow 帖子和 this GitHub-Issue 来完成此操作。

对我来说,它可以仅禁用 uvicorn 的两个记录器:

import logging
# ....CODE....
uvicorn_error = logging.getLogger("uvicorn.error")
uvicorn_error.disabled = True
uvicorn_access = logging.getLogger("uvicorn.access")
uvicorn_access.disabled = True

起初我尝试了@Sanchouz提供的答案,但这对我来说没有成功 - 进一步设置

propagate = false
被一些人认为是不好的做法(参见this)。因为我想以编程方式执行此操作,所以无法测试 @funnydman 提供的答案。

希望这对任何人都有帮助,thinklex。


3
投票

问题定义

我遇到了类似的问题,并找到了解决方案。就我而言,我使用 FastAPI 创建了一个小型网站,以在单独的进程中启动网络抓取工具。我还从

logging
模块为记录器创建了类包装器。我的问题是:当我使用
uvicorn ...
命令(其中包括一些用于登录文件的设置)在 Docker 容器内启动应用程序时,来自任何 Web scrapper 的所有日志记录都将进入 scrapper 的单独日志文件和服务器的日志文件。我有很多东西要记录,所以这是一个很大的问题。

简短回答

当您获得记录器时,只需将其

propagate
属性设置为
False
,如下所示:

logger = logging.getLogger(logger_name)
logger.propagate = False

长答案

起初,我花了一些时间调试

logging
模块的内部,发现了一个名为
callHandlers
的函数,它循环遍历当前记录器及其父记录器的处理程序。我错误地认为根记录器是造成该问题的原因,但经过更多测试后发现,实际上根记录器没有任何处理程序。这意味着 uvicorn 的一些记录器对此负责,这是有道理的,同时考虑到 Thinklex 的解决方案。我也尝试了他的解决方案,但它不适合我,因为它完全禁用了 uvicorn 的日志记录,我不希望这样,所以我将坚持防止在我的记录器上传播。


0
投票
    if self.log_level is not None:
        if isinstance(self.log_level, str):
            log_level = LOG_LEVELS[self.log_level]
        else:
            log_level = self.log_level
        logging.getLogger("uvicorn.error").setLevel(log_level)
        logging.getLogger("uvicorn.access").setLevel(log_level)
        logging.getLogger("uvicorn.asgi").setLevel(log_level)
    if self.access_log is False:
        logging.getLogger("uvicorn.access").handlers = []
        logging.getLogger("uvicorn.access").propagate = False

这是来自 uvicor

© www.soinside.com 2019 - 2024. All rights reserved.