2012-07-27 19 views
5

हर बार मुझे लगता है कि मैं लॉगिंग मॉड्यूल को समझता हूं, gremlins आते हैं और जिस तरह से काम करता है उसे बदलते हैं। (ठीक है, मैं स्वीकार करूंगा, कि gremlin मुझे अपना कोड बदल सकता है।)बाल लॉगर्स को कॉन्फ़िगर करना

मैं यहाँ क्या गलत कर रहा हूं?

> ipython 
> import logging 
> log = logging.Logger("base") 
> log.addHandler(logging.StreamHandler()) 

> log.critical("Hi") 
Hi 

> log2 = log.getChild("ment") 

> log2.critical("hi") 
No handlers could be found for logger "base.ment" 

मैं शपथ ली हो सकता था कि अतीत में, मैं अतिरिक्त विन्यास के बिना बच्चे वालों उपयोग करने में सक्षम था ...

+0

इसे नए सत्र में आज़माएं। यह ipython, और एक स्क्रिप्ट के रूप में भी मेरे लिए काम करता है। – unutbu

+0

सीपीथन 2.7.2 में मेरे लिए काम नहीं कर रहा है। मुझे आश्चर्य है कि क्या इसे 'स्ट्रीमहैंडलर' की डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ कुछ करना है ... जब मैं 'लॉग' बनाता हूं, तो 'लॉग'' पर हैंडलर जोड़ें, फिर 'लॉग 2' बनाएं, मुझे 'कोई हैंडलर' नहीं मिलता है, लेकिन अगर मैं पहले 'लॉग 2' बना देता हूं तो हैंडलर को 'लॉग' में जोड़ें, 'लॉग 2' पर लॉग इन करना त्रुटि नहीं है (हालांकि यह कुछ भी प्रिंट नहीं करता है)। –

+0

@unutbu: हमम ... वह * एक नया सत्र है। मैंने इसे इंगित करने के लिए शीर्ष पर 'ipython' कमांड लाइन शामिल की थी। कि आप इसे बिना किसी समस्या के चलाने में सक्षम हैं मुझे एक बुरा अनुभव देता है। मैं पाइथन 2.7.1 और आईपीथन 0.10 चला रहा हूँ। एक * लंबे * समय के लिए इस तरह से किया गया था, तो यह समस्या प्रतीत नहीं होता है। मुझे पता है * इसे मेरे कोड के साथ करना है ... –

उत्तर

5

अगर आप बदलना

log = logging.Logger('base') 

को

log = logging.getLogger('base') 

फिर यह काम करता है:

import logging 

log = logging.getLogger('base') 
log.addHandler(logging.StreamHandler()) 
log.critical('Hi') 
log2 = log.getChild('ment') 
log2.critical('hi') 

पैदावार

Hi 
hi 
+0

मैं बस कोशिश करने वाला था ... मदद के लिए अच्छा पकड़ और धन्यवाद! +1 –

+2

अरघ, मैंने अभी इसे ट्रैक किया है ... हाँ, लॉगिंग मॉड्यूल लॉग इन बनाने के लिए 'लॉगिंग। प्रबंधक' के माध्यम से अदृश्य रूप से प्रॉक्सी करता है। जब आप सीधे 'लॉगिंग। लॉगर()' के साथ लॉगर बनाते हैं तो आप सिस्टम को शॉर्ट-सर्किट करते हैं और चीजें खराब होती हैं। –

+0

मैंने अपने Mercurial संस्करणों के माध्यम से खोद दिया और यह ठीक है क्या हुआ।मैंने अपने लॉगिंग कोड को "साफ़ किया" और "getLogger" के बजाय "लॉगर" टाइप किया। @ sr2222: कारण का पीछा करने के लिए धन्यवाद। यह जानने में मदद करता है कि यह क्यों विफल रहा। अब मैं अपने मानसिक मॉडल को "लोड लॉगिंग और लॉगर बनाने" से "लॉगिंग लोड करने और बाल लॉगर बनाने" में बदल सकता हूं। +1। धन्यवाद! –

1

अधिक विस्तार: आप मॉड्यूल गलत प्रयोग कर रहे हैं। :) मॉड्यूल कोड को देखने से, ऐसा लगता है कि वे आपको logging.Logger() सीधे बनाने की उम्मीद नहीं करते हैं। मॉड्यूल पर सीधे उपलब्ध कई फ़ंक्शन (पूर्व getLogger()) और logging.Logger() (पूर्व getChild()) पर विधियां वास्तव में logging.Manager के उदाहरण के माध्यम से प्रॉक्सी आयात करती हैं जो मॉड्यूल आयात पर बनाता है। जब आप सीधे logging.Logger() के साथ बनाते हैं, तो आप वास्तव में Manager के बाहर Logger उदाहरण बना रहे हैं। जब आप बाद में log.getChild() पर कॉल करते हैं, तो मॉड्यूल वास्तव में Manager के अंदर नया लॉगर बना रहा है, लेकिन Manager के नाम से - लॉगर नाम के सामने संलग्न बाहरी लॉगर। तो आपका हैंडलर log में जोड़ा गया है Manager में बच्चे के साथ नहीं है, और इस प्रकार हैंडलर काम नहीं करता है। मैं थोड़ा उलझन में हूं, हालांकि log2 बनाने से पहले या बाद में log पर एक हैंडलर जोड़ने के कारण log2 के खिलाफ अलग-अलग व्यवहार करने के कारण लॉगिंग का कारण बनता है। मुझे नहीं लगता कि इसका क्या कारण है ...

+0

: "लॉगिंग के साथ। लॉगर() सीधे, आप वास्तव में प्रबंधक के बाहर लॉगर इंस्टेंस बना रहे हैं। जब आप बाद में log.getChild() को कॉल करते हैं, तो मॉड्यूल वास्तव में बना रहा है प्रबंधक के अंदर नया लॉगर "दिलचस्प। और समझ में आता है। मुझे हमेशा * मेरे * प्रोग्राम के "पहले" लॉगर बनाने के दौरान "उप-लॉगर बनाएं" सोचने के लिए याद रखना चाहिए। –

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