it-swarm.com.de

Wie deaktiviere ich Protokollnachrichten aus der Anforderungsbibliothek?

Standardmäßig schreibt die Bibliothek Requests python Protokollnachrichten in die Konsole.

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

Ich bin normalerweise nicht an diesen Nachrichten interessiert und möchte sie deaktivieren. Was wäre der beste Weg, um diese Nachrichten zum Schweigen zu bringen oder die Ausführlichkeit von Requests zu verringern?

299
aknuds1

Ich habe herausgefunden, wie man die Protokollierungsstufe von request konfiguriert, dies geschieht über das Standardmodul logging . Ich entschied mich dazu, es so zu konfigurieren, dass keine Meldungen protokolliert werden, es sei denn, es handelt sich mindestens um Warnungen:

import logging

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

Wenn Sie diese Einstellung auch für die urllib3-Bibliothek (normalerweise von Anforderungen verwendet) anwenden möchten, fügen Sie Folgendes hinzu:

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

Wenn Sie hierher gekommen sind, um nach einer Möglichkeit zu suchen, die Protokollierung eines (möglicherweise tief verschachtelten) Moduls zu ändern, verwenden Sie logging.Logger.manager.loggerDict, um ein Wörterbuch aller Logger-Objekte zu erhalten. Die zurückgegebenen Namen können dann als Argument für logging.getLogger verwendet werden:

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)

Beachten Sie, dass diese Methode Ihnen pro Benutzer136036 in einem Kommentar nur die Logger anzeigt, die zu dem Zeitpunkt vorhanden sind, zu dem Sie das obige Snippet ausführen. Wenn ein Modul beispielsweise einen neuen Logger erstellt, wenn Sie eine Klasse instanziieren, müssen Sie dieses Snippet after erstellen, um die Klasse zu drucken, um den Namen zu drucken.

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

Auf diese Weise werden alle Meldungen von level = INFO von urllib3 nicht in der Protokolldatei vorhanden sein.

Sie können also weiterhin die Ebene = INFO für Ihre Protokollnachrichten verwenden. Ändern Sie dies einfach für die von Ihnen verwendete Bibliothek.

27
shaolin

Lassen Sie mich den Dokumentationsabschnitt kopieren/einfügen, den ich vor ein oder zwei Wochen geschrieben habe, nachdem Sie ein ähnliches Problem wie Sie hatten:

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

Für jeden, der logging.config.dictConfig verwendet, können Sie den Protokollierungsgrad der Anforderungsbibliothek im Wörterbuch folgendermaßen ändern:

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

Wenn Sie eine Konfigurationsdatei haben, können Sie diese konfigurieren.

Fügen Sie urllib3 im Logger-Abschnitt hinzu:

[loggers]
keys = root, urllib3

Fügen Sie den Abschnitt logger_urllib3 hinzu:

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

Kbroses Anleitung zum Ermitteln, welcher Logger Logmeldungen generierte, war immens nützlich. Für mein Django-Projekt musste ich 120 verschiedene Logger sortieren, bis ich feststellte, dass es die elasticsearch Python-Bibliothek war, die mir Probleme bereitete. Gemäß den Anleitungen in den meisten Fragen habe ich diese deaktiviert, indem ich sie meinen Loggern hinzufügte:

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

Hier posten, falls jemand anderes die nicht hilfreichen Protokollnachrichten sieht, die durchlaufen werden, wenn er eine Elasticsearch-Abfrage ausführt.

0
Robert Townley

Das Einstellen des Loggernamens auf requests oder requests.urllib3 hat bei mir nicht funktioniert. Ich musste den genauen Namen des Loggers angeben, um den Logging-Level zu ändern.

Sehen Sie sich zuerst an, welche Logger Sie definiert haben und welche Sie entfernen möchten

print(logging.Logger.manager.loggerDict)

Und Sie werden so etwas sehen:

{...'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> ...}

Konfigurieren Sie dann den Pegel für den genauen Logger:

   'loggers': {
    '': {
        'handlers': ['default'],
        'level': 'DEBUG',
        'propagate': True
    },
    'urllib3.connectionpool': {
        'handlers': ['default'],
        'level': 'WARNING',
        'propagate' : False
    },
0
Mikko