2012-08-05 14 views
22

की डिफ़ॉल्ट प्रबंधक बदलें है मिला निम्नलिखित कोड एक WSGI (web2py) में से प्रत्येक के अनुरोध पर चल रहे आवेदन:मैं अजगर लकड़हारा

import logging, logging.handlers 
from logging import StreamHandler, Formatter 

def get_configured_logger(name): 

    logger = logging.getLogger(name) 

    if (len(logger.handlers) == 0): 
     # This logger has no handlers, so we can assume it hasn't yet been configured (Django uses similiar trick) 

     # === Configure logger === 

     # Create Formatted StreamHandler: 
     FORMAT = "%(process)s %(thread)s: %(message)s" 
     formatter = logging.Formatter(fmt=FORMAT) 
     handler = logging.StreamHandler() 
     handler.setFormatter(formatter) 
     logger.addHandler(handler) 
     logger.setLevel(logging.DEBUG) 
     logger.debug('CONFIGURING LOGGER') 

    return logger 

# Get app specific logger: 
logger = get_configured_logger(request.application) 
logger.debug("TEST") 

यह स्वरूपित हैंडलर मैं चाहता हूँ के साथ एक बार लकड़हारा कॉन्फ़िगर करने के लिए, मतलब है। यह काम करता है, सिवाय इसके कि मैं अपने stdout में डबल प्रविष्टियों हो रही है:

81893 4329050112: CONFIGURING LOGGER 
DEBUG:dummy:CONFIGURING LOGGER 
81893 4329050112: TEST 
DEBUG:dummy:TEST 

मैं अपने नए स्वरूपित हैंडलर का उपयोग और/डिफ़ॉल्ट एक छिपाने से छुटकारा पाने करते हैं?

+0

मैंने पहले कभी इस कक्षा का उपयोग नहीं किया है, लेकिन आपको नहीं लगता कि logger.setLevel (logging.DEBUG) और logger.debug अनावश्यक है? – MiJyn

+1

lkjoel- नहीं, वे दो अलग-अलग चीजें हैं। कॉलिंग '.debug (..)' डीबग स्तर पर लॉग प्रविष्टियां बनाता है, जबकि लॉगिंग स्तर सेट करते समय हैंडलर को उस स्तर पर * हैंडल * लॉग प्रविष्टियों को बताता है। – Yarin

+0

क्या आप कहीं भी 'logging.basicConfig' को कॉल कर रहे हैं? यदि हां, तो टिप्पणी करें। – unutbu

उत्तर

35

शायद निम्न उदाहरण मदद करेगा। असल में आप या तो उस लॉगर के हैंडलर को हटा सकते हैं जिन्हें आप अक्षम करना चाहते हैं, या लॉगजर से प्रचार न करें जिसे आप लॉग कर रहे हैं।

$ cat testlog.py 
import logging 
logging.basicConfig(filename='foo', level=logging.DEBUG) 
root_logger = logging.getLogger() 
root_logger.debug('bar') 

my_logger = logging.getLogger('my_logger') 
FORMAT = "%(process)s %(thread)s: %(message)s" 
formatter = logging.Formatter(fmt=FORMAT) 
handler = logging.StreamHandler() 
handler.setFormatter(formatter) 

my_logger.addHandler(handler) 
my_logger.setLevel(logging.DEBUG) 
my_logger.info('baz') 

my_logger.propagate = False 
my_logger.info('foobar') 

my_logger.propagate = True 
my_logger.info('foobaz') 
root_logger.handlers = [] 
my_logger.info('barbaz') 

$ python testlog.py 
5927 140735224465760: baz 
5927 140735224465760: foobar 
5927 140735224465760: foobaz 
5927 140735224465760: barbaz 

$ cat foo 
DEBUG:root:bar 
INFO:my_logger:baz 
INFO:my_logger:foobaz 
+7

डेरेक- सेटिंग 'logger.propagate = झूठी' मुझे बस चाहिए- धन्यवाद! – Yarin

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