您可以更改日志级别以仅获取所需的消息,有很多可能的选项:
uvicorn main:app --log-level critical
我想我也有同样的问题。
要禁用记录器,必须首先找到应禁用的记录器。我通过关注 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。
我遇到了类似的问题,并找到了解决方案。就我而言,我使用 FastAPI 创建了一个小型网站,以在单独的进程中启动网络抓取工具。我还从
logging
模块为记录器创建了类包装器。我的问题是:当我使用 uvicorn ...
命令(其中包括一些用于登录文件的设置)在 Docker 容器内启动应用程序时,来自任何 Web scrapper 的所有日志记录都将进入 scrapper 的单独日志文件和服务器的日志文件。我有很多东西要记录,所以这是一个很大的问题。
当您获得记录器时,只需将其
propagate
属性设置为 False
,如下所示:
logger = logging.getLogger(logger_name)
logger.propagate = False
起初,我花了一些时间调试
logging
模块的内部,发现了一个名为 callHandlers
的函数,它循环遍历当前记录器及其父记录器的处理程序。我错误地认为根记录器是造成该问题的原因,但经过更多测试后发现,实际上根记录器没有任何处理程序。这意味着 uvicorn 的一些记录器对此负责,这是有道理的,同时考虑到 Thinklex 的解决方案。我也尝试了他的解决方案,但它不适合我,因为它完全禁用了 uvicorn 的日志记录,我不希望这样,所以我将坚持防止在我的记录器上传播。
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