2011-01-18 15 views
12

मेरे पास अजगर में तीन वर्ग हैं और वे विभिन्न धागे में चलते हैं। मैं सभी वर्गों से एक ही फाइल में आउटपुट करना चाहता हूं। अभी मैंने मुख्य वर्ग में आउटपुट विधि बनाई है और इसे अन्य वर्गों में रचनाकारों के माध्यम से पास कर दिया है। इसे बेहतर तरीके से संभालने का कोई तरीका है? मैं संरचनाकारों को छोड़कर कक्षाओं के बीच लॉगर कैसे पारित कर सकता हूं?पायथन में कक्षाओं के बीच लॉगिंग

शायद पायथन जावा में स्थिर विधि की तरह कुछ का समर्थन करता है, इसलिए मैं सभी तीन वर्गों में Logger.info (संदेश) जैसे लिख सकता हूं?

एक और तरीका है शायद फाइल करने के लिए वैश्विक sys.stdout पुनः निर्देशित किया जा सकता है, यानी निर्दिष्ट करने

logger = open('debug.txt', 'w') 
sys.stdout = logger 

कॉल तब का उपयोग कर सभी वर्गों में sys.stdout।

आपको क्या लगता है?

उत्तर

23
import logging 
log = logging.getLogger("mylog") 
log.setLevel(logging.DEBUG) 

formatter = logging.Formatter(
    "%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s") 
# Alternative formatting available on python 3.2+: 
# formatter = logging.Formatter(
#  "{asctime} {threadName:>11} {levelname} {message}", style='{') 

# Log to file 
filehandler = logging.FileHandler("debug.txt", "w") 
filehandler.setLevel(logging.DEBUG) 
filehandler.setFormatter(formatter) 
log.addHandler(filehandler) 

# Log to stdout too 
streamhandler = logging.StreamHandler() 
streamhandler.setLevel(logging.INFO) 
streamhandler.setFormatter(formatter) 
log.addHandler(streamhandler) 

# Test it 
log.debug("Some message") 
log.error("An error!") 
try: 
    something() 
except: 
    log.exception("An exception occured!") 

और debug.txt में मिलता है:

 
2011-01-18 12:07:24,943 MainThread DEBUG  Some message 
2011-01-18 12:07:24,943 MainThread ERROR  An error! 
2011-01-18 12:07:24,943 MainThread ERROR  An exception occured! 
Traceback (most recent call last): 
    File "./logtest.py", line 17, in 
    something() 
NameError: name 'something' is not defined 

ध्यान दें कि जिस क्रम में संदेशों लॉग फ़ाइल में प्रदर्शित जिस क्रम में वे हुआ जब आप प्रवेश कर रहे हैं से संबंधित होते नहीं हो सकता है कई धागे से।

+1

@lazyr। जवाब के लिए धन्यवाद। मैं कक्षाओं के बीच लॉग ऑब्जेक्ट को कैसे कर सकता हूं ताकि सभी तीन फाइलें और यह एक ही लॉग फ़ाइल में लिख सके? – yart

+1

मेरे पास उपरोक्त कोड एक अलग फ़ाइल में है, log.py कहें, फिर मैं अपने प्रत्येक मॉड्यूल में "लॉग आयात लॉग से" जाता हूं। पाइथन केवल एक बार मॉड्यूल लोड करता है - पहले के बाद किसी भी आयात कथन को पहले ही लोड किया जा चुका है - इसलिए यह आपके सभी धागे में एक ही लॉग ऑब्जेक्ट होगा। –

+4

@lazyr: 'लॉगिंग' मॉड्यूल के मामले में, आपको ऐसा करने की आवश्यकता नहीं है -' लॉगिंग 'मॉड्यूल स्वयं लॉग इन रखता है जो इसे अपने मॉड्यूल के अंदर बनाता है। आप किसी अन्य मॉड्यूल में फिर से 'logging.getLogger' चला सकते हैं और आपको वही ऑब्जेक्ट मिल जाएगा। – nosklo

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