दिलचस्प पोस्ट
रीसेट फ़ोल्डर में ड्रायबल फ़ोल्डर्स? यूआईएलबल में लाइन रिक्ति को कैसे नियंत्रित किया जाए मुझे कैसे पता चलेगा कि एक अंतरफलक कैसे बनाया जाए? डाटा ऑब्जेक्ट्स डेटाबेस में कैसे संग्रहीत हैं? एक जार में पैकेजिंग फेसलेट फ़ाइलें (टेम्पलेट्स, शामिल हैं, कंपोजिट) "मल्टीकोर" असेंबली भाषा क्या दिखती है? कुंजी स्पार्क द्वारा एक से अधिक आउटपुट लिखें – एक स्पार्क जॉब एंड्रॉइड के लिए नया इंटेल इम्यूलेटर चलाना जावास्क्रिप्ट के साथ सप्ताह संख्या दिखाएं? जावा का उपयोग करके ईमेल भेजें विधि ओवरलोडिंग बनाम वैकल्पिक पैरामीटर सी # 4.0 क्या टॉमकेट एक ही पुस्तकालय फ़ाइल को स्मृति में दो बार लोड करते हैं यदि वे दो वेब ऐप्स में हैं? क्लास सदस्यों के कार्यों के लिए आप CreateThread का उपयोग कैसे करते हैं? PHP सर्वोत्तम प्रथाओं प्रश्न शामिल हैं सीमा के किनारे पर लिंक के साथ एक चक्र कैसे बनाएं

पायथन लॉगर नामकरण

Django में, मेरे पास सभी जगहों पर लॉगरर्स हैं, वर्तमान में हार्ड-कोड वाले नामों के साथ।

मॉड्यूल-स्तरीय प्रवेश के लिए (यानी, दृश्य फ़ंक्शन के मॉड्यूल में) मुझे यह करने की इच्छा है।

log = logging.getLogger(__name__) 

वर्ग स्तर के प्रवेश के लिए (यानी, एक कक्षा __init__ पद्धति में) मुझे ऐसा करने की इच्छा है।

 self.log = logging.getLogger("%s.%s" % ( self.__module__, self.__class__.__name__)) 

इससे पहले कि मैं getLogger("hard.coded.name") कई दर्जन getLogger("hard.coded.name") से निपटने से पहले दूसरी राय ढूंढ रहा हूं।

यह काम करेगा? कोई अन्य व्यक्ति अपने तर्कसंगतों को एक ही अनिकल्पनीय तरीके से नामकरण कर रहा है?

इसके अलावा, क्या मुझे इस लॉग परिभाषा के लिए क्लास डेकोरेटर को तोड़कर लिखना चाहिए?

Solutions Collecting From Web of "पायथन लॉगर नामकरण"

मैं आम तौर पर क्लास स्तरीय लॉगर्स का उपयोग नहीं करता है या ढूँढना नहीं करता, लेकिन मैं अपने मॉड्यूल को अधिकतर कुछ कक्षाओं में रखता हूं। एक सरल:

 import logging LOG = logging.getLogger(__name__) 

मॉड्यूल और उसके बाद के शीर्ष पर:

 LOG.info('Spam and eggs are tasty!') 

फ़ाइल में कहीं से भी आम तौर पर मुझे हो जाता है जहां मैं होना चाहता हूं। यह सभी जगह पर self.log की आवश्यकता से बचा जाता है, जो मुझे एक self.log -इन-प्रत्येक-क्लास परिप्रेक्ष्य दोनों से परेशान करता है और मुझे 5 वर्ण करीब 7 9 चरित्र लाइनों के करीब बनाता है जो फिट है।

आप हमेशा स्यूडो-क्लास-डेकोरेटर का उपयोग कर सकते हैं:

 >>> import logging >>> class Foo(object): ... def __init__(self): ... self.log.info('Meh') ... >>> def logged_class(cls): ... cls.log = logging.getLogger('{0}.{1}'.format(__name__, cls.__name__)) ... >>> logged_class(Foo) >>> logging.basicConfig(level=logging.DEBUG) >>> f = Foo() INFO:__main__.Foo:Meh 

क्लास स्तर के प्रवेश के लिए, एक छद्म श्रेणी के डेकोरेटर के विकल्प के रूप में, आप क्लास निर्माण समय पर आपके लिए लकड़हारा बनाने के लिए मेटाक्लास का उपयोग कर सकते हैं …

 import logging class Foo(object): class __metaclass__(type): def __init__(cls, name, bases, attrs): type.__init__(name, bases, attrs) cls.log = logging.getLogger('%s.%s' % (attrs['__module__'], name)) def __init__(self): self.log.info('here I am, a %s!' % type(self).__name__) if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) foo = Foo() 

ऐसा लगता है कि यह काम करेगा, इसके अलावा उस self को __module__ विशेषता नहीं होगी; इसकी कक्षा होगी वर्ग-स्तरीय लॉगर कॉल ऐसा दिखना चाहिए:

 self.log = logging.getLogger( "%s.%s" % ( self.__class__.__module__, self.__class__.__name__ ) )