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


367

默认情况下,Requests python库按照以下方式将日志消息写入控制台:

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

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


Answers:


573

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

import logging

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

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

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

4
我也有同样的问题pysimplesoap,这个答案可以帮助我节省时间
Janith Chinthana

2
您可以像这样将两行结合:logging.getLogger('requests')。setLevel(logging.WARNING)
jpoppe 2014年

7
我必须为“ urllib3”记录器添加此行,以禁止请求日志消息。
dgassaway,2015年

9
我需要导入日志记录;logging.getLogger(“ urllib3”)。setLevel(logging.WARNING)也是如此。“请求”记录器不会阻止这些消息。
m_messiah 2015年

4
由于某些原因,在python3中使用请求库时,您必须getLogger("urllib3")禁止显示消息。
robru

104

如果您是来这里寻找修改任何(可能是深度嵌套的)模块的日志记录的方法,请使用它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中的注释,此方法仅显示运行上述代码片段时存在的记录器。例如,如果某个模块在实例化一个类时创建了一个新的记录器,则必须创建该类之后放置此代码段以打印其名称。


3
谢谢,这有助于我urllib3在使用时使日志消息静音boto3。在这种情况下botocore.vendored.requests.packages.urllib3,记录器是,所以我使用了它:logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)我终于摆脱了消息。
Bob Dem

非常感谢!更改打印标准使我得以隔离python-elasticsearch是我的罪魁祸首。
罗伯特·汤利

2
请注意,当模块在您稍后要调用的类中创建记录器APScheduler时(如您调用时所做的那样),这将无法工作BackgroundScheduler.BackgroundScheduler()
user136036

@ user136036:记录器对象是单例对象,您或库是否首先创建它们都没关系。如果您使用与库使用的名称完全相同的名称,则它将起作用
马丁·彼得

1
我认为他们是说,如果您在库创建记录器之前列出记录器,则不会列出该记录器。哪个是对的。
kbrose

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

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

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


4
我建议使用setLevel(logging.WARNING)来记录可能的警告和错误消息。
razz0

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

但是,从实际的POV来看,要比“请求”更具体一点是什么呢?
aknuds1 2013年

但是,考虑到您想影响请求库的日志记录,您可以通过调用logging.getLogger(“ requests.packages.urllib3”)而不是logging.getLogger(“ requests”)获得什么?
aknuds1 2013年

您是否表示要在request.packages.urllib3中启用日志记录?如果是这样,则说明您在回答错误的问题。
aknuds1 2013年

@ aknuds1由您决定是否要禁用或启用它们,我只放置完全控制此代码的代码:)
sorin 2013年

3
我认为您误解了问题的范围。
aknuds1 2013年

14

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

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

@SebastianWagner Django dictConfig在后台使用。
uhbif19

非常感谢!很好 一个地方可以统治所有图书馆的日志!:)
MehmedB

5

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

这些级别设置在哪里?
javadba

我将它们放在Django设置的base.py中。当然,将它们放在何处取决于您的项目设置。
Mikko

2

如果您有配置文件,则可以对其进行配置。

在loggers部分中添加urllib3:

[loggers]
keys = root, urllib3

添加logger_urllib3部分:

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

对于使用配置文件的人来说,这是一个完美的答案。不确定为什么会有这么多的否决权?
帕特里克


1
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

0

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

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

如果有人在运行Elasticsearch查询时看到其他无用的日志消息,请在此处发布。


-1

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


2
我在我的版本中找不到此方法。禁用警告是多余的,因为令人讨厌的消息是level INFO
Tripleee '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.