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

2025-02-28 08:24:00
admin
原创
78
摘要:问题描述:默认情况下,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

我通常对这些消息不感兴趣,并希望禁用它们。有什么最好的方法可以消除这些消息或降低请求的冗长程度?


解决方案 1:

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

import logging

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

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

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

解决方案 2:

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

解决方案 3:

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

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

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

解决方案 4:

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

解决方案 5:

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

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

解决方案 6:

让我复制/粘贴我在大约一两周前遇到与您类似的问题后写的文档部分:

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

解决方案 7:

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

解决方案 8:

如果您有配置文件,您可以配置它。

在记录器部分添加 urllib3:

[loggers]
keys = root, urllib3

添加 logger_urllib3 部分:

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

解决方案 9:

答案在这里: Python:如何抑制来自第三方库的日志记录语句?

您可以保留 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")

解决方案 10:

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

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

在这里发布,以防其他人在运行 Elasticsearch 查询时看到无用的日志消息。

解决方案 11:

我不确定以前的方法是否已经停止工作,但无论如何,这里是另一种消除警告的方法:

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

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

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

解决方案 12:

就我而言什么对我有帮助(python 3.7)

import http.client as http_client
http_client.HTTPConnection.debuglevel = 0

解决方案 13:

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3975  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2742  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   80  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   88  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   77  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用