2016-02-10 11 views
12

मैं पाइथन लॉगिंग मॉड्यूल का उपयोग कर रहा हूं, और आयात करने वाले तृतीय पक्ष मॉड्यूल द्वारा मुद्रित लॉग संदेशों को अक्षम करना चाहता हूं। उदाहरण के लिए, मैं निम्नलिखित की तरह कुछ का उपयोग कर रहा: ("! मेरा संदेश")पायथन लॉगिंग - आयातित मॉड्यूल से लॉगिंग अक्षम करें

logger = logging.getLogger() 
logger.setLevel(level=logging.DEBUG) 
fh = logging.StreamHandler() 
fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s') 
fh.setFormatter(fh_formatter) 
logger.addHandler(fh) 

यह मेरा डीबग संदेश बाहर प्रिंट जब मैं एक logger.debug करते हैं, लेकिन यह भी किसी से डीबग संदेश बाहर प्रिंट मॉड्यूल I आयात (जैसे अनुरोध, और कई अन्य चीजें)।

मैं रुचि रखने वाले मॉड्यूल से केवल लॉग संदेश देखना चाहता हूं। क्या लॉगिंग मॉड्यूल ऐसा करना संभव है?

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

मैं निम्नलिखित को देखा है, लेकिन मैं अक्षम/एक आयातित समारोह के लिए हर कॉल से पहले लॉगिंग सक्षम करने के लिए नहीं करना चाहती: logging - how to ignore imported module logs?

उत्तर

14

समस्या यह है कि फोन करने के तर्क के बिना getLoggerजड़ देता है लॉगर तो जब आप स्तर को logging.DEBUG पर सेट करते हैं तो आप उस लॉगर का उपयोग करने वाले अन्य मॉड्यूल के लिए स्तर भी सेट कर रहे हैं।

आप रूट लॉगर का उपयोग कर द्वारा इसे हल कर सकते हैं। ऐसा करने के लिए सिर्फ एक नाम तर्क के रूप में, उदाहरण के लिए नाम अपने मॉड्यूल के पारित:

logger = logging.getLogger('my_module_name') 
# as before 

यह एक नया लकड़हारा पैदा करेगा और इस प्रकार यह अनजाने में अन्य मॉड्यूल के लिए लॉगिंग स्तर को बदल नहीं होते।


जाहिर है आप logger.debug बजाय logging.debug का उपयोग करने के बाद से बाद एक सुविधा समारोह है कि जड़ लकड़हारा की debug प्रणाली को बुलाती है।

यह Advanced Logging Tutorial में उल्लिखित है। यह आपको यह भी जानने की अनुमति देता है कि कौन सा मॉड्यूल लॉग संदेश को एक साधारण तरीके से ट्रिगर करता है।

4

@ बाकुरीउ काफी सुंदर ढंग से समारोह को समझाता है। इसके विपरीत, आप अवांछित लॉगर्स को पुनर्प्राप्त करने और पुन: कॉन्फ़िगर/अक्षम करने के लिए getLogger() विधि का उपयोग कर सकते हैं।

मैं भी logging.fileConfig() विधि जोड़ना चाहता था disable_existing_loggers नामक पैरामीटर स्वीकार करता है जो पहले परिभाषित किसी भी लॉगर्स को अक्षम करेगा (यानी, आयातित मॉड्यूल में)।

7

यदि आप पाइथन logging पैकेज का उपयोग करने जा रहे हैं, तो यह प्रत्येक मॉड्यूल में लॉगर को परिभाषित करने के लिए एक आम सम्मेलन है।

logger = logging.getLogger(__name__) 

कई लोकप्रिय अजगर संकुल ऐसा करते हैं, requests भी शामिल है। यदि कोई पैकेज इस सम्मेलन का उपयोग करता है, तो इसके लिए लॉगिंग को सक्षम/अक्षम करना आसान है, क्योंकि लॉगर नाम पैकेज के समान नाम होगा (या उस लॉगर का बच्चा होगा)। आप इसे अपने अन्य लॉगर्स के समान फ़ाइल में भी लॉग कर सकते हैं।जबकि अभी भी जड़ लकड़हारा (और एक बाहरी फ़ाइल लोड करने के लिए बिना) का उपयोग कर

logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

requests_logger = logging.getLogger('requests') 
requests_logger.setLevel(logging.DEBUG) 

handler = logging.StreamHandler() 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 
requests_logger.addHandler(handler) 
+0

ध्यान रखें, कि जब आप अपने लॉगर्स को 'logging.basicConfig (...)' के साथ आधिकारिक मूल ट्यूटोरियल में कॉन्फ़िगर करने का प्रयास करते हैं, तो सभी लॉगर्स अब या तो 'logging.lastResort'' (पायथन 3.2 से शुरू होते हैं) पर आउटपुट करेंगे। stderr है) अगर कोई हैंडलर दिया गया था या आपके द्वारा सेट हैंडलर को। तो इसका इस्तेमाल न करें या आप सभी लॉग संदेशों को वैसे भी जारी रखेंगे। – user136036

0

यह, इस तरह आयातित मॉड्यूल के द्वारा बनाई गई उन के रूप में सभी मौजूदा वालों, अक्षम करता है।

logging.config.dictConfig({ 
    'version': 1, 
    'disable_existing_loggers': True, 
}) 

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

विन्यास के लिए संबंधित विकल्पों का उपयोग कर अधिक विस्तृत उदाहरणों के लिए, https://gist.github.com/st4lk/6287746 देखते हैं, और here एक (आंशिक रूप से काम कर रहे) उदाहरण coloredlog पुस्तकालय के साथ config के लिए YAML का उपयोग कर रहा है।

+0

आपका प्रश्न क्या है? – user1767754

+0

यह उदाहरण के लिए 'अनुरोध' के लिए काम करता है, लेकिन यह तब काम नहीं करेगा जब आयातित मॉड्यूल अपनी कक्षा के अंदर अपने लॉगर्स बनाते हैं, जिसे आप बाद में कॉल करेंगे, जैसे 'एपीएसड्यूलरर' करता है जब आप 'BackgroundScheduler.BackgroundScheduler() 'कहते हैं। समाधान के लिए यहां देखें: https://stackoverflow.com/a/48891485/2441026 – user136036

संबंधित मुद्दे