2013-05-02 10 views
47

से सभी अनुरोध लॉग इन करें मैं पाइथन Requests का उपयोग कर रहा हूं। मुझे कुछ OAuth गतिविधि को डीबग करने की आवश्यकता है, और इसके लिए मैं इसे सभी अनुरोधों को लॉग इन करना चाहता हूं। मैं ngrep के साथ इस जानकारी मिल सकता है, लेकिन दुर्भाग्य से यह https कनेक्शन (जो OAuth के लिए आवश्यक हैं)पायथन-अनुरोध मॉड्यूल

मैं सभी यूआरएल (+ पैरामीटर) की प्रवेश कैसे सक्रिय कर सकता है कि Requests तक पहुँच रहा है grep करना संभव नहीं है?

+0

प्रतिक्रिया उन लोगों के लिए दिखाता है कि कैसे हेडर आप भेज रहे हैं सहित अभी तक अधिक लॉगिंग उत्पादन, प्राप्त करने के लिए। यह मार्टिजन के बजाए स्वीकार्य उत्तर होना चाहिए, जो हेडर को नहीं दिखाता है कि आप वायरसहार्क के माध्यम से हो रहे हैं और इसके बजाय अनुरोध को अनुकूलित कर रहे हैं। – nealmcb

उत्तर

40

अंतर्निहित urllib3 लाइब्रेरी logging module के साथ सभी नए कनेक्शन और यूआरएल लॉग करता है, लेकिन POST निकायों के साथ नहीं। GET अनुरोधों के लिए यह पर्याप्त होना चाहिए:

import logging 

logging.basicConfig(level=logging.DEBUG) 

जो आप सबसे वर्बोज़ लॉगिंग विकल्प देता है, लॉगिंग स्तर और गंतव्यों को कॉन्फ़िगर करने के तरीके के बारे में अधिक जानकारी के लिए logging HOWTO देखें।

लघु डेमो:

>>> import requests 
>>> import logging 
>>> logging.basicConfig(level=logging.DEBUG) 
>>> r = requests.get('http://httpbin.org/get?foo=bar&baz=python') 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org 
DEBUG:requests.packages.urllib3.connectionpool:"GET /get?foo=bar&baz=python HTTP/1.1" 200 353 

निम्न संदेश लॉग ऑन हैं:

  • INFO: नई कनेक्शन (HTTP या HTTPS)
  • INFO छोड़ा कनेक्शन
  • INFO: पुनर्निर्देश
  • WARN: कनेक्शन पूल पूर्ण
  • WARN (यह अक्सर कनेक्शन पूल का आकार बढ़ाने होता है अगर): पुन: प्रयास किया कनेक्शन
  • DEBUG: कनेक्शन का विवरण: विधि, पथ, HTTP संस्करण, स्थिति कोड और प्रतिक्रिया लंबाई
+0

आश्चर्यजनक रूप से पर्याप्त है, मुझे OAuth अनुरोध में 'access_token' दिखाई नहीं देता है।लिंक्डइन अनधिकृत अनुरोध के बारे में शिकायत कर रहा है, और मैं यह सत्यापित करना चाहता हूं कि मैं जिस लाइब्रेरी का उपयोग कर रहा हूं ('अनुरोध' के शीर्ष पर 'रूथ') अनुरोध के साथ टोकन भेज रहा है। मैं एक क्वेरी पैरामीटर के रूप में देखने की उम्मीद कर रहा था, लेकिन शायद यह अनुरोध हेडर में है? हेडर को दिखाने के लिए मैं 'urllib3' को कैसे मजबूर कर सकता हूं? और अनुरोध निकाय? बस इसे सरल बनाने के लिए: मैं ** पूर्ण ** अनुरोध कैसे देख सकता हूं? – dangonfast

+0

आप बिना पैचिंग के ऐसा कर सकते हैं, मुझे डर है। ऐसी समस्याओं का निदान करने का सबसे आम तरीका प्रॉक्सी या पैकेट लॉगर के साथ है (मैं पूर्ण अनुरोधों और प्रतिक्रियाओं को स्वयं प्राप्त करने के लिए वायरशर्क का उपयोग करता हूं)। मैंने देखा कि आपने इस विषय पर एक नया सवाल पूछा है। –

+1

