Estou usando solicitações de python . Preciso depurar alguma OAuth
atividade e, para isso, gostaria que ele registrasse todas as solicitações realizadas. Eu poderia obter essas informações com ngrep
, mas infelizmente não é possível fazer o grep de conexões https (que são necessárias para OAuth
)
Como posso ativar o registro de todos os URLs (+ parâmetros) que Requests
está acessando?
python
logging
python-requests
blueFast
fonte
fonte
Respostas:
A
urllib3
biblioteca subjacente registra todas as novas conexões e URLs com ologging
módulo , mas não osPOST
corpos. ParaGET
solicitações, isso deve ser suficiente:que oferece a opção de registro mais detalhada; veja o registro HOWTO para mais detalhes sobre como configurar níveis de registro e destinos.
Demonstração curta:
Dependendo da versão exata do urllib3, as seguintes mensagens são registradas:
INFO
: RedirecionaWARN
: Pool de conexão cheio (se isso acontecer, aumente o tamanho do pool de conexão)WARN
: Falha ao analisar os cabeçalhos (cabeçalhos de resposta com formato inválido)WARN
: Tentando a conexão novamenteWARN
: O certificado não corresponde ao nome de host esperadoWARN
: Resposta recebida com Content-Length e Transfer-Encoding, ao processar uma resposta fragmentadaDEBUG
: Novas conexões (HTTP ou HTTPS)DEBUG
: Conexões perdidasDEBUG
: Detalhes da conexão: método, caminho, versão HTTP, código de status e comprimento da respostaDEBUG
: Repetir incrementos de contagemIsso não inclui cabeçalhos ou corpos.
urllib3
usa ahttp.client.HTTPConnection
classe para fazer o trabalho pesado, mas essa classe não oferece suporte para registro, normalmente só pode ser configurada para imprimir em stdout. No entanto, você pode prepará-lo para enviar todas as informações de depuração para o registro, em vez de introduzir umprint
nome alternativo nesse módulo:A chamada
httpclient_logging_patch()
faz com que ashttp.client
conexões enviem todas as informações de depuração para um registrador padrão e, portanto, são coletadas porlogging.basicConfig()
:fonte
access_token
na solicitação OAuth. O Linkedin está reclamando de uma solicitação não autorizada e quero verificar se a biblioteca que estou usando (rauth
alémrequests
) está enviando esse token com a solicitação. Eu esperava ver isso como um parâmetro de consulta, mas talvez esteja nos cabeçalhos de solicitação. Como posso forçar aurllib3
mostrar os cabeçalhos também? E o corpo do pedido? Para simplificar: como posso ver a solicitação FULL ?httplib
. Eu gostaria que a biblioteca fosse usada em seulogging
lugar; a saída de depuração é gravada diretamente no stdout, em vez de permitir que você redirecione para um destino de log de sua escolha.Você precisa habilitar a depuração no
httplib
nível (requests
→urllib3
→httplib
).Aqui estão algumas funções para alternar (
..._on()
e..._off()
) ou ativá-lo temporariamente:Uso de demonstração:
Você verá REQUEST, incluindo HEADERS e DATA, e RESPONSE com HEADERS, mas sem DATA. A única coisa que falta é a resposta.body que não está registrada.
Fonte
fonte
httplib.HTTPConnection.debuglevel = 1
para obter os cabeçalhos - excelente! Mas acho que obtenho os mesmos resultados usando apenaslogging.basicConfig(level=logging.DEBUG)
no lugar de suas outras 5 linhas. Estou esquecendo de algo? Acho que pode ser uma maneira de definir diferentes níveis de registro para a raiz e para o urllib3, se desejar.httplib.HTTPConnection.debuglevel = 2
permitirá a impressão do corpo do POST também.httplib.HTTPConnection.debuglevel = 1
é suficiente @ Mandible79$ curl https://raw.githubusercontent.com/python/cpython/master/Lib/http/client.py |grep debuglevel
é sempredebuglevel > 0
Para aqueles que usam python 3+
fonte
stdout
. Exemplo de problema aqui: stackoverflow.com/q/58738195/1090360Ao tentar fazer com que o sistema de registro Python (
import logging
) emita mensagens de registro de depuração de baixo nível, fiquei surpreso ao descobrir que:que
urllib3
usa apenas ologging
sistema Python :requests
nãohttp.client.HTTPConnection
nãourllib3
simClaro, você pode extrair mensagens de depuração
HTTPConnection
definindo:mas essas saídas são simplesmente emitidas por meio da
print
instrução. Para provar isso, simplesmente execute um grep noclient.py
código-fonte do Python 3.7 e veja você mesmo as instruções de impressão (obrigado @Yohann):Presumivelmente, redirecionar o stdout de alguma forma pode funcionar para colocar o stdout no sistema de registro e potencialmente capturar, por exemplo, um arquivo de registro.
Escolha o '
urllib3
' logger not 'requests.packages.urllib3
'Para capturar
urllib3
informações de depuração por meio dologging
sistema Python 3 , ao contrário de muitos conselhos na Internet, e como @MikeSmith aponta, você não terá muita sorte em interceptar:em vez disso, você precisa:
Depurando
urllib3
para um arquivo de logAqui está um código que registra o
urllib3
funcionamento em um arquivo de registro usando ologging
sistema Python :o resultado:
Habilitando o
HTTPConnection.debuglevel
instruções print ()Se você definir
HTTPConnection.debuglevel = 1
você obterá a saída do extrato de impressão de informações adicionais de baixo nível:
Lembre-se de que esta saída usa
print
e não ologging
sistema Python e, portanto, não pode ser capturada usando umlogging
fluxo tradicional ou gerenciador de arquivos (embora seja possível capturar a saída para um arquivo redirecionando stdout) .Combine os dois acima - maximize todos os registros possíveis para o console
Para maximizar todos os registros possíveis, você deve se contentar com a saída do console / stdout com isto:
dando toda a gama de produção:
fonte
Estou usando o python 3.4, solicitações 2.19.1:
'urllib3' é o registrador a ser obtido agora (não mais 'requests.packages.urllib3'). O registro básico ainda acontecerá sem configurar http.client.HTTPConnection.debuglevel
fonte
Tendo um script ou mesmo um subsistema de uma aplicação para depuração de protocolo de rede, é desejável ver quais são exatamente os pares solicitação-resposta, incluindo URLs efetivos, cabeçalhos, cargas úteis e o status. E normalmente não é prático instrumentar solicitações individuais em todos os lugares. Ao mesmo tempo, há considerações de desempenho que sugerem o uso de um único (ou poucos especializados)
requests.Session
, portanto, o seguinte pressupõe que a sugestão seja seguida.requests
suporta os chamados ganchos de evento (a partir de 2.23, na verdade, só háresponse
ganchos). É basicamente um ouvinte de evento e o evento é emitido antes de retornar o controle derequests.request
. Neste momento, a solicitação e a resposta estão totalmente definidas, portanto, podem ser registradas.É basicamente assim que registrar todas as viagens de ida e volta HTTP de uma sessão.
Formatando registros de log de ida e volta de HTTP
Para que o registro acima seja útil, pode haver um formatador de registro especializado que entende
req
eres
extras nos registros de registro. Pode ser assim:Agora, se você fizer algumas solicitações usando o
session
, como:A saída para
stderr
será a seguinte.Uma maneira de GUI
Quando você tem muitas consultas, ter uma IU simples e uma maneira de filtrar registros é útil. Vou mostrar como usar o Chronologer para isso (do qual sou o autor).
Primeiro, o gancho foi reescrito para produzir registros que
logging
podem ser serializados durante o envio por fio. Pode ser assim:Em segundo lugar, a configuração de registro deve ser adaptada para uso
logging.handlers.HTTPHandler
(o que o Chronologer entende).Finalmente, execute a instância do Chronologer. por exemplo, usando Docker:
E execute as solicitações novamente:
O gerenciador de fluxo produzirá:
Agora, se você abrir http: // localhost: 8080 / (use "logger" para nome de usuário e senha vazia para o pop-up de autenticação básica) e clicar no botão "Abrir", você verá algo como:
fonte