2013-08-05 8 views
5

से नीचे के स्तर के संदेश प्रसारित करना, मैं एक विशिष्ट लॉगजर नाम के संदेशों को एक निश्चित स्तर और उच्च (INFO और ऊपर) को एक विशिष्ट लॉग हैंडलर पर लॉग करना चाहता हूं, एक फ़ाइल हैंडलर कहें, अभी भी कंसोल पर सभी लॉग संदेश प्राप्त करना। पायथन संस्करण 2.7 है।पायथन लॉगिंग: वर्तमान लॉगर स्तर

क्या मैं अब तक की कोशिश की दो वालों को बनाने के लिए किया गया था:

  • किसी रूट लकड़हारा
  • एक नामित लकड़हारा

जड़ लकड़हारा के लिए, मैं एक logging.StreamHandler संलग्न है, और लॉग सेट स्तर logging.DEBUG

तो मुझे लगता है कि लकड़हारा के लिए logging.INFO करने के लिए नामित लकड़हारा और निर्धारित स्तर के लिए एक हैंडलर संलग्न।

जब मैं अपने मॉड्यूल है, जो नामित लकड़हारा का उपयोग करता है कहते हैं, मैं DEBUG लॉग किसी भी अधिक जड़ लकड़हारा को प्रचारित नहीं मिलता है।

नोट: अतिरिक्त लॉगर में समस्या का प्रदर्शन करने के लिए स्ट्रीमहैंडलर है। मेरी उत्पादन कोड में मैं एक FileHandler प्रयोग करेंगे

import logging 

def do_logging(turn): 
    logger = logging.getLogger('extra') 
    logger.info('some info turn %d' % turn) 
    logger.debug('this is debug fudge turn %d' % turn) 

rootLogger = logging.getLogger() 
handler = logging.StreamHandler() 
rootFormatter = logging.Formatter('root - %(levelname)s: %(msg)s') 
handler.setFormatter(rootFormatter) 
rootLogger.addHandler(handler) 
rootLogger.setLevel(logging.DEBUG) 

do_logging(1) 

extraLogger = logging.getLogger('extra') 
extraHandler = logging.StreamHandler() 
extraFormatter = logging.Formatter('extra - %(levelname)s: %(msg)s') 
extraHandler.setFormatter(extraFormatter) 
extraLogger.addHandler(extraHandler) 
extraLogger.setLevel(logging.INFO) 

do_logging(2) 

वास्तविक आउटपुट:

root - INFO: some info turn 1 
root - DEBUG: this is debug fudge turn 1 
extra - INFO: some info turn 2 
root - INFO: some info turn 2 

आउटपुट है कि मैं करना चाहते हैं के लिए:

root - INFO: some info turn 1 
root - DEBUG: this is debug fudge turn 1 
extra - INFO: some info turn 2 
root - INFO: some info turn 2 
root - DEBUG: this is debug fudge turn 2 

मुझे लगता है कि एक कस्टम Filter इस मामले में सहायक होगा, लेकिन मुझे नहीं पता कि कैसे ...

उत्तर

4

आप इस तरह robert's LevelFilter इस्तेमाल कर सकते हैं:

# Put the Filter on the Handler so only INFO and higher is handled 
extraHandler.addFilter(LevelFilter(logging.INFO)) 

# Let the Logger process everything (so it can propagate records to root) 
extraLogger.setLevel(logging.DEBUG) 

import logging 

class LevelFilter(logging.Filter): 
    """ 
    https://stackoverflow.com/a/7447596/190597 (robert) 
    """ 
    def __init__(self, level): 
     self.level = level 

    def filter(self, record): 
     return record.levelno >= self.level 

def do_logging(turn): 
    logger = logging.getLogger('extra') 
    logger.info('some info turn %d' % turn) 
    logger.debug('this is debug fudge turn %d' % turn) 

rootLogger = logging.getLogger() 
handler = logging.StreamHandler() 
rootFormatter = logging.Formatter('root - %(levelname)s: %(msg)s') 
handler.setFormatter(rootFormatter) 
rootLogger.addHandler(handler) 
rootLogger.setLevel(logging.DEBUG) 
do_logging(1) 

extraLogger = logging.getLogger('extra') 
extraHandler = logging.StreamHandler() 
extraFormatter = logging.Formatter('extra - %(levelname)s: %(msg)s') 
extraHandler.setFormatter(extraFormatter) 
extraLogger.addHandler(extraHandler) 

# Put the Filter on the Handler so only INFO and higher is handled 
extraHandler.addFilter(LevelFilter(logging.INFO)) 

# Handle everything (so it can propagate to root) 
extraLogger.setLevel(logging.DEBUG) 
do_logging(2) 
+1

ठीक काम करता है, बहुत बहुत धन्यवाद। एक लॉगर के बाद लगता है कि नंगे स्तर तंत्र के आधार पर लॉग प्रविष्टियों को छोड़ देता है, यह अब उन्हें प्रचारित नहीं करता है। यहां यह लॉग स्तर को कम करके सेट किया गया है, लेकिन वांछित स्तर के केवल लॉग संदेश, जो निचले स्तर के प्रचार की लॉग प्रविष्टियों को देता है। – trapicki

+1

हाँ, यह सही है। दस्तावेज़ों में एक अच्छा प्रवाह चार्ट है (http://docs.python.org/2/howto/logging.html#logging-flow) जो सही मानसिक मॉडल सेट करता है। आप रिकॉर्डर को अस्वीकार करने के लिए लॉगर से फ़िल्टर नहीं चाहते हैं क्योंकि यह कभी भी प्रचार चरण तक नहीं पहुंचता है। – unutbu

+1

ओह, एक हैंडलर या लॉगर से फ़िल्टर संलग्न होने पर एक बड़ा अंतर है ... _handler उप-चार्ट_ भ्रामक लगता है: _Stop_ प्रसंस्करण को रोक नहीं पाएगा, बस कुछ हैंडल किए बिना उस हैंडलर से वापस लौटें, और प्रवाह चालू होगा अगली हैंडलर, या मैं गलत हूँ, @unutbu? – trapicki

0

वहाँ "प्रचार" कहा जाता लकड़हारा कक्षा में एक विधि है कि आप क्या पूछना करने के लिए लगता है: http://docs.python.org/2/library/logging.html#logger-objects

+0

AFAIU 'Logger.propagate 'एक बुलियन संपत्ति है जो प्रचार करती है अगर प्रचार होता है। मैंने इसके साथ झगड़ा करने की कोशिश की है, लेकिन ऐसा लगता है कि लॉग प्रविष्टियों को स्तर के आधार पर त्याग दिया जाता है और इस प्रकार रूट लॉगर को वैसे भी प्रचारित नहीं किया जाता है। – trapicki

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