2013-06-05 9 views
7

मैं थोड़ी देर के लिए काम कर रहे कोड के एक टुकड़े में लॉगिंग (फ़ाइल के बजाय कंसोल करने के लिए) जोड़ने की कोशिश कर रहा हूं। थोड़ा सा पढ़ने के बाद मेरे पास एक पैटर्न है जो मुझे लगता है कि काम करना चाहिए, लेकिन मुझे पूरा यकीन नहीं है कि मैं गलत कहां जा रहा हूं।एकाधिक मॉड्यूल में पाइथन लॉगिंग

मैं (सरलीकृत जाहिर है) निम्नलिखित तीन फ़ाइलें:

controller.py

import my_module  
import logging 
from setup_log import configure_log 

def main(): 
    logger = configure_log(logging.DEBUG, __name__) 
    logger.info('Started logging') 
    my_module.main() 

if __name__ == "__main__": 
    main() 

setup_log.py

import logging 

def configure_log(level=None, name=None): 
    logger = logging.getLogger(name) 
    logger.setLevel(level) 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 
    chFormatter = logging.Formatter('%(levelname)s - %(filename)s - Line: %(lineno)d - %(message)s') 
    console_handler.setFormatter(chFormatter) 
    logger.addHandler(console_handler) 
    return logger 

my_module.py

import logging 

def main():  
    logger = logging.getLogger(__name__) 
    logger.info("Starting my_module") 
    print "Something" 

if __name__ == "__main__": 
    main() 

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

मैंने क्या गलत समझा/उलझाया है?

+1

यदि आप उन्हें बिल्कुल उसी तरह कॉन्फ़िगर करना चाहते हैं तो आप दो अलग-अलग लॉगर्स ('__main__' और' my_module') को कॉन्फ़िगर क्यों कर रहे हैं? क्यों न केवल 'getLogger() 'कॉन्फ़िगर करें और हर जगह इसका उपयोग करें? – abarnert

उत्तर

15

documentation यह लग रहा है के अनुसार की तरह तुम इतनी तरह एक और भी आसान सेटअप के साथ दूर हो सकती है:

अपने कार्यक्रम कई मॉड्यूल शामिल हैं, तो यहां आप इसे में प्रवेश का आयोजन कर सकता है की एक उदाहरण है:

# myapp.py 
import logging 
import mylib 

def main(): 
    logging.basicConfig(filename='myapp.log', level=logging.INFO) 
    logging.info('Started') 
    mylib.do_something() 
    logging.info('Finished') 

if __name__ == '__main__': 
    main() 

# mylib.py 
import logging 

def do_something(): 
    logging.info('Doing something') 

आप myapp.py चलाते हैं, तो आप myapp.log में यह देखना चाहिए:

INFO:root:Started 
INFO:root:Doing something 
INFO:root:Finished 

यह logger = logging.getLogger(__name__) अपने मॉड्यूल के अंदर करने के लिए अपने कॉल एक अलग ट्रैक

+1

धन्यवाद, मुझे दस्तावेज़ों के चारों ओर अपना सिर प्राप्त करने में परेशानी हो रही थी। और कंसोल पर आउटपुट करने के लिए ऐसा लगता है कि मैं सिर्फ फ़ाइल नाम पैरामीटर निर्दिष्ट नहीं करता हूं: 'logging.basicConfig (level = logging.INFO) ' –

+0

एक बार जब आप ऊपर के रूप में लॉगिंग सेट अप कर लेंगे, तो आप शायद लॉग इन करना भी चाहेंगे कंसोल।यह आपके सभी लॉगर्स को अतिरिक्त हैंडलर जोड़ने का एक बहुत ही आसान तरीका है, # रूट लॉगर में कंसोल हैंडलर जोड़ें, और इसलिए सभी लॉगर उदाहरणों में। logging.getLogger ('')। AddHandler (logging.StreamHandler (sys.stdout)) – CodeKid

2

वास्तविक बग द्वारा देखा जा सकता है (NOTSET का एक स्तर है, लेकिन एक लॉग प्रविष्टि में परिणाम की कोई माता-पिता के रिश्ते के साथ) पैदा कर रही है की तरह लग रहा

+०१२३५१६४१०: दोनों अपने main रों की शुरुआत जो पैदावार पर

print '__name__', __name__ 

: लाइन डालने

$ python controller.py 
__name__ __main__ 
INFO - controller.py - Line: 8 - Started logging 
__name__ my_module 
Something 

तो आपने __main__ नामक लॉगर को ठीक से कॉन्फ़िगर किया है लेकिन my_module नामक लॉगर कॉन्फ़िगर नहीं किया गया है।

गहरी समस्या यह है कि आपके पास दो main विधियां हैं जो शायद आपको भ्रमित कर रही हैं (यह मैंने किया)।

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