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

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

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

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

13 ответов

Решение

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

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 учтите, что этот метод показывает только те регистраторы, которые существуют на момент запуска приведенного выше фрагмента. Если, например, модуль создает новый регистратор при создании экземпляра класса, то вы должны поместить этот фрагмент после создания класса, чтобы напечатать его имя.

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

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

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

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

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

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

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

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: как подавить записи в журнал из сторонних библиотек?

Вы можете оставить уровень ведения журнала по умолчанию для 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.

В моем случае, что мне помогло (python 3.7)

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

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

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

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

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

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

Другие вопросы по тегам