2012-03-27 14 views
6

मैंने समय के साथ स्क्रिप्ट का एक गुच्छा लिखा है और मैं DRY कोड रखने के लिए स्क्रिप्ट को दोबारा करने की प्रक्रिया में हूं। मैं वर्तमान में विभिन्न लिपियों में इन पंक्तियों के साथ कुछ का उपयोग कर रहा: हर लिपि में इस दोहरा (यानी "मॉड्यूल") के बजायपायथन: विभिन्न मॉड्यूल से एक ही फ़ाइल में लॉग इन करने का सही तरीका

if __name__ == '__main__': 
    logger = logging.getLogger('dbinit') 
    hdlr = logging.FileHandler('/var/logs/tmp/foo.log') 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.WARNING) 

, मैं इस लकड़हारा initialisation एक कहीं किया और विभिन्न द्वारा पहुँचा करना चाहते हैं स्क्रिप्ट (हम्म, शायद एक सिंगलटन कक्षा में लपेटें?)।

मुझे लगता है कि (यानी एक कोर मॉड्यूल में लकड़हारा initialisation कोड डाल) नहीं कर सकते हैं, तो मुझे लगता है कि logging.FileHandler() कॉल में एक ही लॉग फ़ाइल नाम का उपयोग करके, विभिन्न लिपियों लिखेंगे एक ही फाइल में।

क्या यह धारणा सही है?

अंतिम लेकिन कम से कम नहीं, इस समस्या को हल करने के लिए सबसे अच्छा अभ्यास (यानी पायथनिक) तरीका क्या है?

+0

संबंधित: [कई मॉड्यूल से अजगर लॉगिंग मुद्दों] (http://stackoverflow.com/questions/7341538/) –

+0

संबंधित: [पायथन: लॉगिंग मॉड्यूल - वैश्विक रूप से] (http://stackoverflow.com/questions/7621897/) –

उत्तर

-1

(...) addHandler() will not add a handler if the handler already exist इसलिए कई स्थानों पर इस तरह के इनिट कोड को चोट नहीं पहुंचीगी।

मुझे लगता है कि (यानी एक कोर मॉड्यूल में लकड़हारा initialisation कोड डाल)

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

+0

मुझे लगता है कि आप [इस उत्तर] का संदर्भ दे रहे हैं (https ://स्टैक ओवरफ़्लो।कॉम/ए/6334064/3 9 3 9 6) जब आप कहते हैं कि "हैंडलर() हैंडलर नहीं जोड़ता है तो हैंडलर पहले से मौजूद है"। आप जो कहते हैं वह केवल सत्य है यदि यह एक ही हैंडलर ऑब्जेक्ट (उस उत्तर में 'hdlr' है।) जो भी आप कहते हैं वह सही नहीं है यदि हैंडलर हर बार बनाए जाते हैं। ([इस उत्तर] [https://stackoverflow.com/a/31800084/39396) को एक ही प्रश्न पर देखें।) इस प्रश्न में, जहां प्रत्येक फ़ाइल एक नया हैंडलर बना सकती है ('लॉगिंग.फाइलहैंडलर (...) ') आपका जवाब गलत है। –

1

यह देखते हुए कि आप if __name__ == __main__ का उपयोग कर रहे हैं, मुझे लगता है कि ये स्क्रिप्ट विभिन्न प्रक्रियाओं के रूप में चल रही हैं। यदि ऐसा है, तो आपको एक अलग विन्यास फाइल का उपयोग करना चाहिए।

यह कॉन्फ़िगरेशन दस्तावेज़ में निर्दिष्ट प्रारूप में फ़ाइल में संग्रहीत किया जा सकता है। फिर, आप फ़ाइल लोड करने के लिए logging.config.fileConfig का उपयोग कर सकते हैं। आप JSON/YAML प्रारूपों में कॉन्फ़िगरेशन भी संग्रहीत कर सकते हैं, इसे एक शब्दकोश में रूपांतरित कर सकते हैं और इसे logging.config.dictConfig का उपयोग करके लोड कर सकते हैं। उत्तरार्द्ध वर्तमान अनुशंसित दृष्टिकोण है, हालांकि मुझे पहले और अधिक सीधे आगे मिलते हैं। अधिक जानकारी के लिए this पढ़ें।

एक कॉन्फ़िग फ़ाइल दृष्टिकोण का उपयोग कर के लाभ कई गुना कर रहे हैं:

  1. यह अपने कोड से अलग विन्यास सेटिंग्स रहता
  2. यह गैर प्रोग्रामर, कॉन्फ़िगरेशन में बदलाव करने के रूप में वे आसान में जमा हो जाती देता है प्रारूपों को पढ़ने के लिए
  3. यह आपको पहले से ही बताए गए अनुसार स्वयं को दोहराने से रोकता है।
0

नीचे की तरह अपने अजगर मॉड्यूल में एक समारोह बनाने के लिए:

def createLogHandler(job_name,log_file): 
    logger = logging.getLogger(job_name) 
    ## create a file handler ## 
    handler = logging.FileHandler(log_file) 
    ## create a logging format ## 
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
    handler.setFormatter(formatter) 
    logger.addHandler(handler) 
    return logger 

अब फ़ंक्शन को कॉल में आप इस तरह कार्यक्रम:

job_name = 'dbinit' 
log_file = '/var/logs/tmp/foo.log' 
logger = createLogHandler(job_name ,log_file) 
logger.info('Logger has been created') 
संबंधित मुद्दे