J'utilise des requêtes python . J'ai besoin de déboguer une OAuth
activité, et pour cela, je voudrais qu'il enregistre toutes les demandes en cours. Je pourrais obtenir ces informations avec ngrep
, mais malheureusement, il n'est pas possible de grep les connexions https (qui sont nécessaires pour OAuth
)
Comment puis-je activer la journalisation de toutes les URL (+ paramètres) qui Requests
accèdent?
python
logging
python-requests
blueFast
la source
la source
Réponses:
La
urllib3
bibliothèque sous-jacente enregistre toutes les nouvelles connexions et URL avec lelogging
module , mais pas lesPOST
corps. Pour lesGET
demandes, cela devrait suffire:ce qui vous donne l'option de journalisation la plus détaillée; voir le HOWTO de journalisation pour plus de détails sur la configuration des niveaux de journalisation et des destinations.
Démo courte:
Selon la version exacte de urllib3, les messages suivants sont enregistrés:
INFO
: RedirigeWARN
: Pool de connexions plein (si cela se produit souvent, augmentez la taille du pool de connexions)WARN
: Échec de l'analyse des en-têtes (en-têtes de réponse au format non valide)WARN
: Nouvelle tentative de connexionWARN
: Le certificat ne correspond pas au nom d'hôte attenduWARN
: Réponse reçue avec à la fois Content-Length et Transfer-Encoding, lors du traitement d'une réponse fragmentéeDEBUG
: Nouvelles connexions (HTTP ou HTTPS)DEBUG
: Connexions interrompuesDEBUG
: Détails de la connexion: méthode, chemin, version HTTP, code d'état et longueur de la réponseDEBUG
: Incréments du nombre de tentativesCela n'inclut pas les en-têtes ou les corps.
urllib3
utilise lahttp.client.HTTPConnection
classe pour faire le grunt-work, mais cette classe ne prend pas en charge la journalisation, elle ne peut normalement être configurée que pour imprimer sur stdout. Cependant, vous pouvez le configurer pour envoyer toutes les informations de débogage à la journalisation en introduisant unprint
nom alternatif dans ce module:L'appel
httpclient_logging_patch()
amène leshttp.client
connexions à afficher toutes les informations de débogage vers un enregistreur standard, et sont donc récupérées parlogging.basicConfig()
:la source
access_token
dans la requête OAuth. Linkedin se plaint d'une demande non autorisée et je souhaite vérifier si la bibliothèque que j'utilise (rauth
en plusrequests
) envoie ce jeton avec la demande. Je m'attendais à voir cela comme un paramètre de requête, mais peut-être que c'est dans les en-têtes de la demande? Comment puis-je forcer leurllib3
à afficher également les en-têtes? Et le corps de la demande? Pour simplifier les choses: comment puis-je voir la demande FULL ?httplib
. Je souhaite que cette bibliothèque soit utilisée à lalogging
place; la sortie de débogage est écrite directement sur stdout plutôt que de vous laisser la rediriger vers une destination de journal de votre choix.Vous devez activer le débogage au
httplib
niveau (requests
→urllib3
→httplib
).Voici quelques fonctions à la fois pour basculer (
..._on()
et..._off()
) ou pour l'activer temporairement:Utilisation de la démonstration:
Vous verrez la DEMANDE, y compris les EN-TÊTES et les DONNÉES, et la RÉPONSE avec les EN-TÊTES mais sans les DONNÉES. La seule chose qui manque sera le response.body qui n'est pas enregistré.
La source
la source
httplib.HTTPConnection.debuglevel = 1
pour obtenir les en-têtes - excellent! Mais je pense que j'obtiens les mêmes résultats en utilisant justelogging.basicConfig(level=logging.DEBUG)
à la place de vos 5 autres lignes. Est-ce que je manque quelque chose? Je suppose que cela pourrait être un moyen de définir différents niveaux de journalisation pour la racine par rapport à l'urllib3, si vous le souhaitez.httplib.HTTPConnection.debuglevel = 2
permettra également l'impression du corps du POST.httplib.HTTPConnection.debuglevel = 1
est assez @ Mandible79$ curl https://raw.githubusercontent.com/python/cpython/master/Lib/http/client.py |grep debuglevel
c'est toujoursdebuglevel > 0
Pour ceux qui utilisent python 3+
la source
stdout
. Exemple de problème ici: stackoverflow.com/q/58738195/1090360En essayant de faire en sorte que le système de journalisation Python (
import logging
) émette des messages de journal de débogage de bas niveau, il m'a surpris de découvrir que:qui
urllib3
utilise uniquement lelogging
système Python :requests
nonhttp.client.HTTPConnection
nonurllib3
OuiBien sûr, vous pouvez extraire les messages de débogage
HTTPConnection
en définissant:mais ces sorties sont simplement émises via l'
print
instruction. Pour le prouver, grep simplement leclient.py
code source de Python 3.7 et affichez les instructions d'impression vous-même (merci @Yohann):On peut supposer que la redirection de stdout d'une manière ou d'une autre pourrait fonctionner vers une sortie stdout dans le système de journalisation et potentiellement capturer, par exemple, un fichier journal.
Choisissez le '
urllib3
' logger not 'requests.packages.urllib3
'Pour capturer des
urllib3
informations de débogage via lelogging
système Python 3 , contrairement à de nombreux conseils sur Internet, et comme le souligne @MikeSmith, vous n'aurez pas beaucoup de chance d'intercepter:à la place, vous devez:
Débogage
urllib3
dans un fichier journalVoici un code qui enregistre le
urllib3
fonctionnement dans un fichier journal à l'aide dulogging
système Python :le résultat:
Activation des
HTTPConnection.debuglevel
instructions print ()Si vous définissez
HTTPConnection.debuglevel = 1
vous obtiendrez la sortie de l'instruction d' impression d'informations supplémentaires juteuses de bas niveau:
Souvenez-vous que cette sortie utilise
print
et non lelogging
système Python , et ne peut donc pas être capturée à l'aide d'unlogging
flux ou d'un gestionnaire de fichiers traditionnel (bien qu'il soit possible de capturer la sortie vers un fichier en redirigeant stdout) .Combinez les deux ci-dessus - maximisez toute la journalisation possible sur la console
Pour maximiser toute la journalisation possible, vous devez vous contenter de la sortie console / stdout avec ceci:
donnant la gamme complète de sortie:
la source
J'utilise python 3.4, demande 2.19.1:
'urllib3' est le logger à obtenir maintenant (et non plus 'requests.packages.urllib3'). La journalisation de base se produira toujours sans définir http.client.HTTPConnection.debuglevel
la source
Ayant un script ou même un sous-système d'une application pour le débogage d'un protocole réseau, il est souhaitable de voir quelles sont exactement les paires demande-réponse, y compris les URL efficaces, les en-têtes, les charges utiles et l'état. Et il est généralement peu pratique d'instrumenter des demandes individuelles partout. Dans le même temps, il existe des considérations de performances qui suggèrent d'utiliser un seul (ou quelques spécialistes)
requests.Session
, de sorte que ce qui suit suppose que la suggestion est suivie.requests
prend en charge ce que l'on appelle les hooks d'événement (à partir de 2.23, il n'y a en fait qu'unresponse
hook). Il s'agit essentiellement d'un écouteur d'événement, et l'événement est émis avant de renvoyer le contrôlerequests.request
. À ce moment, la demande et la réponse sont entièrement définies et peuvent donc être enregistrées.C'est essentiellement comment enregistrer tous les aller-retour HTTP d'une session.
Formatage des enregistrements de journal HTTP aller-retour
Pour que la journalisation ci-dessus soit utile, il peut y avoir un formateur de journalisation spécialisé qui comprend
req
et desres
extras sur les enregistrements de journalisation. Cela peut ressembler à ceci:Maintenant, si vous faites des requêtes en utilisant le
session
, comme:La sortie vers
stderr
ressemblera à ceci.Une manière GUI
Lorsque vous avez beaucoup de requêtes, il est pratique de disposer d'une interface utilisateur simple et d'un moyen de filtrer les enregistrements. Je vais montrer comment utiliser Chronologer pour cela (dont je suis l'auteur).
Tout d'abord, le hook a été réécrit pour produire des enregistrements qui
logging
peuvent être sérialisés lors de l'envoi sur le fil. Cela peut ressembler à ceci:Deuxièmement, la configuration de la journalisation doit être adaptée à l'utilisation
logging.handlers.HTTPHandler
(ce que Chronologer comprend).Enfin, exécutez l'instance Chronologer. par exemple en utilisant Docker:
Et exécutez à nouveau les requêtes:
Le gestionnaire de flux produira:
Maintenant, si vous ouvrez http: // localhost: 8080 / (utilisez "logger" pour le nom d'utilisateur et un mot de passe vide pour la fenêtre contextuelle d'authentification de base) et cliquez sur le bouton "Ouvrir", vous devriez voir quelque chose comme:
la source