2013-03-04 9 views
11

का उपयोग कर एकाधिक फ़ाइलों को लॉगिंग कर रहा है यह मेरा परिदृश्य है: मैं my_module की गतिविधि लॉग करना चाहता हूं। निष्पादित विधि (चलिए कहते हैं, इनपुट और आउटपुट) के आधार पर, दो अलग-अलग फाइलों के आधार पर इसे करने की आवश्यकता है।पायथन एक ही लॉगर

तो मेरे पास दो हैंडलर हैं, प्रत्येक एक अलग फ़ाइल (my_in_.log & my_out_.log) पर एक ही लॉग स्तर के साथ इंगित करता है। मैं जानना चाहता हूं कि मैं इसे प्राप्त करने के लिए एक ही लॉगर का उपयोग कर सकता हूं या मुझे दो लॉगर्स परिभाषित करना है। मेरे config है:

[loggers] 
keys=root, my_log 

[handlers] 
keys=my_in_hand, my_out_hand 

[formatters] 
keys=generic_form 


... 


[logger_my_log] 
level=NOTSET 
handlers=my_in_hand, my_out_hand 
qualname=ws_log 

[handler_my_in_hand] 
class=handlers.TimeRotatingFileHandler 
level=NOTSET 
formatter=generic_form 
args=('my_in_.log', 'h', 1, 0, None, False, True) 

[handler_my_out_hand] 
class=handlers.TimeRotatingFileHandler 
level=NOTSET 
formatter=generic_form 
args=('my_out_.log', 'h', 1, 0, None, False, True) 

मैं प्रति हैंडलर/गंतव्य एक लकड़हारा परिभाषित करने के लिए है? (क्योंकि मैं अलग-अलग फाइलों में अलग-अलग जानकारी लॉग करना चाहता हूं) क्या लॉगर को इंगित करने का कोई तरीका है जो हैंडलर ऐसा करेगा? मेरा मतलब है, मेरे पास एक लॉगर के लिए दो हैंडलर हैं, फिर एक विधि को लॉग इन करने के लिए केवल एक हैंडलर चुनें।

Thx बहुत कुछ!

उत्तर

3

अंत में मैं दो वालों को परिभाषित करने का फैसला किया है क्योंकि:

  • वे विभिन्न purposses के लिए कर रहे हैं। मेरे मामले में, एक वेब सेवा के लिए इनपुट अनुरोध लॉग करता है, और दूसरा प्रतिक्रिया प्रतिक्रिया देता है। और वे

  • मैं एक प्रवेश कॉन्फ़िग फ़ाइल उपयोग कर रहा हूँ, एक ललाट वेब सेवा में इसे करने के लिए अलग अलग फ़ाइलों का उपयोग करें। संदेशों को लॉग करने से पहले हैंडलर जोड़ना/हटाना सही दृष्टिकोण नहीं है, जैसा कि @ माइक ने कहा था। Thx @drekyn भी!

    [loggers] 
    keys=root, ws_in_log, ws_out_log 
    
    [handlers] 
    keys=consoleHandler, ws_in_hand, ws_out_hand 
    
    [formatters] 
    keys=generic_form 
    
    [logger_root] 
    handlers=consoleHandler 
    level=NOTSET 
    
    [logger_ws_in_log] 
    level=NOTSET 
    handlers=ws_in_hand 
    qualname=ws_in_log 
    
    [logger_ws_out_log] 
    level=NOTSET 
    handlers=ws_out_hand 
    qualname=ws_out_log 
    
    [handler_ws_in_hand] 
    class=logging.handlers.TimedRotatingFileHandler 
    level=NOTSET 
    formatter=generic_form 
    args=('/path/ws_in_.log', 'h', 1, 0, None, False, True) 
    
    [handler_ws_out_hand] 
    class=logging.handlers.TimedRotatingFileHandler 
    level=NOTSET 
    formatter=generic_form 
    args=('/path/em/ws_out_.log', 'h', 1, 0, None, False, True) 
    
    [handler_consoleHandler] 
    class=StreamHandler 
    level=DEBUG 
    formatter=generic_form 
    args=(sys.stdout,) 
    
    [formatter_generic_form] 
    format='%(asctime)s - %(levelname)s - %(message)s' 
    datefmt='%Y-%m-%d %H:%M:%S' 
    class= 
    

    आप देखें:

