【问题标题】:How do I disable log messages from the Requests library?如何禁用 Requests 库中的日志消息?
【发布时间】:2012-06-17 06:52:45
【问题描述】:

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

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

我通常对这些消息不感兴趣,并想禁用它们。使这些消息静音或减少请求的详细程度的最佳方法是什么?

【问题讨论】:

标签: python logging python-requests verbosity


【解决方案1】:

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

import logging

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

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

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

【讨论】:

  • 我和pysimplesoap 有同样的问题,这个答案帮助我节省了一天
  • 我必须为“urllib3”记录器添加这一行来抑制请求日志消息。
  • 我需要导入日志; logging.getLogger("urllib3").setLevel(logging.WARNING) 也是。 “请求”记录器不会阻止这些消息。
  • 由于某种原因,在 python3 中使用 requests 库时,您必须使用getLogger("urllib3") 来抑制消息。
  • requests 库的当前版本不再提供urllib3,因此不会记录任何内容。您只需要要求urllib3 库不要传播:logging.getLogger("urllib3").propagate = False,或者如果您仍需要查看警告或严重消息(目前仅发出警告),请提高日志记录级别。
【解决方案2】:

如果您来这里寻找修改任何(可能是深度嵌套的)模块的日志记录的方法,请使用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)

根据 user136036 的评论,请注意,此方法仅向您显示在您运行上述 sn-p 时存在的记录器。例如,如果一个模块在你实例化一个类时创建了一个新的记录器,那么你必须把这个 sn -p 放在创建这个类之后才能打印它的名字。

【讨论】:

  • 谢谢,这帮助我在使用boto3 时使urllib3 日志消息静音。这种情况下的记录器是botocore.vendored.requests.packages.urllib3,所以我使用了这个:logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING),我终于摆脱了这些消息。
  • 非常感谢!更改打印标准使我能够确定 python-elasticsearch 是我的罪魁祸首。
  • 请注意,当模块在您稍后调用的类中创建其记录器时,这将不起作用,就像您调用 BackgroundScheduler.BackgroundScheduler()APScheduler 所做的那样。
  • @user136036: 记录器对象是单例的,你或库是否首先创建它们并不重要。如果您使用与库使用的完全相同的名称,它会起作用
  • 我认为他们的意思是,如果您在库创建其记录器之前列出记录器,那么它将不会被列出。哪个是正确的。
【解决方案3】:
import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)

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

因此您可以继续将 level=INFO 用于您的日志消息...只需针对您正在使用的库进行修改即可。

【讨论】:

  • 我建议使用setLevel(logging.WARNING) 来记录可能的警告和错误消息。
【解决方案4】:

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

'loggers': {
    '': {
        'handlers': ['file'],
        'level': level,
        'propagate': False
    },
    'requests.packages.urllib3': {
        'handlers': ['file'],
        'level': logging.WARNING
    }
}

【讨论】:

  • @SebastianWagner Django 在后台使用dictConfig
  • 非常感谢!这很不错。一个管理所有图书馆日志的地方!! :)
【解决方案5】:
import logging

# Only show warnings
logging.getLogger("urllib3").setLevel(logging.WARNING)

# Disable all child loggers of urllib3, e.g. urllib3.connectionpool
logging.getLogger("urllib3").propagate = False

【讨论】:

    【解决方案6】:

    在遇到与您类似的问题后,让我复制/粘贴我大约一两周前写的文档部分:

    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')
    

    【讨论】:

    • 从实际的 POV 来看,比仅仅“请求”更具体的意义何在?
    • 但是考虑到您想要影响请求库的日志记录,您通过调用 logging.getLogger("requests.packages.urllib3") 而不是 logging.getLogger("requests") 可以获得什么?
    • 您的意思是您希望在 requests.packages.urllib3 中启用日志记录?如果是这样,您就答错了问题。
    • @aknuds1 是否要禁用或启用它们取决于你,我只放了完全控制它的代码:)
    • 我认为您误解了问题的范围。
    【解决方案7】:

    将记录器名称设置为 requestsrequests.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> ...}

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

       'loggers': {
        '': {
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': True
        },
        'urllib3.connectionpool': {
            'handlers': ['default'],
            'level': 'WARNING',
            'propagate' : False
        },
    

    【讨论】:

    • 这些级别在哪里设置?
    • 我在 Django 设置的 base.py 中有它们。当然,将它们放在哪里取决于您的项目设置。
    【解决方案8】:

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

    在记录器部分添加 urllib3:

    [loggers]
    keys = root, urllib3
    

    添加 logger_urllib3 部分:

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

    【讨论】:

    • 这对于使用配置文件的人来说是一个完全有效的答案。不知道为什么它得到了这么多反对?
    【解决方案9】:

    这个答案在这里: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】:

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

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

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

      【讨论】:

        【解决方案11】:

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

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

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

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

        【讨论】:

          【解决方案12】:

          简单:只需在import requests 之后添加requests.packages.urllib3.disable_warnings()

          【讨论】:

          • 我的版本中没有找到这个方法。禁用警告是过度的,因为烦人的消息级别为INFO
          猜你喜欢
          • 2016-04-19
          • 1970-01-01
          • 2014-01-24
          • 1970-01-01
          • 2015-07-29
          • 2015-05-21
          • 1970-01-01
          • 2015-11-23
          • 1970-01-01
          相关资源
          最近更新 更多