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


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.