2012-11-23 6 views
7

में वैकल्पिक लॉगर कार्यान्वित करना मैं एक फ़ंक्शन में वैकल्पिक लॉगर को कार्यान्वित करना चाहता हूं। कुछ ऐसा:कोड

def foo(arg1, arg2, arg3, logger=None): 
    logger = logger or (lambda *x: None) 

    ... 
    self.logger.debug("The connection is lost.") 

मैं लॉगजर मौजूद होने पर लॉगिंग करना चाहता हूं। अन्यथा, लॉगर की डिबगिंग कोई काम नहीं करेगी।

मूल रूप से इसे प्राप्त करने का आसान तरीका if logger ब्लॉक में प्रत्येक डीबग कथन को घोंसला करना है, लेकिन कई डीबग स्टेटमेंट होने पर यह गन्दा लगता है।

+0

यह सुनिश्चित नहीं है कि यह आपकी स्थिति में कैसे काम करेगा, लेकिन अगर आप लॉगजर मौजूद हैं, तो आप फ़ंक्शन के साथ फ़ंक्शन का नेतृत्व कर सकते हैं, और यदि नहीं, तो उसी नाम का लॉगर बनाएं ('लॉगर', ऐसा लगता है) और आउटपुट रूट करें 'os.devnul' करने के लिए? – RocketDonkey

+0

@iTayb हाय, आप जो चाहते हैं उसका एक सरल वर्णन है (एक डमी लॉगर होना)। लेकिन जहां तक ​​मुझे पता है कि पाइथन लॉगिंग आमतौर पर इस तरह से उपयोग नहीं किया जाता है। चूंकि आप लॉजिंग फ़िल्टरिंग का उपयोग लॉगर के नाम का उपयोग कर सकते हैं, तो मैं पूछ सकता हूं कि क्यों (किस स्थिति में) आपको अभी भी इस तरह के कामकाज की आवश्यकता है? – tdihp

+0

@tdihp मैं एक कोड टुकड़ा विकसित करना चाहता हूं, जो एक प्रदान किए गए लॉगर को इसकी गतिविधि लॉग कर सकता है। यह कोड पोर्टेबल होना चाहिए। यह (उम्मीद है) कई अलग-अलग परियोजनाओं में लागू किया जाएगा, और मैं लॉगिंग पर्यावरण प्रदान नहीं कर रहा हूं। डेवलपर पर यह तय करने के लिए है कि क्या वह फ़ंक्शन की गतिविधि लॉग करना चाहता है या नहीं। मैं बस उसे विकल्प दे रहा हूँ। – iTayb

उत्तर

7

कुछ विकल्प:

एक डमी लकड़हारा (मेरी पसंदीदा) बनाएँ:

class DummyObject(object): 
    def __getattr__(self, name): 
     return lambda *x: None 

logger = logger or DummyObject() 

नेस्टिंग:

logger = logger or logging.getLogger('dummy') # without configuring dummy before. 

एक स्तर null प्रभाव साथ एक डमी वस्तु बनाएं ब्लॉक में प्रत्येक डीबग कथन:

if logger: 
    logger.debug("abc") 
2

ठीक है, यही है logging मॉड्यूल के लिए है। How to use, Cookbook

  • self.logger विशेषता:

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

  • लॉगर वर्ग। डिफ़ॉल्ट विधियों में कुछ भी नहीं हो सकता है, लेकिन जब भी आवश्यकता उत्पन्न होती है तो उपयोगकर्ता वास्तविक हैंडलरों के साथ उन्हें बदलने के लिए स्वतंत्र होता है। सभी वर्ग एक ही वस्तु या मॉड्यूल तक पहुंचते हैं। ग्रैन्युलरिटी खोना, लेकिन स्थापित करने के लिए कम काम।

  • Decorators। प्रत्येक विधि के ऊपर @log('message', LEVEL) डालें जिसे आप लॉग करना चाहते हैं और जब विधि लागू की जाती है तो यह स्वचालित रूप से लॉग को कॉल कर देगा। काफी साफ, कम लचीला।

+0

यह परियोजनाओं के लिए अच्छा है। मुझे केवल एक बहुत ही बुनियादी कार्य है, वैकल्पिक लॉगिंग के साथ, जहां लॉगर को तर्क के रूप में पारित किया जा सकता है। – iTayb

+0

आपके द्वारा पोस्ट किए गए कोड का उपयोग क्यों न करें? आपको केवल लॉगर के लिए एक बहुत ही सरल वर्ग बनाने की आवश्यकता है, या पैरामीटर में जो भी पारित किया गया है उसे मुद्रित करने के लिए केवल एक फ़ंक्शन। – BoppreH

+0

मुझे आश्चर्य हुआ कि क्या पाइथन में कोई ऑब्जेक्ट है जो लेखन की अनुमति देगा, भले ही यह अस्तित्व में न हो, और सबक्लासिंग का समर्थन करता है (जैसे class1.class2.func (ए, बी, सी) को कॉल करना और कुछ नहीं होगा)। – iTayb

1

मुझे लगता है कि क्या आप चाहते हैं, छानने पेड़ों की कटाई तो मेरा उत्तर कैसे बस प्रवेश छानने को प्राप्त करने के बारे में है।

पायथन का लॉगिंग पैकेज पहले से ही ऐसा करता है, आपके पास फ़िल्टरिंग लॉगिंग करने के कई तरीके हैं।

दो बुनियादी तरीके हैं:

  • लॉगिंग स्तर को छानने
  • लकड़हारा नाम छानने
उनमें से

दोनों प्रवेश के config का उपयोग करता है तो यह आसानी से विन्यस्त किया जा सकता।

उदाहरण के लिए:

import logging 

logging.basicConfig() # easily setup a StreamHandler output 

logging.getLogger("realm1").setLevel(logging.WARNING) 
logging.getLogger("realm2").setLevel(logging.INFO) 

def test(): 
    r1logger = logging.getLogger("realm1") 
    r2logger = logging.getLogger("realm2") 
    r1logger.info('r1 info') # won't print 
    r2logger.info('r2 info') # will print 

if __name__ == '__main__': 
    test() 

तो जब तक आप प्रवेश नीति के रन-टाइम गतिशील स्थानीय परिवर्तन की जरूरत है, सावधान प्रवेश config साथ उपयोग डिफ़ॉल्ट लकड़हारा पर्याप्त होगा।

+0

किसने कहा कि मैं चेतावनी लॉगिंग स्तर का उपयोग नहीं कर रहा हूं? लेकिन मुझे आपका विचार मिला। – iTayb

5

एक do-कुछ भी नहीं NullHandlerlogging मॉड्यूल अजगर 2.7 के बाद से में शामिल है:

import logging  
logging.getLogger('foo').addHandler(logging.NullHandler()) 

configuring logging for a library के लिये दस्तावेज देखें।