默认情况下,Requests Python库会将日志消息写入控制台,例如:
Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606
我通常对这些消息不感兴趣,希望能够禁用它们。有什么最好的方法可以使这些消息静音或减少请求的冗长程度?
默认情况下,Requests Python库会将日志消息写入控制台,例如:
Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606
我通常对这些消息不感兴趣,希望能够禁用它们。有什么最好的方法可以使这些消息静音或减少请求的冗长程度?
我发现如何配置requests的日志级别,它是通过标准的logging模块完成的。我决定将其配置为仅在消息至少为警告级别时才记录日志:
import logging
logging.getLogger("requests").setLevel(logging.WARNING)
如果您希望将此设置应用于urllib3库(通常由requests使用),请添加以下内容:logging.getLogger("urllib3").setLevel(logging.WARNING)
getLogger("urllib3")
来抑制消息。 - robrurequests
库不再集成 urllib3
,因此不再记录任何日志。你只需要让 urllib3
库停止传递日志信息:logging.getLogger("urllib3").propagate = False
,或者如果你仍然需要查看警告或关键信息(当前只发出警告),则可以提高日志级别。 - Martijn Pieters如果您在这里寻找修改任何(可能是深度嵌套的)模块的日志记录方式的方法,请使用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的评论,需要注意该方法仅显示您运行上述片段时存在的记录器。例如,如果模块在实例化类时创建新的记录器,则必须在创建类之后放置此片段才能打印其名称。
boto3
时消除了urllib3
的日志信息。在这种情况下,记录器是botocore.vendored.requests.packages.urllib3
,因此我使用了以下代码:logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)
,最终成功摆脱了这些信息。 - Bob DemAPScheduler
在调用BackgroundScheduler.BackgroundScheduler()
时)时,此方法将无法正常工作。 - user136036azure
)。非常感谢! - stinodegoimport logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)
通过这种方式,来自urllib3的级别为INFO的所有消息都不会出现在日志文件中。
因此,您仍然可以继续使用level = INFO记录消息...只需修改您正在使用的库的级别即可。
setLevel(logging.WARNING)
来记录可能的警告和错误信息。 - Mikko Kohoimport 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
如果有人使用logging.config.dictConfig
,您可以像这样在字典中更改请求库的日志级别:
'loggers': {
'': {
'handlers': ['file'],
'level': level,
'propagate': False
},
'requests.packages.urllib3': {
'handlers': ['file'],
'level': logging.WARNING
}
}
dictConfig
。 - uhbif19让我复制/粘贴文档部分,它是我大约一两周前写的,在遇到与您类似的问题后:
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')
将记录器名称设置为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> ...}
然后为确切的记录器配置级别:
'loggers': {
'': {
'handlers': ['default'],
'level': 'DEBUG',
'propagate': True
},
'urllib3.connectionpool': {
'handlers': ['default'],
'level': 'WARNING',
'propagate' : False
},
[loggers]
keys = root, urllib3
添加logger_urllib3部分:
[logger_urllib3]
level = WARNING
handlers =
qualname = requests.packages.urllib3.connectionpool
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")
我不确定之前的方法是否已经失效,但无论如何,这里有另一种消除警告的方法:
PYTHONWARNINGS="ignore:Unverified HTTPS request" ./do-insecure-request.py
基本上,是在脚本执行的上下文中添加环境变量。
根据文档:https://urllib3.readthedocs.org/en/latest/security.html#disabling-warnings