2012-06-25 10 views
12

पर लॉगर ZODB.FileStorage के लिए कोई हैंडलर नहीं मिला" ZODB का उपयोग करके मैंने डेटाबेस बनाया, फिर मैंने इसे किसी अन्य पीसी पर कॉपी किया। मुझे आश्चर्य है कि क्यों हर बार जब मैं इस डेटाबेस (प्रतिलिपि बनाई एक) के लिए लॉग इन मैं इस त्रुटि मिलती है:त्रुटि संदेश "ZODB डेटाबेस

no handlers could be found for logger (ZODB.FileStorage) 

नोट: कार्यक्रम उल्लंघन नहीं करती है, यह सिर्फ लाल रंग में बयान प्रिंट आउट के रूप में अगर यह एक त्रुटि है।

यह कष्टप्रद संदेश क्या है और हर बार जब मैं लॉग इन करता हूं तो ऐसा क्यों होता है?

अद्यतन संख्या (1): पायथन लॉगिंग सिस्टम क्या है? मुझे अपने आवेदन में इसे कॉन्फ़िगर करने की आवश्यकता क्यों है?

नोट:

  1. मैं केवल ZODB का उपयोग करें।

  2. मेरा ओएस विंडोज एक्सपी एसपी 2 है।

+3

के संभावित डुप्लिकेट [अजगर - कोई संचालकों लकड़हारा के लिए पाया जा सकता है "OpenGL.error"] (http://stackoverflow.com/questions/345991/python-no-handlers-could-be-found-for-logger-opengl-error) –

+1

यह एक ZODB समस्या नहीं है; आपने अपने आवेदन में पायथन लॉगिंग सिस्टम को कॉन्फ़िगर नहीं किया है। –

+0

मैंने उस प्रश्न को हटाने का अनुरोध किया .मैं इस पोस्ट को संबंधित प्रश्न अपडेट कर रहा हूं। धन्यवाद jdi –

उत्तर

27

लघु उत्तर

आप अपने आवेदन के लिए यह कॉन्फ़िगर करने के लिए जरूरत नहीं है। ऐसा करने के लिए यह उपयोगी है।

लांग उत्तर

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

जो आप देख रहे हैं वह आपके अपने आवेदन में हैंडलर की अनुपस्थिति के संबंध में है। ZODB स्पष्ट रूप से जानकारी लॉगिंग कर रहा है, फिर भी क्योंकि आपने एक हैंडलर परिभाषित नहीं किया है, यह लॉगिंग जानकारी केवल ईथर में वाष्पीकरण कर रही है। यह आपको यह सूचित करते है कि अगर आप कुछ लॉगिंग जानकारी देखने के लिए चाहते हैं, आप Logging Cookbook से कोई हैंडलर

परिभाषित करना चाहिए:

import logging 

# create logger with 'spam_application' 
logger = logging.getLogger('spam_application') 
logger.setLevel(logging.DEBUG) 
# create file handler which logs even debug messages 
fh = logging.FileHandler('spam.log') 
fh.setLevel(logging.DEBUG) 
# create console handler with a higher log level 
ch = logging.StreamHandler() 
ch.setLevel(logging.ERROR) 
# create formatter and add it to the handlers 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
fh.setFormatter(formatter) 
ch.setFormatter(formatter) 
# add the handlers to the logger 
logger.addHandler(fh) 
logger.addHandler(ch) 

यह उदाहरण अपने ऐप के लिए नाम के साथ एक लकड़हारा बनाता है। फिर यह दो प्रकार के हैंडलर बनाता है। एक फ़ाइल में DEBUG स्तर लॉग लिखने के लिए एक फ़ाइल हैंडलर है। दूसरा एक स्ट्रीम हैंडलर है जो आपके कंसोल में त्रुटियां भेजेगा।

आप अधिक वर्बोज़ जानकारी अपने कंसोल के लिए जा रहा देखना चाहता था, तो आप जानकारी के लिए लॉग स्तर को बदल सकता है:

ch = logging.StreamHandler() 
ch.setLevel(logging.INFO) 

इसके अलावा "formatters" की अवधारणा पर ध्यान दें। आप विभिन्न हैंडलर के लिए अलग-अलग लॉग प्रारूप सेट कर सकते हैं।

यदि आप कम से कम अपने ऐप में एक स्ट्रीम हैंडलर बनाते हैं, तो यह अब आपको चेतावनी नहीं देगा कि एक हैंडलर परिभाषित नहीं किया गया है।

पायथन 2.7+ के लिए, logging मॉड्यूल में NullHandler शामिल है।इसका उद्देश्य लाइब्रेरी (जैसे आपकी डेटाबेस लाइब्रेरी) में एक डिफ़ॉल्ट हैंडलर होने के लिए किया जाता है जो अंत उपयोगकर्ता यूजर लाइब्रेरी का उपयोग कर बिना किसी लॉगिंग हैंडलर (जैसा कि आप कर रहे थे) त्रुटियों को शांत करते हैं। इसलिए यदि आपको लॉगिंग करने की परवाह नहीं है और बस इसे चुप करना चाहते हैं, तो आप अपने कोड में NullHandler जोड़ सकते हैं। यह वास्तव में लॉगिंग स्थापित करने के लिए सिफारिश की है, लेकिन यह सिर्फ एक और विकल्प है:

Adding NullHandler to the logger

import logging 
logging.getLogger('spam_application').addHandler(logging.NullHandler()) 
+1

+1 से bin/snapshotbackup चला रहा हूं। –

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