默认情况下,Requests python 库将日志消息写入控制台,如下所示:
Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606
我通常对这些消息不感兴趣,并想禁用它们。使这些消息静音或减少 Requests 冗长的最佳方法是什么?
我发现了如何配置 requests 的日志记录级别,这是通过标准的 logging 模块完成的。我决定将其配置为不记录消息,除非它们至少是警告:
import logging
logging.getLogger("requests").setLevel(logging.WARNING)
如果您也希望将此设置应用于 urllib3 库(通常由请求使用),请添加以下内容:
logging.getLogger("urllib3").setLevel(logging.WARNING)
如果您来这里是为了寻找修改任何(可能是深度嵌套的)模块的日志记录的方法,请使用 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)
,我终于摆脱了这些消息。
BackgroundScheduler.BackgroundScheduler()
时 APScheduler
所做的那样。
import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)
这样,来自 urllib3 的所有 level=INFO 消息都不会出现在日志文件中。
因此,您可以继续将 level=INFO 用于您的日志消息...只需针对您正在使用的库进行修改。
setLevel(logging.WARNING)
来记录可能的警告和错误消息。
对于使用 logging.config.dictConfig
的任何人,您可以更改字典中的请求库日志级别,如下所示:
'loggers': {
'': {
'handlers': ['file'],
'level': level,
'propagate': False
},
'requests.packages.urllib3': {
'handlers': ['file'],
'level': logging.WARNING
}
}
dictConfig
。
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
在遇到与您类似的问题后,让我复制/粘贴我大约一两周前写的文档部分:
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
},
如果你有配置文件,你可以配置它。
在记录器部分添加 urllib3:
[loggers]
keys = root, urllib3
添加 logger_urllib3 部分:
[logger_urllib3]
level = WARNING
handlers =
qualname = requests.packages.urllib3.connectionpool
这个答案在这里: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")
Kbrose 关于查找哪个记录器正在生成日志消息的指导非常有用。对于我的 Django 项目,我必须对 120 个不同的记录器进行分类,直到我发现是 elasticsearch
Python 库给我带来了问题。根据大多数问题的指导,我通过将其添加到我的记录器来禁用它:
...
'elasticsearch': {
'handlers': ['console'],
'level': logging.WARNING,
},
...
在此处发布以防其他人在运行 Elasticsearch 查询时看到无用的日志消息。
我不确定以前的方法是否已经停止工作,但无论如何,这是删除警告的另一种方法:
PYTHONWARNINGS="ignore:Unverified HTTPS request" ./do-insecure-request.py
基本上,在脚本执行的上下文中添加一个环境变量。
来自文档:https://urllib3.readthedocs.org/en/latest/security.html#disabling-warnings
简单:只需在 import requests
之后添加 requests.packages.urllib3.disable_warnings()
INFO
。
pysimplesoap
有同样的问题,这个答案帮助我节省了一天getLogger("urllib3")
来抑制消息。requests
库不再提供urllib3
,因此不会记录任何内容。您只需要要求urllib3
库不要传播:logging.getLogger("urllib3").propagate = False
,或者如果您仍需要查看警告或严重消息(当前仅发出警告),请提高日志记录级别。