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



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



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


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

673   9  

9 ответов:

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

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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[loggers]
keys = root, urllib3

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

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

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

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

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

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

Comments

    Ничего не найдено.