निश्चित रूप से, मैं अभी वायरसहार्क के साथ डिबगिंग कर रहा हूं, लेकिन मुझे एक समस्या है: यदि मैं http करता हूं, तो मुझे पूर्ण पैकेट सामग्री दिखाई देती है, लेकिन लिंकडिन 401 लौटाता है, जिसकी अपेक्षा की जाती है, क्योंकि लिंकडिन https का उपयोग करने के लिए कहता है। लेकिन https के साथ यह काम नहीं कर रहा है, और मैं इसे डीबग नहीं कर सकता क्योंकि मैं वायरसहार्क के साथ टीएलएस परत का निरीक्षण नहीं कर सकता। – dangonfast

63

आपको httplib स्तर (requestsurllib3httplib पर डिबगिंग सक्षम करने की आवश्यकता है)।

यहाँ दोनों टॉगल (..._on() और ..._off()) करने के लिए कुछ कार्यों है या अस्थायी रूप से पर यह है:

import logging 
import contextlib 
try: 
    from http.client import HTTPConnection # py3 
except ImportError: 
    from httplib import HTTPConnection # py2 

def debug_requests_on(): 
    '''Switches on logging of the requests module.''' 
    HTTPConnection.debuglevel = 1 

    logging.basicConfig() 
    logging.getLogger().setLevel(logging.DEBUG) 
    requests_log = logging.getLogger("requests.packages.urllib3") 
    requests_log.setLevel(logging.DEBUG) 
    requests_log.propagate = True 

def debug_requests_off(): 
    '''Switches off logging of the requests module, might be some side-effects''' 
    HTTPConnection.debuglevel = 0 

    root_logger = logging.getLogger() 
    root_logger.setLevel(logging.WARNING) 
    root_logger.handlers = [] 
    requests_log = logging.getLogger("requests.packages.urllib3") 
    requests_log.setLevel(logging.WARNING) 
    requests_log.propagate = False 

@contextlib.contextmanager 
def debug_requests(): 
    '''Use with 'with'!''' 
    debug_requests_on() 
    yield 
    debug_requests_off() 

डेमो उपयोग:

>>> requests.get('http://httpbin.org/') 
<Response [200]> 

>>> debug_requests_on() 
>>> requests.get('http://httpbin.org/') 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org 
DEBUG:requests.packages.urllib3.connectionpool:"GET/HTTP/1.1" 200 12150 
send: 'GET/HTTP/1.1\r\nHost: httpbin.org\r\nConnection: keep-alive\r\nAccept- 
Encoding: gzip, deflate\r\nAccept: */*\r\nUser-Agent: python-requests/2.11.1\r\n\r\n' 
reply: 'HTTP/1.1 200 OK\r\n' 
header: Server: nginx 
... 
<Response [200]> 

>>> debug_requests_off() 
>>> requests.get('http://httpbin.org/') 
<Response [200]> 

>>> with debug_requests(): 
...  requests.get('http://httpbin.org/') 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): httpbin.org 
... 
<Response [200]> 

आप शीर्ष लेख और डेटा सहित अनुरोध, देखेंगे, और हेडर्स के साथ प्रतिक्रिया लेकिन डेटा के बिना। गायब होने वाली एकमात्र चीज प्रतिक्रिया होगी। कोई भी जो लॉग नहीं है।

Source

+0

का उपयोग कर के बारे में जानकारी के लिए धन्यवाद 'httplib.HTTPConnection.debuglevel = 1' पाने के लिए हेडर - उत्कृष्ट! लेकिन मुझे लगता है कि मुझे आपकी अन्य 5 लाइनों के स्थान पर केवल 'logging.basicConfig (level = logging.DEBUG)' का उपयोग करके एक ही परिणाम मिलते हैं। क्या मैं कुछ भूल रहा हूँ? मुझे लगता है कि अगर वांछित हो, तो रूट बनाम urllib3 के लिए अलग-अलग लॉगिंग स्तर सेट करने का एक तरीका हो सकता है। – nealmcb

+0

आपके पास अपने समाधान के साथ हेडर नहीं है। – Yohann

+5

'httplib.HTTPConnection.debuglevel = 2' पोस्ट बॉडी के प्रिंटिंग की अनुमति देगा। – Mandible79

21

@yohann से अजगर का उपयोग कर 3+

import requests 
import logging 
import http.client 

http.client.HTTPConnection.debuglevel = 1 

logging.basicConfig() 
logging.getLogger().setLevel(logging.DEBUG) 
requests_log = logging.getLogger("requests.packages.urllib3") 
requests_log.setLevel(logging.DEBUG) 
requests_log.propagate = True 
संबंधित मुद्दे