如何完全移除Python中requests模块的日志记录

5 投票
2 回答
12045 浏览
提问于 2025-04-18 10:37

我该如何彻底关闭Python中requests模块的所有日志记录?我甚至不想设置到CRITICAL级别。就像这样

import logging
requests_log = logging.getLogger("requests")
requests_log.setLevel(logging.CRITICAL)

但我希望完全没有任何消息,连CRITICAL的都不想要。

2 个回答

2

我试过接受的答案,但没成功。不过,urllib3 的文档提到你可以用下面这个方法来关闭日志记录:

import urllib3
urllib3.disable_warnings()

来源:urllib3 的文档

17

首先,requests 本身并不会记录任何日志;只有它依赖的 urllib3 库会记录日志。这个库只会在 INFODEBUG 级别记录信息,所以如果你把日志级别设置为 logging.CRITICAL,这就意味着所有的日志信息都会被禁用:

urllib3_log = logging.getLogger("urllib3")
urllib3_log.setLevel(logging.CRITICAL)

你也可以选择直接禁用日志的传播:

logging.getLogger("urllib3").propagate = False

这样就可以完全关闭 urllib3 库的所有日志记录。

urllib3 项目在根日志记录器上安装了一个 NullHandler() 处理器,这样可以确保即使禁用了传播,未处理的消息也不会使用 lastResort 处理器

不过,如果你不相信未来的 requests 版本不会把 sys.maxint 当作日志级别使用,同时又忘记设置 NullHandler(),那你可以在项目的根日志记录器对象上添加自己的 NullHandler(),然后在那儿禁用传播:

import logging

requests_log = logging.getLogger("requests")
requests_log.addHandler(logging.NullHandler())
requests_log.propagate = False

这样一来,requests 层级中的所有日志记录都会被指向 NullHandler() 实例,并且因为 propagate 设置为 False,日志记录就会在这里停止。你可以用这个方法来静音层级中的任何日志记录器。

在我看来,这有点过头了,迄今为止没有任何 requests 的版本使用日志记录,而且这个项目的开发者都很有能力,不太可能在将来添加日志记录时配置错误。

撰写回答