मैं अनुरोध लाइब्रेरी से लॉग संदेशों को कैसे अक्षम करूं?


367

डिफ़ॉल्ट रूप से, अनुरोध अजगर लाइब्रेरी कंसोल को लॉग संदेश लिखता है, की तर्ज पर:

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

मुझे आमतौर पर इन संदेशों में कोई दिलचस्पी नहीं है, और मैं उन्हें अक्षम करना चाहूंगा। उन संदेशों को चुप कराने या अनुरोधों की क्रियाशीलता को कम करने का सबसे अच्छा तरीका क्या होगा?


जवाबों:


573

मुझे पता चला कि अनुरोधों के लॉगिंग स्तर को कैसे कॉन्फ़िगर किया जाए, यह मानक लॉगिंग मॉड्यूल के माध्यम से किया जाता है । मैंने संदेश को लॉग न करने के लिए इसे कॉन्फ़िगर करने का निर्णय लिया जब तक कि वे कम से कम चेतावनी न दें:

import logging

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

यदि आप इस सेटिंग को urllib3 लाइब्रेरी के लिए लागू करना चाहते हैं (आमतौर पर अनुरोधों द्वारा उपयोग किया जाता है), तो निम्न जोड़ें:

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

4
मेरे पास एक ही मुद्दा है pysimplesoap, और यह उत्तर मुझे अपना दिन बचाने में मदद करता है
Janith Chinthana

2
आप इस तरह दो पंक्तियों को जोड़ सकते हैं: logging.getLogger ('request')। SetLevel (logging.WARNING)
jpoppe

7
मुझे अनुरोध लॉग संदेशों को दबाने के लिए "urllib3" लकड़हारे के लिए इस लाइन को जोड़ना पड़ा।
dgassaway

9
मुझे लॉगिंग आयात करने की आवश्यकता थी; logging.getLogger ("urllib3")। setLevel (logging.WARNING), भी। "अनुरोध" के लिए लकड़हारा इन संदेशों को नहीं रोकता है।
m_messiah

4
किसी कारण से जब python3 में अनुरोध लाइब्रेरी का उपयोग करते हैं तो आपको getLogger("urllib3")संदेशों को दबाने के लिए करना होगा।
बुत

104

यदि आप किसी भी (संभवत: गहरे नेस्टेड) ​​मॉड्यूल के लॉगिंग को संशोधित करने के तरीके की तलाश में यहां आए थे, तो logging.Logger.manager.loggerDictसभी लकड़हारा वस्तुओं का शब्दकोश प्राप्त करने के लिए उपयोग करें। फिर दिए गए नामों को तर्क के रूप में इस्तेमाल किया जा सकता है logging.getLogger:

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)

एक टिप्पणी में प्रति उपयोगकर्ता 136036, ध्यान रखें कि यह विधि केवल आपको लॉगर्स दिखाती है जो उस समय मौजूद है जब आप उपरोक्त स्निपेट चलाते हैं। यदि, उदाहरण के लिए, एक मॉड्यूल एक नया लकड़हारा बनाता है जब आप किसी वर्ग को तुरंत करते हैं, तो आपको उसका नाम प्रिंट करने के लिए कक्षा बनाने के बाद इस स्निपेट को डालना होगा ।


3
धन्यवाद, इसने मुझे urllib3लॉग इन संदेशों का उपयोग करने में मदद की boto3। ऐसे मामले में लकड़हारा है botocore.vendored.requests.packages.urllib3, इसलिए मैंने इसका इस्तेमाल किया: logging.getLogger("botocore.vendored.requests.packages.urllib3").setLevel(logging.WARNING)और मुझे आखिरकार संदेशों से छुटकारा मिल गया।
बॉब डेम

इसके लिए बहुत धन्यवाद! प्रिंट मानदंड को बदलने से मुझे इस बात को अलग करने की अनुमति मिली कि मेरे मामले में अजगर-इलास्टिक्स खोज अपराधी था।
रॉबर्ट टाउनले

2
ध्यान रखें कि यह तब काम नहीं करेगा जब मॉड्यूल आपके वर्ग के अंदर अपने लॉगर बनाते हैं जिसे आप बाद में कॉल करते हैं, जैसे APSchedulerआप कॉल करते हैं BackgroundScheduler.BackgroundScheduler()
user136036

@ user136036: लकड़हारा ऑब्जेक्ट एकल हैं, इससे कोई फर्क नहीं पड़ता कि आपको या लाइब्रेरी को पहले बनाना है। यदि आप ठीक उसी नाम का उपयोग करते हैं जैसे पुस्तकालय उपयोग करता है, तो यह काम करेगा
मार्टिन पीटर्स

1
मुझे लगता है कि वे कह रहे हैं कि यदि आप किसी लाइब्रेरी को बनाने से पहले लकड़हारे को सूचीबद्ध करते हैं, तो वह सूचीबद्ध नहीं होगा। क्या सही है।
kbrose

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

इस तरह urlib3 से स्तर = INFO के सभी संदेश लॉगफ़ाइल में मौजूद नहीं होंगे।

तो आप अपने लॉग संदेशों के लिए स्तर = जानकारी का उपयोग करना जारी रख सकते हैं ... बस उस लाइब्रेरी के लिए इसे संशोधित करें जिसका आप उपयोग कर रहे हैं।


4
मैं सुझाव setLevel(logging.WARNING)भी चेतावनी और त्रुटि संदेश लॉग करने के लिए उपयोग कर रहा हूँ ।
razz0

14

