如何从 Python 中的请求模块中完全删除任何日志记录

Posted

技术标签:

【中文标题】如何从 Python 中的请求模块中完全删除任何日志记录【英文标题】:How can I completely remove any logging from requests module in Python 【发布时间】:2014-08-12 04:50:37 【问题描述】:

如何从 Python 的请求模块中完全删除任何日志记录?我什至不需要设置 CRITICAL 级别。像这样的东西

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

但没有任何消息,甚至 CRITICAL。

【问题讨论】:

requests 模块不记录消息。嵌入的urllib3 库会记录,但不会记录任何CRITICAL 级别的消息。您的代码绰绰有余 How do I disable log messages from the Requests library?的可能重复 这太棒了。我添加了遍历系统中每个记录器并将其级别设置为关键的代码。我将此代码放在我的应用程序中每个文件的顶部。我仍然可以看到有关我的请求的消息。恕我直言,它是请求中的一个错误。我的意思是它使我的程序日志不可读。每个请求 9 行日志。 【参考方案1】:

接受的答案不适合我。但是urllib3 docs 指出您可以通过以下方式禁用日志记录:

import urllib3
urllib3.disable_warnings()

来源:urllib3 docs

【讨论】:

【参考方案2】:

首先,requests 不记录任何东西;只有requests 所依赖的urllib3 库才可以。该库仅记录 INFODEBUG 级别的消息,因此将日志级别设置为 logging.CRITICAL 已经禁用所有消息

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

您也可以只禁用传播:

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

这足以完全禁用 urllib3 库所做的所有日志记录。

urllib3 项目已在项目根记录器上安装了一个 NullHandler() 处理程序对象,这可确保 lastResort handler 不会用于未处理的消息,即使已禁用传播。

也就是说,如果您不相信requests 的未来版本不会使用sys.maxint 作为日志级别,同时忽略设置NullHandler(),那么请务必添加您的在项目根 logger 对象上拥有 NullHandler(),然后在此处禁用传播:

import logging

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

现在requests 层次结构中的所有日志记录都将定向到NullHandler() 实例,并且propagate 设置为False 日志记录停止在那里。您可以使用它来使层次结构中的任何记录器静音。

在我看来,这太过分了,到目前为止,没有任何 requests 版本使用日志记录,并且该项目配备了有能力的开发人员,如果他们确实添加了日志记录,他们不太可能错误配置日志记录设置。

【讨论】:

我使用的是 python 版本 2.7.6(请求 2.12.4,urllib3 1.7.1)。即使在我完成所有这些操作之后,我也会根据请求获得日志条目。但是没有迹象表明这些日志来自哪里。 @chanux:对不起,你为什么要告诉我你的版本? 对不起,我不小心按了 Enter :)。任何帮助表示赞赏。 @chanux:我更新了答案以更清楚地表明您需要禁用 urllib3 的日志记录,而不是 requests requests_log.addHandler(logging.NullHandler()) 行的目的是什么? Logging HOWTO 建议将logging.NullHandler 附加到您的 的***记录器,并且仅当您不希望您的库的用户获取您的库的在其应用程序中没有日志配置的情况下,严重性为logging.WARNING 或更高级别的事件消息会打印到sys.stderr。但这不是库代码,这是应用程序代码。所以不需要重定向任何东西,因为propagateFalse

以上是关于如何从 Python 中的请求模块中完全删除任何日志记录的主要内容,如果未能解决你的问题,请参考以下文章

RocketMQ在windows下broker启动失败,没有任何日志

filebeat不在Linux中启动,并且没有打印任何日志以进行故障排除

如何处理 SQL 代理作业错误?

在没有任何日志的情况下在 CocoaLibSpotify 中崩溃

Mongo突然关闭,没有任何日志

sqlserver2008 插入3000条/秒,分析IO,发现日志读写远大于正常的数据库读写!我不需要任何日志,如何关闭