2012-08-28 16 views
19

सेट किया गया है मैं के रूप में अजगर में प्रवेश मॉड्यूल का उपयोग कर रहा:बदलने लॉगिंग की 'basicConfig' जो पहले से ही

import logging, sys 
logger= logging.getLogger(__file__) 
logging.basicConfig(stream = sys.stderr, level=logging.DEBUG, format='%(filename)s:%(lineno)s %(levelname)s:%(message)s') 
logger.debug("Hello World") 

अब, के बाद मैं line 3 पर बुनियादी विन्यास की स्थापना की है, मैं एक कमांड लाइन तर्क करना चाहते हैं कि sys.stderr से एक फ़ाइल में आउटपुट स्ट्रीम बदल सकते हैं।

मैंने दस्तावेज़ पढ़ा है और यह कहता है कि यदि filename और stream दोनों एक ही समय में मौजूद हैं, तो stream को अनदेखा किया जाता है।

अब, मैं जानना चाहता हूं कि basicConfig में line 3 में पहले से ही मैंने फ़ाइल को कैसे बदल दिया है?

उत्तर

33

यदि आप logging/__init__.py के लिए पाइथन स्रोतों में देखते हैं, तो आप देखेंगे कि basicConfig()addHandler() पर कॉल करके रूट लॉगर ऑब्जेक्ट पर हैंडलर सेट करता है। यदि आप स्क्रैच से शुरू करना चाहते हैं, तो आप सभी मौजूदा हैंडलर को हटा सकते हैं और फिर basicConfig() पर कॉल कर सकते हैं।

# Example to remove all root logger handlers and reconfigure. (UNTESTED) 
import logging 

# Remove all handlers associated with the root logger object. 
for handler in logging.root.handlers[:]: 
    logging.root.removeHandler(handler) 

# Reconfigure logging again, this time with a file. 
logging.basicConfig(filename = 'myfile.log', level=logging.DEBUG, format='%(filename)s:%(lineno)s %(levelname)s:%(message)s') 
+1

इसके अलावा, उपयोग सूची समझ सभी संचालकों यहाँ हटाने की तरह निम्नलिखित कोड होगा अधिक सरल :) '[logging.root.removeHandler logging.root.handlers [में (हैंडलर) हैंडलर के लिए:]]' –

+7

@ केविनगुआन सूची समझ सूची बनाने के लिए हैं। जब आप लूप में कोई कथन चलाने के लिए चाहते हैं, तो एक लूप का उपयोग करें। – augurar

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