2010-07-28 12 views
10

मेरे पास एक पैकेज है जिसमें इसमें कई घटक हैं जो लॉगिंग और उपयोगी जानकारी को आउटपुट करने से बहुत लाभान्वित होंगे।पैकेज मॉड्यूल में लॉगिंग सेट करने का कुशल तरीका

import logging 
logging.basicConfig(level=DEBUG) 
my_function = logging.getLogger("my_function") 
my_class = logging.getLogger("my_class") 

मैं दृष्टिकोण की एक जोड़ी की कोशिश की है, उनमें से एक बॉयलरप्लेट जोड़ने जा रहा है:

मुझे क्या करना नहीं चाहते कहीं इन पंक्तियों के साथ साथ हर एक फ़ाइल के लिए 'सेटअप' उचित प्रवेश करने के लिए है एक उपयोगिता मॉड्यूल के भीतर एक वर्ग में कोड और कोशिश करते हैं और कुछ इस तरह करते हैं:

from util import setlogging 
set_logging() 

लेकिन फिर भी ऊपर समाधान मेरे लिए साफ नहीं लगती है और समस्याओं का कारण है क्योंकि setLogger एक __call__ विधि नहीं है जाएगा। मुझे क्या पसंद आया था कि मेरी "set_logging" कक्षा एक कॉन्फ़िगरेशन फ़ाइल के रूप में पढ़ी जाएगी और कुछ डिफ़ॉल्ट मान होंगे, इससे कोई फर्क नहीं पड़ता कि किस स्तर या किस प्रकार का लॉगिंग प्रारूप मैं चाहता हूं कि यह इसे सही तरीके से सेट करेगा।

क्या मेरे पैकेज में बोर्ड भर में उचित लॉगिंग शुरू करने का कोई तरीका है? शायद __init__.py फ़ाइल में?

और बस के रूप में अत्यधिक शब्द होने के लिए, यह क्या setlogging (अब एक समारोह, नहीं एक वर्ग) लग रहा है जैसे:

def setlogging(config=None): 
    if config == None: 
     config = config_options() # sets default values 
    levels = { 
     'debug': DEBUG, 
     'info': INFO 
     } 

    level = levels.get(config['log_level']) 
    log_format = config['log_format'] 
    datefmt = config['log_datefmt'] 

    basicConfig(
     level = level, 
     format = log_format, 
     datefmt = datefmt) 

उत्तर

11

आप के लिए अपने पैकेज के विभिन्न मॉड्यूल में सभी कोड चाहते हैं

mylogger.warning("Attenzione!") 

या की तरह है, बजाय logging.warning & ग फोन एक ही लकड़हारा वस्तु का उपयोग, तुम बस के लिए (- - बाद में देख सकते हैं और है कि लकड़हारा उपलब्ध बनाने) की जरूरत है। इसलिए, समस्या पूरे पैकेज के लिए एक mylogger ऑब्जेक्ट बनाने और पैकेज में मॉड्यूल में उपलब्ध कराने के लिए कम कर देती है। (वैकल्पिक रूप से, आप पैकेज के नाम से शुरू होने वाले नामों के साथ नामित लॉगर्स का उपयोग कर सकते हैं, लेकिन जब यह logging पैकेज कार्यक्षमता का हिस्सा है, तो मैंने व्यक्तिगत रूप से इसे संचालित करने का प्राकृतिक तरीका कभी नहीं पाया है)।

तो, अपने util.setlogging समारोह बस से, कहते हैं पीछा किया जा सकता है,

mylogger = logging.getLogger(package_name) 

और हर मॉड्यूल आयात करता है कि util बस

util.mylogger.warning('Watch out!') 

और की तरह उपयोग कर सकते हैं। ऐसा लगता है कि यह सबसे सरल दृष्टिकोण है, जब तक कि अवधारणा है कि पैकेज में सभी कोड लॉग इन होना चाहिए उसी तरह लागू होता है।

+0

क्या मुझे अभी भी 'mylogger' तक पहुंचने में सक्षम होने के लिए सेटॉगिंग() को कॉल करने की आवश्यकता नहीं है? भले ही मैं कोशिश करता हूं, मुझे अभी भी एक अपेक्षित विशेषता प्राप्त होती है क्योंकि 'फ़ंक्शन' ऑब्जेक्ट में 'mylogger' कोई विशेषता नहीं है। शायद मैं पूरी तरह से तस्वीर नहीं प्राप्त कर रहा हूं ... – alfredodeza

+0

@alfredo, इसे केवल एक बार बुलाया जाना चाहिए (पैकेज के '__init __। Py' से उद्देश्य के लिए उपयोग करने का सबसे आसान स्थान होगा, क्योंकि आप जानते हैं कि यह हमेशा पैकेज में किसी भी मॉड्यूल में किसी भी कोड से पहले चलता है) और निश्चित रूप से आप उस लॉगर को एक हैंडलर में जोड़ सकते हैं, इसके रूप में आपके फॉर्मेटर को कॉन्फ़िगर किया गया है, जैसा कि कृपया http://docs.python.org/library/logging.html?highlight=logging#configuring-logging पर दिए गए उदाहरण कोड में है। –

+0

धन्यवाद एलेक्स, वास्तव में मदद की! मैं अगले वर्ष आपको पिकॉन में एक बियर खरीदूंगा :) – alfredodeza

1

एक मॉड्यूल लॉगिंग का उपयोग करने के लिए उचित तरीके से, जब तक किसी logging.basicConfig() (या एक प्रकार) कॉल

logger.debug('help!') 

नो-सेशन हो जाता है

import logging 
logger = logging.getLogger('my_module_name') 

और

है।

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