2012-06-14 2 views
254

По умолчанию библиотека записывает сообщения журнала на консоль по линиям Starting new HTTP connection (1): example.com и т. Д. Мне обычно не интересны эти сообщения, как их отключить?Как отключить сообщения журнала из библиотеки Requests?

+0

Связанный: [Nginx и gunicorn] (https://stackoverflow.com/q/48700404/562769) –

ответ

389

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

import logging 

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

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

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

У меня такая же проблема с 'pysimplesoap ', и этот ответ поможет мне сохранить мой день –

+1

Вы могли бы объединить две строки следующим образом: logging.getLogger ('request'). setLevel (logging.WARNING) – jpoppe

+0

@JasperPoppe Спасибо за это предложение. – aknuds1

12

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

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

Какой смысл быть более конкретным, чем просто «запросы», хотя, из практического POV? – aknuds1

+0

Но что вы получаете, вызывая logging.getLogger ("request.packages.urllib3") вместо logging.getLogger («запросы»), учитывая, что вы хотите повлиять на регистрацию библиотеки запросов? – aknuds1

+0

Вы хотите включить ведение журнала в запросах.packages.urllib3? Если это так, вы отвечаете на неправильный вопрос. – aknuds1

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

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

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

+2

Я предлагаю использовать 'setLevel (logging.WARNING)' для регистрации также возможных предупреждений и сообщений об ошибках. – razz0

8

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

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

Это работает и для проектов на основе Django. –

-1

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

+2

Я не нашел этот метод в своей версии. Отключение предупреждений является чрезмерным, так как раздражающие сообщения являются уровнями 'INFO'. – tripleee

-1

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

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

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

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

42

В случае, если вы пришли сюда, ища способ изменить регистрацию любого (возможно, глубоко вложенного) модуля, используйте 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) 
+1

Спасибо, это помогло мне отключить сообщения журнала 'urllib3' при использовании' boto3'. В этом случае регистратором является 'botocore.vendored.requests.packages.urllib3', поэтому я использовал это:' logging.getLogger ("botocore.vendored.requests.packages.urllib3"). SetLevel (logging.WARNING) 'и I наконец, избавился от сообщений. –

+0

Большое спасибо за это! Изменение критериев печати позволило мне изолировать, что python-elasticsearch был виновником в моем случае. –

+0

Помните, что это не сработает, когда модули создадут свои регистраторы внутри своего класса, который вы вызовете позже, например, 'APScheduler', когда вы вызываете' BackgroundScheduler.BackgroundScheduler() '. – user136036

-1

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

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

[loggers] 
keys = root, urllib3 

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

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

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

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

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

0

Нет причин для импорта протоколирования, просто сделать это:

requests.packages.urllib3.disable_warnings() 
Смежные вопросы