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

akn*_*ds1 336 python logging verbosity python-requests

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

Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606
Run Code Online (Sandbox Code Playgroud)

我通常对这些消息不感兴趣,并希望禁用它们.什么是沉默这些消息或减少请求的冗长的最佳方法?

akn*_*ds1 534

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

import logging

logging.getLogger("requests").setLevel(logging.WARNING)
Run Code Online (Sandbox Code Playgroud)

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

logging.getLogger("urllib3").setLevel(logging.WARNING)
Run Code Online (Sandbox Code Playgroud)

  • 我需要导入日志记录; logging.getLogger("urllib3").setLevel(logging.WARNING)."请求"的记录器不会阻止这些消息. (9认同)
  • 我必须为"urllib3"记录器添加此行以禁止请求日志消息. (7认同)
  • 我和`pysimplesoap`有同样的问题,这个答案可以帮助我节省一天的时间 (4认同)
  • 出于某种原因,在python3中使用请求库时,你必须执行`getLogger("urllib3")`来抑制消息. (4认同)
  • 当前版本的`requests` 库不再提供`urllib3`,因此不会记录*任何*。你只需要要求`urllib3`库不传播:`logging.getLogger("urllib3").propagate = False`,或者如果你仍然需要看到警告或关键消息,则增加日志记录级别(目前只发出警告)。 (3认同)
  • 您可以将这两行组合在一起:logging.getLogger('requests').setLevel(logging.WARNING) (2认同)

kbr*_*ose 93

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

在评论中按用户136036,请注意此方法仅显示运行上述代码段时存在的记录器.例如,如果模块在实例化类时创建新的记录器,则必须创建类之后放置此片段以打印其名称.

  • 谢谢,这帮助我在使用`boto3`时保持`urllib3`日志消息.这种情况下的记录器是`botocore.vendored.requests.packages.urllib3`,所以我使用了这个:`logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)`和我终于摆脱了消息. (3认同)
  • 请注意,当模块在您稍后调用的类中创建其记录器时,这将不起作用,例如当您调用`BackgroundScheduler.BackgroundScheduler()`时``APScheduler`. (2认同)
  • 我认为他们是说,如果您在库创建记录器之前列出记录器,那么它就不会被列出。哪个是对的。 (2认同)

小智 28

import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)
Run Code Online (Sandbox Code Playgroud)

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

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

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

sor*_*rin 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')
Run Code Online (Sandbox Code Playgroud)

  • 我认为你误解了这个问题的范围. (3认同)

Mar*_*oma 14

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
Run Code Online (Sandbox Code Playgroud)


The*_*erk 12

对于任何使用logging.config.dictConfig您的人,可以在字典中更改请求库日志级别,如下所示:

'loggers': {
    '': {
        'handlers': ['file'],
        'level': level,
        'propagate': False
    },
    'requests.packages.urllib3': {
        'handlers': ['file'],
        'level': logging.WARNING
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

在记录器部分添加 urllib3:

[loggers]
keys = root, urllib3
Run Code Online (Sandbox Code Playgroud)

添加 logger_urllib3 部分:

[logger_urllib3]
level = WARNING
handlers =
qualname = requests.packages.urllib3.connectionpool
Run Code Online (Sandbox Code Playgroud)


Mik*_*kko 6

将记录器名称设置为requestsrequests.urllib3对我不起作用。我必须指定确切的记录器名称才能更改日志记录级别。

首先查看您定义了哪些记录器,以查看要删除哪些记录器

print(logging.Logger.manager.loggerDict)
Run Code Online (Sandbox Code Playgroud)

你会看到这样的事情:

{...'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
    },
Run Code Online (Sandbox Code Playgroud)