2011-11-17 16 views
18

मैं अजगर लॉगिंग मॉड्यूल का उपयोग कर अपने पायथन कोड में ईवेंट लॉगिंग कर रहा हूं। मेरे पास 2 लॉगिंग फाइलें हैं जिन्हें मैं लॉग करना चाहता हूं, एक उपयोगकर्ता की जानकारी रखने के लिए और अन्य देवताओं के लिए एक और अधिक विस्तृत लॉग फ़ाइल है। मैंने दो लॉगिंग फ़ाइलों को उन स्तरों पर सेट किया है जिन्हें मैं चाहता हूं (usr.log = INFO और dev.log = ERROR) लेकिन लॉगिंग को usr.log फ़ाइल में प्रतिबंधित करने के तरीके को कैसे काम नहीं कर सकता है, इसलिए केवल INFO स्तर लॉग लिखा गया है लॉग फ़ाइल में आईएनएफओ के विपरीत और इसके अलावा कुछ और भी उदाहरण के लिए सूचना, चेतावनी, त्रुटि और गंभीर।पायथन लॉगिंग विशिष्ट स्तर केवल

यह मूल रूप से मेरी कोड है: -

import logging 

logger1 = logging.getLogger('') 
logger1.addHandler(logging.FileHandler('/home/tmp/usr.log') 
logger1.setLevel(logging.INFO) 
logger2 = logging.getLogger('') 
logger2.addHandler(logging.FileHandler('/home/tmp/dev.log') 
logger2.setLevel(logging.ERROR) 

logging.critical('this to be logged in dev.log only') 
logging.info('this to be logged to usr.log and dev.log') 
logging.warning('this to be logged to dev.log only') 

किसी भी मदद की बहुत अच्छा होगा धन्यवाद।

उत्तर

34

मैं डेविड के साथ सामान्य समझौते में हूं, लेकिन मुझे लगता है कि और कहा जाना चाहिए। The Princess Bride को पैराफ्रेश करने के लिए - मुझे नहीं लगता कि इस कोड का अर्थ है कि इसका मतलब क्या है। आपका कोड है:

logger1 = logging.getLogger('') 
... 
logger2 = logging.getLogger('') 

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

logger1 = logging.getLogger('user') 
... 
logger2 = logging.getLogger('dev') 

इससे भी बदतर अभी भी, आप प्रवेश मॉड्यूल के critical(), info() और warning() तरीकों बुला और उम्मीद है कि दोनों वालों संदेशों मिल जाएगा रहे हैं। यह केवल इसलिए काम करता है क्योंकि आपने रिक्त स्ट्रिंग का उपयोग logger1 और logger2 दोनों के नाम के रूप में किया था और इस प्रकार वे केवल एक ही लॉगर नहीं हैं, वे रूट लॉगर भी हैं। यदि आपने दो लॉगर्स के लिए अलग-अलग नामों का उपयोग किया है, तो मैंने आपको critical(), info() और warning() व्यक्तिगत रूप से प्रत्येक लॉगर पर विधियों को कॉल करने की आवश्यकता होगी (यानी आपको केवल एक के बजाय दो कॉल की आवश्यकता होगी)।

मुझे लगता है कि आप वास्तव में चाहते हैं कि एक ही लॉगर पर दो अलग handlers हों। उदाहरण के लिए:

import logging 

mylogger = logging.getLogger('mylogger') 
handler1 = logging.FileHandler('usr.log') 
handler1.setLevel(logging.INFO) 
mylogger.addHandler(handler1) 
handler2 = logging.FileHandler('dev.log') 
handler2.setLevel(logging.ERROR) 
mylogger.addHandler(handler2) 
mylogger.setLevel(logging.INFO) 

mylogger.critical('A critical message') 
mylogger.info('An info message') 

बार जब आप इस परिवर्तन कर दिया है, तो आप filters उपयोग कर सकते हैं के रूप में डेविड पहले ही उल्लेख किया गया है।यहां एक त्वरित नमूना फिल्टर है:

class MyFilter(object): 
    def __init__(self, level): 
     self.__level = level 

    def filter(self, logRecord): 
     return logRecord.levelno <= self.__level 

आप इस तरह दो संचालकों में से प्रत्येक के लिए फ़िल्टर लागू कर सकते हैं:

handler1.addFilter(MyFilter(logging.INFO)) 
... 
handler2.addFilter(MyFilter(logging.ERROR)) 

यह प्रत्येक हैंडलर प्रतिबंधित करने के लिए केवल स्तर निर्दिष्ट पर लॉग संदेशों को लिखने होगा।

+0

@srgerg इसे समझाने के लिए समय निकालने के लिए धन्यवाद, जो अब बहुत अधिक समझ में आता है। – user788462

+2

केवल निर्दिष्ट स्तर पर लॉग को उत्सर्जित करने के लिए, क्या स्थिति को '<= 'के बजाय' logRecord.levelno == self .__ स्तर' 'की आवश्यकता नहीं होगी? – samstav

+0

ओह, मुझे लगता है कि अन्य अंतर्निहित फ़िल्टर '> =' तुलना करेगा। – samstav

7

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

कहा जा रहा है, तो आप एक Filter उपवर्ग जिसका filter विधि अपना वांछित मानदंड लागू करता है और उचित हैंडलर पर इसे स्थापित बनाकर लॉग रिकॉर्ड की मनमाने ढंग से छानने लागू कर सकते हैं।

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