Як відключити повідомлення журналу з бібліотеки запитів?


367

За замовчуванням бібліотека запитів python записує повідомлення в журнал на консоль відповідно до рядків:

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

Мені зазвичай не цікаві ці повідомлення, і я хотів би їх відключити. Що було б найкращим способом заглушити ці повідомлення або зменшити багатослівність запитів?


Відповіді:


573

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

import logging

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

Якщо ви бажаєте застосувати це налаштування і для бібліотеки urllib3 (зазвичай використовується запитами), додайте наступне:

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

4
У мене те саме питання pysimplesoap, і ця відповідь допоможе мені врятувати свій день
Джаніт Чінтхана

2
Ви можете поєднати два такі рядки: logging.getLogger ('прохання'). SetLevel (logging.WARNING)
jpoppe

7
Мені довелося додати цей рядок для реєстратора "urllib3", щоб придушити повідомлення журналу запитів.
dgassaway

9
Мені потрібно було імпортувати лісозаготівлю; logging.getLogger ("urllib3"). setLevel (logging.WARNING) теж. Журнал для запитів не перешкоджає цим повідомленням.
m_messiah

4
Чомусь при використанні бібліотеки запитів у python3 вам потрібно зробити, getLogger("urllib3")щоб придушити повідомлення.
robru

104

Якщо ви завітали сюди, шукаючи спосіб зміни журналу будь-якого (можливо, глибоко вкладеного) модуля, використовуйте 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 у коментарі має на увазі, що цей метод показує лише реєстратори, які існують у момент запуску вищевказаного фрагмента. Якщо, наприклад, модуль створює новий реєстратор, коли інстанціює клас, тоді ви повинні поставити цей фрагмент після створення класу, щоб надрукувати його ім'я.


3
Дякую, це допомогло мені замовкнути urllib3повідомлення журналу під час використання boto3. Реєстратор у такому випадку є botocore.vendored.requests.packages.urllib3, тому я використав це: logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)і нарешті позбувся повідомлень.
Боб Дем

Велике спасибі за це! Змінення критеріїв друку дозволило мені виділити, що винуватцем пітон-еластичного дослідження було в моєму випадку.
Роберт Таунлі

2
Майте на увазі, що це не спрацює, коли модулі створюють свої реєстратори всередині свого класу, до якого ви б зателефонували пізніше, як це APSchedulerробиться під час дзвінка BackgroundScheduler.BackgroundScheduler().
користувач136036

@ user136036: об'єкти реєстратора - одинакові, не має значення, якщо ви або бібліотека отримаєте їх створити першими. Якщо ви будете використовувати те саме ім’я, яке використовує бібліотека, воно буде працювати .
Martijn Pieters

1
Я думаю, що вони говорять, що якщо ви перерахуєте реєстратори до того, як бібліотека створила свій реєстратор, вона не буде вказана. Що правильно.
kbrose

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

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

Таким чином, ви можете продовжувати використовувати level = INFO для своїх журнальних повідомлень ... просто змініть це для бібліотеки, яку ви використовуєте.


4
Я пропоную використовувати setLevel(logging.WARNING)для реєстрації також можливі повідомлення попередження та помилки.
razz0

14

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

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

Який сенс бути більш конкретним, ніж просто "запити", однак від практичного POV?
aknuds1

Але що ви отримуєте, зателефонувавши logging.getLogger ("request.packages.urllib3") замість logging.getLogger ("запити"), вважаючи, що ви хочете вплинути на реєстрацію бібліотеки запитів?
aknuds1

Ви маєте на увазі, що хочете ввімкнути вхід у систему request.packages.urllib3? Якщо так, ви відповідаєте на неправильне запитання.
aknuds1

@ aknuds1 Ви вирішуєте, чи хочете вимкнути або ввімкнути їх, я поставлю лише той код, який повністю контролює це :)
sorin

3
Я думаю, ви неправильно зрозуміли мету питання.
aknuds1

14

Для всіх, хто використовує, logging.config.dictConfigви можете змінити рівень журналу бібліотеки запитів у словнику таким чином:

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

@SebastianWagner Django використовує dictConfigпід кришкою.
uhbif19

Дуже дякую! Це досить добре. Одне місце для керування всіма журналами бібліотеки !! :)
МехмедБ

5

Визначення імені реєстратора як для мене, 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
    },

де встановлені ці рівні?
javadba

Я маю їх у налаштуваннях Джанго, у base.py. Де їх розмістити, звичайно, залежить від налаштування вашого проекту.
Мікко

2

Якщо у вас є файл конфігурації, ви можете його налаштувати.

Додати urllib3 у розділ реєстраторів:

[loggers]
keys = root, urllib3

Додати розділ logger_urllib3:

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

Це абсолютно правильна відповідь для людей, які використовують файл конфігурації. Не впевнені, чому вона отримала стільки голосів, що не мають права
Патрік

1

Ця відповідь тут: 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")

1
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

0

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

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

Публікація тут у випадку, якщо хтось інший бачить, як недійсні повідомлення журналу надходять, коли вони виконують запит Elasticsearch.


-1

просто: просто додайте requests.packages.urllib3.disable_warnings()післяimport requests


2
Я не знайшов цей метод у своїй версії. Відключення попереджень надмірне, оскільки дратівливі повідомлення рівні INFO.
трійка

-1

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

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

В основному, додавання змінної середовища в контексті виконання сценарію.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.