Ich verwende Python- Anfragen . Ich muss einige OAuth
Aktivitäten debuggen , und dafür möchte ich, dass alle ausgeführten Anforderungen protokolliert werden. Ich könnte diese Informationen mit erhalten ngrep
, aber leider ist es nicht möglich, https-Verbindungen zu erfassen (die für benötigt werden OAuth
)
Wie kann ich die Protokollierung aller URLs (+ Parameter) aktivieren, auf die zugegriffen Requests
wird?
python
logging
python-requests
blueFast
quelle
quelle
Antworten:
Die zugrunde liegende
urllib3
Bibliothek protokolliert alle neuen Verbindungen und URLs mit demlogging
Modul , jedoch keinePOST
Körper. FürGET
Anfragen sollte dies ausreichen:Dies gibt Ihnen die ausführlichste Protokollierungsoption. Weitere Informationen zum Konfigurieren von Protokollierungsstufen und -zielen finden Sie im Protokollierungs-HOWTO .
Kurze Demo:
Abhängig von der genauen Version von urllib3 werden die folgenden Nachrichten protokolliert:
INFO
: WeiterleitungenWARN
: Verbindungspool voll (wenn dies passiert, erhöhen Sie häufig die Größe des Verbindungspools)WARN
: Fehler beim Analysieren von Headern (Antwortheader mit ungültigem Format)WARN
: Wiederholen der VerbindungWARN
: Zertifikat stimmte nicht mit dem erwarteten Hostnamen übereinWARN
: Empfangene Antwort mit Inhaltslänge und Übertragungscodierung, wenn eine Blockantwort verarbeitet wirdDEBUG
: Neue Verbindungen (HTTP oder HTTPS)DEBUG
: Verbindungen wurden unterbrochenDEBUG
: Verbindungsdetails: Methode, Pfad, HTTP-Version, Statuscode und AntwortlängeDEBUG
: Wiederholen Sie die Anzahl der SchritteDies schließt keine Überschriften oder Körper ein.
urllib3
Verwendet diehttp.client.HTTPConnection
Klasse, um die Grunzarbeit zu erledigen, aber diese Klasse unterstützt keine Protokollierung. Sie kann normalerweise nur so konfiguriert werden, dass sie auf stdout druckt . Sie können es jedoch so manipulieren, dass stattdessen alle Debug-Informationen an die Protokollierung gesendet werden, indem Sie einen alternativenprint
Namen in dieses Modul einfügen:Das Aufrufen
httpclient_logging_patch()
bewirkt, dasshttp.client
Verbindungen alle Debug-Informationen an einen Standard-Logger ausgeben und daher von folgenden Personen abgerufen werdenlogging.basicConfig()
:quelle
access_token
in der OAuth-Anfrage. Linkedin beschwert sich über nicht autorisierte Anfragen und ich möchte überprüfen, ob die Bibliothek, die ich (rauth
überrequests
) verwende, dieses Token mit der Anfrage sendet. Ich hatte erwartet, das als Abfrageparameter zu sehen, aber vielleicht ist es in den Anforderungsheadern? Wie kann ich das zwingenurllib3
, auch die Header anzuzeigen? Und die Anforderungsstelle? Um es einfach zu machen: Wie kann ich die vollständige Anfrage sehen?httplib
. Ich wünsche mir, dass diese Bibliotheklogging
stattdessen verwendet wird. Die Debug-Ausgabe wird direkt in stdout geschrieben, anstatt dass Sie sie an ein Protokollziel Ihrer Wahl umleiten können.Sie müssen das Debuggen auf
httplib
Ebene aktivieren (requests
→urllib3
→httplib
) .Hier sind einige Funktionen zum Umschalten (
..._on()
und..._off()
) oder zum vorübergehenden Aktivieren:Demo-Nutzung:
Sie sehen die ANFRAGE, einschließlich HEADERS und DATA, und RESPONSE mit HEADERS, jedoch ohne DATA. Das einzige, was fehlt, ist die response.body, die nicht protokolliert ist.
Quelle
quelle
httplib.HTTPConnection.debuglevel = 1
, um die Header zu erhalten - ausgezeichnet! Aber ich denke, ich erhalte die gleichen Ergebnisse, wenn ich nurlogging.basicConfig(level=logging.DEBUG)
Ihre anderen 5 Zeilen verwende. Vermisse ich etwas Ich denke, es könnte eine Möglichkeit sein, auf Wunsch unterschiedliche Protokollierungsstufen für die Wurzel gegenüber der urllib3 festzulegen.httplib.HTTPConnection.debuglevel = 2
ermöglicht auch das Drucken des POST-Körpers.httplib.HTTPConnection.debuglevel = 1
ist genug @ Mandible79$ curl https://raw.githubusercontent.com/python/cpython/master/Lib/http/client.py |grep debuglevel
es ist immerdebuglevel > 0
Für diejenigen, die Python 3+ verwenden
quelle
stdout
. Problembeispiel hier: stackoverflow.com/q/58738195/1090360Als ich versuchte, das Python-Protokollierungssystem (
import logging
) dazu zu bringen, Debug-Protokollnachrichten auf niedriger Ebene auszugeben, war ich überrascht, dass Folgendes festgestellt wurde:das
urllib3
benutzt eigentlich nur das Python-logging
System:requests
Neinhttp.client.HTTPConnection
Neinurllib3
JaNatürlich können Sie Debug-Meldungen extrahieren,
HTTPConnection
indem Sie Folgendes festlegen :Diese Ausgaben werden jedoch lediglich über die
print
Anweisung ausgegeben. Um dies zu beweisen,client.py
durchsuchen Sie einfach den Python 3.7- Quellcode und sehen Sie sich die print-Anweisungen selbst an (danke @Yohann):Vermutlich könnte das Umleiten von stdout auf irgendeine Weise dazu führen, dass stdout in das Protokollierungssystem eingeschlagen und möglicherweise in eine Protokolldatei erfasst wird.
Wählen Sie die ‚
urllib3
‘ Logger nicht ‚requests.packages.urllib3
‘Um
urllib3
Debug-Informationen über das Python 3-logging
System zu erfassen , haben Sie entgegen vieler Ratschläge im Internet und wie @MikeSmith betont, nicht viel Glück beim Abfangen:Stattdessen müssen Sie:
Debuggen
urllib3
in eine ProtokolldateiHier ist ein Code, der die
urllib3
Arbeit mit dem Python-logging
System in einer Protokolldatei protokolliert :das Ergebnis:
Aktivieren der
HTTPConnection.debuglevel
print () - AnweisungenWenn Sie einstellen
HTTPConnection.debuglevel = 1
Sie werden die erhaltenen Druck Anweisung Ausgabe zusätzlicher saftig niedriges Niveau info:
Denken Sie daran, dass diese Ausgabe
print
nicht das Python-logging
System verwendet und daher nicht mit einem herkömmlichenlogging
Stream oder File-Handler erfasst werden kann (obwohl es möglicherweise möglich ist, die Ausgabe in eine Datei zu erfassen, indem Sie stdout umleiten). .Kombinieren Sie die beiden oben genannten Punkte - maximieren Sie alle möglichen Protokollierungen an der Konsole
Um die gesamte mögliche Protokollierung zu maximieren, müssen Sie sich mit der Konsolen- / Standardausgabe zufrieden geben:
Geben Sie den gesamten Ausgabebereich:
quelle
Ich verwende Python 3.4, Anfragen 2.19.1:
'urllib3' ist der Logger, der jetzt abgerufen werden soll (nicht mehr 'request.packages.urllib3'). Die grundlegende Protokollierung wird weiterhin durchgeführt, ohne dass http.client.HTTPConnection.debuglevel festgelegt wird
quelle
Mit einem Skript oder sogar einem Subsystem einer Anwendung für ein Netzwerkprotokoll-Debugging ist es wünschenswert zu sehen, welche Anforderungs-Antwort-Paare genau sind, einschließlich effektiver URLs, Header, Nutzdaten und des Status. Und es ist normalerweise unpraktisch, individuelle Anfragen überall zu instrumentieren. Gleichzeitig gibt es Leistungsüberlegungen, die die Verwendung einzelner (oder weniger spezialisierter) Vorschläge vorschlagen.
requests.Session
Im Folgenden wird daher davon ausgegangen, dass der Vorschlag vorliegt befolgt wird.requests
unterstützt sogenannte Event-Hooks (ab 2.23 gibt es eigentlich nur noch Hooksresponse
). Es ist im Grunde ein Ereignis-Listener, und das Ereignis wird ausgegeben, bevor die Kontrolle von zurückgegeben wirdrequests.request
. In diesem Moment sind sowohl Anforderung als auch Antwort vollständig definiert und können daher protokolliert werden.Auf diese Weise werden im Grunde alle HTTP-Roundtrips einer Sitzung protokolliert.
Formatieren von HTTP-Roundtrip-Protokolldatensätzen
Damit die obige Protokollierung nützlich ist, kann es einen speziellen Protokollierungsformatierer geben , der die Protokollierungsdatensätze versteht
req
und zusätzliche Funktionen bietetres
. Es kann so aussehen:Wenn Sie nun einige Anfragen mit dem folgenden Befehl ausführen
session
:Die Ausgabe von
stderr
sieht wie folgt aus.Ein GUI-Weg
Wenn Sie viele Fragen haben, ist eine einfache Benutzeroberfläche und eine Möglichkeit zum Filtern von Datensätzen hilfreich. Ich werde zeigen, Chronologer dafür zu verwenden (von dem ich der Autor bin).
Zunächst muss der Hook neu geschrieben werden, um Datensätze zu erstellen,
logging
die beim Senden über das Kabel serialisiert werden können. Es kann so aussehen:Zweitens muss die Protokollierungskonfiguration an die Verwendung angepasst werden
logging.handlers.HTTPHandler
(was Chronologer versteht).Führen Sie abschließend die Chronologer-Instanz aus. zB mit Docker:
Führen Sie die Anforderungen erneut aus:
Der Stream-Handler erzeugt:
Wenn Sie nun http: // localhost: 8080 / öffnen (verwenden Sie "logger" als Benutzernamen und leeres Kennwort für das grundlegende Authentifizierungs-Popup) und auf die Schaltfläche "Öffnen" klicken, sollten Sie Folgendes sehen:
quelle