मुझे उस दस्तावेज़ अनुभाग को कॉपी / पेस्ट करने दें, जो मैंने लगभग दो या दो सप्ताह पहले लिखा था, जो आपकी समस्या के समान है:

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

व्यावहारिक POV से, हालांकि, केवल 'अनुरोधों' से अधिक विशिष्ट होने की बात क्या है?
एकन्यूड्स 1

लेकिन क्या आप लॉगिंग.गेट लोजर ("request.packages.urllib3") को लॉगिंग.गेट लोजर ("अनुरोध") के बजाय कॉल करके हासिल करते हैं, यह देखते हुए कि आप अनुरोध लाइब्रेरी के लॉगिंग को प्रभावित करना चाहते हैं?
एकन्यूड्स 1

क्या आपका मतलब है कि आप request.packages.urllib3 के भीतर लॉगिंग सक्षम करना चाहते हैं? यदि हां, तो आप गलत प्रश्न का उत्तर दे रहे हैं।
एकन्यूड्स 1

@ aknuds1 यह आप पर निर्भर है कि आप उसे निष्क्रिय करना चाहते हैं या सक्षम करना चाहते हैं, मैंने केवल वह कोड डाला है जो इसे पूरी तरह से नियंत्रित करता है :)
sorin

3
मुझे लगता है कि आपने प्रश्न के दायरे को गलत समझा है।
एकन्यूड्स 1

14

logging.config.dictConfigआप का उपयोग करने वाले किसी व्यक्ति के लिए इस तरह से शब्दकोश में अनुरोध पुस्तकालय लॉग स्तर को बदल सकते हैं:

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

@SebastianWagner Django dictConfigहुड के तहत उपयोग करता है ।
uhbif19

आपको बहुत - बहुत धन्यवाद! यह बहुत अच्छा है। पुस्तकालय लॉग के सभी पर शासन करने के लिए एक जगह !! :)
मेहमबी

5

लकड़हारा नाम सेट करना मेरे लिए काम करता है requestsया requests.urllib3नहीं। मुझे लॉगिंग स्तर बदलने के लिए सटीक लकड़हारा नाम निर्दिष्ट करना पड़ा।

पहले देखें कि आपने किन लॉगर्स को परिभाषित किया है, यह देखने के लिए कि आप किन लोगों को हटाना चाहते हैं

print(logging.Logger.manager.loggerDict)

और आप कुछ इस तरह देखेंगे:

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

फिर सटीक लकड़हारे के लिए स्तर को कॉन्फ़िगर करें:

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

ये स्तर कहां सेट हैं?
जवादबा

मैं उन्हें Django सेटिंग्स में, बेस-इन में। उन्हें कहाँ रखना है यह आपके प्रोजेक्ट सेटअप पर निर्भर करता है।
मिकको

2

यदि आपके पास कॉन्फ़िगरेशन फ़ाइल है, तो आप इसे कॉन्फ़िगर कर सकते हैं।

लॉगर्स अनुभाग में urllib3 जोड़ें:

[loggers]
keys = root, urllib3

Logger_urllib3 अनुभाग जोड़ें:

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

कॉन्फ़िगरेशन फ़ाइल का उपयोग करने वाले लोगों के लिए यह पूरी तरह से मान्य उत्तर है। सुनिश्चित नहीं हैं कि इसे इतने नीचे वोट क्यों मिले?
पैट्रिक

1

यह उत्तर यहां है: पायथन: तीसरे पक्ष के पुस्तकालयों से लॉगिंग स्टेटमेंट को कैसे दबाएं?

जब आप अपने मॉड्यूल से लकड़हारा प्राप्त करते हैं, तो आप मूलभूत लॉगऑन स्तर को मूलभूत रूप से छोड़ सकते हैं, और तब आप DEBUG स्तर सेट कर सकते हैं।

logging.basicConfig(format='%(asctime)s %(module)s %(filename)s:%(lineno)s - %(message)s')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logger.debug("my debug message")

1
import logging

# Only show warnings
logging.getLogger("urllib3").setLevel(logging.WARNING)

# Disable all child loggers of urllib3, e.g. urllib3.connectionpool
logging.getLogger("urllib3").propagate = False

0

कौन सा लकड़हारा लॉग संदेश उत्पन्न कर रहा था, यह पता लगाने पर Kbrose का मार्गदर्शन बेहद उपयोगी था। मेरे Django परियोजना के लिए, मुझे 120 अलग-अलग लॉगर के माध्यम से छाँटना पड़ा, जब तक कि मैंने पाया कि यह elasticsearchपायथन पुस्तकालय नहीं था जो मेरे लिए समस्याएँ पैदा कर रहा था। अधिकांश प्रश्नों में मार्गदर्शन के अनुसार, मैंने इसे अपने लॉगर्स में जोड़कर अक्षम कर दिया:

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

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


-1

सरल: बस के requests.packages.urllib3.disable_warnings()बाद जोड़ेंimport requests


2
मुझे अपने संस्करण में यह विधि नहीं मिली। चेतावनी को अक्षम करना अत्यधिक है, क्योंकि कष्टप्रद संदेश स्तर हैं INFO
ट्रिपलए

-1

मुझे यकीन नहीं है कि पिछले दृष्टिकोण ने काम करना बंद कर दिया है, लेकिन किसी भी स्थिति में, चेतावनी को दूर करने का एक और तरीका है:

PYTHONWARNINGS="ignore:Unverified HTTPS request" ./do-insecure-request.py

मूल रूप से, स्क्रिप्ट निष्पादन के संदर्भ में एक पर्यावरण चर जोड़ना।

प्रलेखन से: https://urllib3.readthedocs.org/en/latest/security.html#disest-innings

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.