2013-06-20 12 views
5

मुझे this एक समान समान समस्या का उत्तर मिला है, हालांकि (चूंकि मैं पाइथन में नौसिखिया हूं) मुझे यकीन नहीं है कि मेरे कोड में इस समाधान को कैसे कार्यान्वित किया जाए (यदि यह एक ही समस्या है सब)।लॉगिंग संदेश कंसोल में दो बार दिखाई देते हैं Python

मेरी कोड में मैं निम्न अनुभाग है:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        filename='C:\\Tests\\TRACE.log', 
        filemode='a') 
console = logging.StreamHandler() 
console.setLevel(logging.INFO) 
consoleFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
console.setFormatter(consoleFormatter) 
logging.getLogger('').addHandler(console) 
localLog = logging.getLogger('text') 

अजीब बात यह है कि यह ठीक काम करता था लेकिन कुछ पल में वह इन नकली संदेशों लेखन सांत्वना देने शुरू कर दिया है।

क्या कोई मुझे यहां एक दिशा दे सकता है?

उत्तर

5

ऐसा लगता है कि मैंने इस समस्या का स्रोत निकाला है।

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

इस समस्या का संभावित हल हैं:

  1. मॉड्यूल स्तर
  2. सेट disable_existing_loggers को झूठी पर लकड़हारा मत हो। अजगर 2,7
5

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

  1. टिप्पणी बाहर logging.basicConfig करने के लिए कॉल: वहाँ समस्या के मूल को पाने के लिए कोशिश कर रहा लायक चीजों की एक जोड़ी हैं दूसरे लॉग हैंडलर को मैन्युअल रूप से कॉन्फ़िगर करने की आवश्यकता है।
  2. यदि आप एक आईडीई का उपयोग कर रहे हैं, तो यह एक लॉग स्टेटमेंट पर ब्रेकपॉइंट डालने और डीबगर का उपयोग करने में कदम उठाने के लायक हो सकता है ताकि आप विभिन्न हैंडलर संलग्न होने की स्पष्ट तस्वीर प्राप्त करने के लिए पाइथन लॉग सेटअप की स्थिति का निरीक्षण कर सकें।

अपने प्रवेश प्रबंधन करने के लिए आसान बनाने के लिए, यह कोड के बाहर और एक विन्यास फाइल में विन्यास को स्थानांतरित करने के लिए देख लायक हो सकता है - logging configuration पर पायथन दस्तावेज़ एक महान जगह शुरू करने के लिए है।

+1

हाय और आपके उत्तर के लिए धन्यवाद, लेकिन मैं कैसे टिप्पणी कर सकते हैं बाहर सब ' loggingBasicConfig'? इसमें पथ, प्रारूप और फ़ाइलमोड के रूप में अनिवार्य सेटिंग्स शामिल हैं ... –

+1

प्रश्न पढ़ने से, ऐसा लगता है कि समस्या यह है कि आपको कंसोल में डुप्लिकेट लॉग संदेश मिल रहे हैं, और फ़ाइल लॉगिंग समस्या नहीं है। मेरा संदेह यह है कि मूल कॉन्फिग एक कंसोल लॉग हैंडलर स्थापित कर रहा है, और फिर आप दूसरा कंसोल लॉग हैंडलर स्थापित कर रहे हैं। लॉगिंग कॉन्फ़िगरेशन को कॉन्फ़िगरेशन फ़ाइल में ले जाने की अत्यधिक अनुशंसा करेंगे जहां आप विशिष्ट सेटअप के बारे में अधिक स्पष्ट हो सकते हैं। – robjohncox

+1

इंगित करने योग्य एक बात यह है कि फ़ाइल, कंसोल या किसी अन्य गंतव्य पर लॉग इन करना अनिवार्य नहीं है - लॉगिंग केवल संदेशों को देखने या स्टोर करने के लिए संदेशों को निर्देशित करने का एक तरीका है, और कई अलग-अलग जगहें हैं जिन्हें आप चाहते हैं उन्हें भेजें (फ़ाइल और कंसोल दो बहुत आम विकल्प हैं)। लॉजिंग कैसे काम करता है में ठोस परिचय प्राप्त करने के लिए पायथन दस्तावेज़ में [उन्नत लॉगिंग ट्यूटोरियल] (http://docs.python.org/2/howto/logging.html#advanced-logging-tutorial) के माध्यम से काम करने की अत्यधिक अनुशंसा करेंगे। – robjohncox

0

के बाद से जोड़ा गया मैं अपने लकड़हारा विन्यास के साथ एक ही स्थिति थी, ठीक है कि मैं का इस्तेमाल किया गया था:

class Logger: 

@staticmethod 
def setup(name, file_name): 

    log_file = <path to save the file> 
    log_file_max_size = 1024 * 1024 * 20 # megabytes 
    log_num_backups = 3 
    log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s" 
    log_filemode = "w" # w: overwrite; a: append 
    logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG) 
    rotate_file = logging.handlers.RotatingFileHandler(
     log_file, maxBytes=log_file_max_size, backupCount=log_num_backups 
    ) 
    logger = logging.getLogger(name) 
    # Console output line. 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.INFO) 
    log_formatter = logging.Formatter(log_format) 
    console_handler.setFormatter(log_formatter) 
    logger.handlers = rotate_file, console_handler 

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