यहाँ अगर कोई में रुचि रखता है सिर्फ संदर्भ के लिए मेरी लॉगिंग कॉन्फ़िग फ़ाइल है,!

7

आपको प्रत्येक गंतव्य के लिए एक हैंडलर को तुरंत चालू करना चाहिए, जिसे आप अपना लॉग भेजना चाहते हैं, फिर अपने लॉगर में 2 हैंडलर जोड़ें। निम्नलिखित काम (यह, हालांकि परीक्षण नहीं किया) करना चाहिए:

logger = logging.getLogger() 
handler1 = logging.TimedRotatingFileHandler() 
handler2 = logging.TimedRotatingFileHandler() 
logger.addHandler(handler1) 
logger.addHandler(handler2) 

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

+0

शायद मैं स्पष्ट नहीं कर रहा हूँ: मैं अपने रिकॉर्ड के लिए लॉग इन नहीं करना चाहते करने के लिए ** हर हैंडलर ** लकड़हारा को जोड़ा गया। मैं जो चाहता हूं वह चुनना है कि कौन सा हैंडलर रिकॉर्ड लॉग करेगा, यानी, एक लॉगर -> दो हैंडलर, लेकिन चुनें कि रिकॉर्ड किस आवंटित किया जाएगा। अलग हैंडलरों के साथ एक ही लॉगर का पुन: उपयोग करें, लेकिन कुछ रिकॉर्ड एक हैंडलर द्वारा लॉग किए जाएंगे , और कुछ दूसरे के साथ ... क्या यह संभव है या मुझे अन्य लॉगर को परिभाषित करना है? बहुत धन्यवाद! :) –

+1

@ अल्बर्टोमेगेआ आपको अपनी खुद की विधि को परिभाषित करना चाहिए जो लॉग गंतव्य के रूप में तर्क लेता है और लॉग संदेश के लिए आंतरिक रूप से दाएं हैंडलर का उपयोग करता है। – mike

+0

तो @ माइक का मतलब है कि मुझे रनटाइम में इसे चुनने के लिए लॉगर के हैंडलर को जोड़ना और निकालना है? यह मेरा सबसे अच्छा विकल्प नहीं हो सकता है क्योंकि यह मॉड्यूल वेब सेवा में मेरा फ्रंटल व्यू है ... हर अनुरोध के साथ मुझे हैंडलर स्विच करना होगा ...: एस –

3

क्या आप चाहते हैं

  1. 2 गैर रूट वालों तैयार करना है। हर एक के लिए
  2. मेकअप हैंडलर, विभिन्न फ़ाइल इंगित
  3. ऐड हैंडलर उचित लकड़हारा को

    logger1 = logging.getLogger('general_logger') 
    logger2 = logging.getLogger('some_other_logger') 
    
    log_handler1 = logging.handlers.RotatingFileHandler(file_1, *args) 
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args) 
    
    logger1.addHandler(log_handler1) 
    logger2.addHandler(log_handler2) 
    

तो

logger1.info("this will be logged to file_1 ") 
    logger2.info("this will be logged to file_2 ") 

कृपया ध्यान दें कि आप एक रूट लकड़हारा बनाते हैं और एक अलग लकड़हारा, जड़ लकड़हारा सब कुछ है कि इस अलग नियंत्रक लॉग इन करने की कोशिश कर रहा है प्रवेश करेंगे।

दूसरे शब्दों में, अगर

root_logger = logging.getLogger() 
    logger2 = logging.getLogger('some_other_logger') 

    root_log_handler = logging.handlers.RotatingFileHandler(file_1, *args) 
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args) 

    root_logger.addHandler(root_log_handler) 
    logger2.addHandler(log_handler2) 

तो

root_logger.info("this will be logged to file_1 ") 
    logger2.info("this will be logged to file_1 AND file_2 ") 
संबंधित मुद्दे