2012-06-14 37 views
254

默认情况下,Requests库将日志消息写入控制台,沿着Starting new HTTP connection (1): example.com等行。我通常对这些消息不感兴趣,如何禁用它们?如何禁用请求库中的日志消息?

+0

相关:nginx的和gunicorn(https://stackoverflow.com/q/48700404/562769) –

回答

389

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

import logging 

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

如果你想申请的此设置urllib3库(通常使用的请求)也一样,添加以下内容:

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

我有'pysimplesoap同样的问题',这个答案可以帮助我节省一天的时间 –

+1

你可以结合这两行: logging.getLogger('requests').setLevel(logging.WARNING) – jpoppe

+0

@JasperPoppe感谢您的建议,实施。 – aknuds1

12

让我复制/粘贴前它我写了两个星期的文档部分,具有类似于你的问题后:

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

尽管从实际的POV中变得比'请求'更具体, – aknuds1

+0

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

+0

您的意思是说您希望在requests.packages.urllib3中启用日志记录吗?如果是这样,你正在回答错误的问题。 – aknuds1

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

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

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

+2

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

8

对于使用logging.config.dictConfig你可以改变在字典这样的请求库日志级别任何人:

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

这也适用于基于Django的项目。 –

-1

简单:只需之后import requests

+2

我没有在我的版本中找到此方法。禁用警告是过度的,因为烦人的消息是'INFO'级别。 – tripleee

-1

添加requests.packages.urllib3.disable_warnings()我不知道,如果以前的方法有停止工作,但在任何情况下,这里是删除警告的另一种方式:

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

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

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

42

如果你来到这里寻找一种方式来修改任何(可能是深度嵌套)模块的日志记录,使用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) 
+1

谢谢,当使用'boto3'时,这帮助我使'urllib3'日志消息无声。这种情况下的记录器是'botocore.vendored.requests.packages.urllib3',所以我使用这个:'logging.getLogger(“botocore.vendored.requests.packages.urllib3”).setLevel(logging.WARNING)'和I终于摆脱了信息。 –

+0

非常感谢!改变打印标准使我能够隔离python-elasticsearch是我的案例中的罪魁祸首。 –

+0

请注意,当模块在他们的类内部创建记录器时,您将稍后调用这些记录器,例如调用BackgroundScheduler.BackgroundScheduler()时的'APScheduler'。 – user136036

-1

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

添加urllib3在记录器部分:

[loggers] 
keys = root, urllib3 

添加logger_urllib3部分:

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

Kbrose的指导发现其中记录器生成的日志信息是非常有用。对于我的Django项目,我不得不对120个不同的记录器进行排序,直到我发现它是elasticsearch Python库对我造成的问题。按照在大多数问题的指导下,我加入这个我记录器禁用它:

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

在这里发帖的情况下,其他人是看到无益的日志信息来通过时,他们运行一个Elasticsearch查询。

0

没有理由进口记录,只是这样做:

requests.packages.urllib3.disable_warnings()