Как отключить сообщения журнала из библиотеки запросов?

По умолчанию библиотека python Requests записывает сообщения журнала на консоль в соответствии с строками:

Starting new HTTP connection (1): example.com
http://example.com:80 "GET / HTTP/1.1" 200 606

Я обычно не заинтересован в этих сообщениях и хотел бы отключить их. Какой был бы лучший способ заставить замолчать эти сообщения или уменьшить многословность запросов?

Ответ 1

Я узнал, как настроить уровень ведения запросов на запросы, сделанный с помощью стандартного модуля logging. Я решил настроить его, чтобы не регистрировать сообщения, если они не являются как минимум предупреждениями:

import logging

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

Если вы хотите применить этот параметр для библиотеки urllib3 (обычно используется для запросов), добавьте следующее:

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

Ответ 2

Если вы пришли сюда, чтобы найти способ изменить регистрацию любого (возможно, глубоко вложенного) модуля, используйте logging.Logger.manager.loggerDict чтобы получить словарь всех объектов журнала. logging.getLogger имена затем могут использоваться в качестве аргумента 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)

Имейте в виду, что в этом случае только тех пользователей, которые существуют во время выполнения вышеприведенного фрагмента, отображаются только зарегистрированные пользователи. Если, например, модуль создает новый журнал при создании экземпляра класса, то вы должны поместить этот фрагмент после создания класса, чтобы напечатать его имя.

Ответ 3

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

Таким образом, все сообщения уровня = INFO из urllib3 не будут присутствовать в файле журнала.

Итак, вы можете продолжать использовать уровень = INFO для сообщений журнала... просто измените это для используемой библиотеки.

Ответ 4

Позвольте мне скопировать/вставить раздел документации, который я написал неделю или два назад, после проблемы, похожей на вашу:

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

Ответ 5

Для любого пользователя, использующего logging.config.dictConfig, вы можете изменить уровень журнала запросов в словаре следующим образом:

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

Ответ 6

Если у вас есть файл конфигурации, вы можете его настроить.

Добавить urllib3 в разделе регистраторов:

[loggers]
keys = root, urllib3

Добавить раздел logger_urllib3:

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

Ответ 7

Подсказка по определению того, какой регистратор генерирует сообщения журнала, чрезвычайно полезна. Для моего проекта Django мне пришлось сортировать 120 разных регистраторов, пока не обнаружил, что это была библиотека elasticsearch Python, которая вызывала проблемы для меня. В соответствии с руководством по большинству вопросов я отключил его, добавив это к моим регистраторам:

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

Проводка здесь, если кто-то видит, что бесполезные сообщения журнала приходят, когда они запускают запрос Elasticsearch.

Ответ 8

Установка имени регистратора в качестве 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
    },

Ответ 9

просто: просто добавьте requests.packages.urllib3.disable_warnings() после import requests

Ответ 10

Я не уверен, что предыдущие подходы перестали работать, но в любом случае, другой способ удаления предупреждений:

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

В принципе, добавление переменной среды в контексте выполнения скрипта.

Из документации: https://urllib3.readthedocs.org/en/latest/security.html#disabling-warnings