如何禁用Requests库中的日志消息?

时间:2012-06-14 08:52:13

标签: python logging python-requests verbosity

默认情况下,Requests python库将日志消息写入控制台,其行如下:

Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606

我通常对这些消息不感兴趣,并希望禁用它们。什么是沉默这些消息或减少请求的冗长的最佳方式?

12 个答案:

答案 0 :(得分:499)

我找到了如何配置 requests 的日志记录级别,它是通过标准logging模块完成的。我决定将其配置为不记录消息,除非它们至少是警告:

import logging

logging.getLogger("requests").setLevel(logging.WARNING)

如果您希望将此设置应用于urllib3库(通常由请求使用),请添加以下内容:

logging.getLogger("urllib3").setLevel(logging.WARNING)

答案 1 :(得分:78)

如果您来到这里寻找修改任何(可能是深度嵌套的)模块的日志记录的方法,请使用logging.Logger.manager.loggerDict获取所有记录器对象的字典。然后可以将返回的名称用作logging.getLogger的参数:

import requests
import logging
for key in logging.Logger.manager.loggerDict:
    print(key)
# requests.packages.urllib3.connectionpool
# requests.packages.urllib3.util
# requests.packages
# requests.packages.urllib3
# requests.packages.urllib3.util.retry
# PYREADLINE
# requests
# requests.packages.urllib3.poolmanager

logging.getLogger('requests').setLevel(logging.CRITICAL)
# Could also use the dictionary directly:
# logging.Logger.manager.loggerDict['requests'].setLevel(logging.CRITICAL)

在评论中按用户136036,请注意此方法仅显示运行上述代码段时存在的记录器。例如,如果模块在实例化类时创建了一个新的记录器,则必须在创建类之后将此片段放在其中以便打印其名称。

答案 2 :(得分:27)

import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)

这样,来自urllib3的level = INFO的所有消息都不会出现在日志文件中。

因此,您可以继续使用level = INFO作为日志消息...只需为您正在使用的库修改此内容。

答案 3 :(得分:14)

让我在遇到与你类似的问题之后,复制/粘贴我在一两年前写过的文档部分:

import requests
import logging

# these two lines enable debugging at httplib level (requests->urllib3->httplib)
# you will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA.
# the only thing missing will be the response.body which is not logged.
import httplib
httplib.HTTPConnection.debuglevel = 1

logging.basicConfig() # you need to initialize logging, otherwise you will not see anything from requests
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True

requests.get('http://httpbin.org/headers')

答案 4 :(得分:12)

对于使用const M&的任何人,您可以像这样更改字典中的请求库日志级别:

logging.config.dictConfig

答案 5 :(得分:4)

pub get

答案 6 :(得分:0)

如果您有配置文件,可以配置它。

在loggers部分添加urllib3:

[loggers]
keys = root, urllib3

添加logger_urllib3部分:

[logger_urllib3]
level = WARNING
handlers =
qualname = requests.packages.urllib3.connectionpool

答案 7 :(得分:0)

Kbrose关于找到哪个记录器生成日志消息的指导非常有用。对于我的Django项目,我不得不对120种不同的记录器进行排序,直到我发现是elasticsearch Python库导致了我的问题。根据大多数问题的指导,我通过将其添加到我的记录器来禁用它:

      ...
      'elasticsearch': {
          'handlers': ['console'],
          'level': logging.WARNING,
      },     
      ...

发布此处以防其他人在运行Elasticsearch查询时看到无用的日志消息。

答案 8 :(得分:0)

将记录器名称设置为puppy { ... goldenRetriever { ... hasCourage(){ ... } } } requests对我不起作用。我必须指定确切的记录器名称才能更改记录级别。

首先查看您已定义的记录器,以查看要删除的记录器

requests.urllib3

您将看到类似这样的内容:

print(logging.Logger.manager.loggerDict)

然后为确切的记录器配置级别:

{...'urllib3.poolmanager': <logging.Logger object at 0x1070a6e10>, 'django.request': <logging.Logger object at 0x106d61290>, 'django.template': <logging.Logger object at 0x10630dcd0>, 'django.server': <logging.Logger object at 0x106dd6a50>, 'urllib3.connection': <logging.Logger object at 0x10710a350>,'urllib3.connectionpool': <logging.Logger object at 0x106e09690> ...}

答案 9 :(得分:0)

此答案在这里:Python: how to suppress logging statements from third party libraries?

您可以保留basicConfig的默认日志记录级别,然后在获取模块的记录器时设置DEBUG级别。

logging.basicConfig(format='%(asctime)s %(module)s %(filename)s:%(lineno)s - %(message)s')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logger.debug("my debug message")

答案 10 :(得分:-1)

简单:只需在requests.packages.urllib3.disable_warnings()

之后添加import requests即可

答案 11 :(得分:-1)

我不确定之前的方法是否已停止工作,但无论如何,这是另一种删除警告的方法:

PYTHONWARNINGS="ignore:Unverified HTTPS request" ./do-insecure-request.py

基本上,在脚本执行的上下文中添加环境变量。

来自文档:https://urllib3.readthedocs.org/en/latest/security.html#disabling-warnings