logging.info कंसोल पर दिखाई नहीं देता है, लेकिन चेतावनी और त्रुटि करता है


99

जब मैं किसी ईवेंट को लॉग करता हूं logging.info, तो वह पायथन टर्मिनल में दिखाई नहीं देता है।

import logging
logging.info('I am info')  # no output

इसके विपरीत, logging.warnटर्मिनल में दिखाई देने वाली घटनाएँ लॉग इन होती हैं।

import logging
logging.warn('I am warning')  # outputs "I am warning"

क्या पर्यावरण स्तर में बदलाव है जो मैं logging.infoकंसोल पर प्रिंट कर सकता हूं ? मैं प्रत्येक पायथन फाइल में बदलाव करने से बचना चाहता हूं।

जवाबों:


163

रूट लकड़हारा हमेशा चेतावनी स्तर तक चूक जाता है। कॉल करने का प्रयास करें

logging.getLogger().setLevel(logging.INFO)

और आपको ठीक होना चाहिए


1
नहीं, आपको केवल एक बार कॉल करना होगा। लकड़हारा एक पदानुक्रम के रूप में बनाया गया है और सभी लॉगिंग एक रूट लकड़हारे को उबलता है । किसी भी तर्क को निर्दिष्ट नहीं करके getLogger(), यह आपको मूल लकड़हारा लौटा रहा है। जब तक आप अन्य लॉगर को संशोधित नहीं करते हैं, तब तक आपको केवल रूट लॉगर को संशोधित करना होगा।
21

18
क्या आप जानते हैं कि logging.basicConfig (स्तर = logging.INFO) काम क्यों नहीं करता है? मैं इसे दस्तावेज पर स्पष्ट रूप से नहीं देख सकता।
डॉपेलगैंगर

1
@ P1h3r1e3d13 यदि आपके पास केवल एक ही रूट लॉगर है, जिसकी संभावना सबसे अच्छी है।
ज़ीटेक्स

7
यह पायथन 3.5 पर काम नहीं करता है:Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux >>> import logging >>> rootLog = logging.getLogger() >>> rootLog.setLevel(logging.INFO) >>> rootLog.info('all the kings horses') >>> rootLog.warning('all the kings men') all the kings men
जेफ के

6
@ जेफक, मेरे साथ भी 3.6.8 सेटलेट के लॉग करने पर सेट होने पर भी सूचना संदेश नहीं छापता है ।INFO
रॉबर्ट

31

जैसे @ztyx ने कहा कि डिफ़ॉल्ट लकड़हारा स्तर चेतावनी है। आपको इसे निचले स्तर पर सेट करना होगा

आप इसे logging.basicConfig का उपयोग करके और लकड़हारा स्तर सेट करके कर सकते हैं :

logging.basicConfig(level=logging.DEBUG)

8
मैं सोच रहा हूं कि basicConfig()मेरे लिए काम क्यों नहीं करता, हालांकि logging.getLogger().setLevel()उपयुक्त रूप से काम करता है?
शयन अमानी

17

उपरोक्त समाधान मेरे लिए काम नहीं किया, लेकिन यहाँ कोड किया था:

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(मैं पठनीयता के लिए कोड के कुछ हिस्सों को छोड़ दिया गया)


1
यह केवल एक चीज है जो मेरे लिए काम करती है। मैं के साथ एक लाइन थी logging.error("Connection timed out!")और यहां तक कि साथ level=logging.DEBUGमें basicConfig(), यह कंसोल में प्रिंट नहीं होगा। हाथ जोड़ने वाले ने किया, बहुत बहुत धन्यवाद !!
ब्रूसवेने

ध्यान रखें कि आप जिस हैंडलर का उपयोग कर रहे हैं वह भूमिका निभा रहा है। यदि, उदाहरण के लिए, आपके कोड में NullHandler था, तो लॉगिंग लीवर की परवाह किए बिना कुछ भी मुद्रित नहीं किया जाएगा।
जॉर्ज

यहाँ भी - अगर मैं स्तर तर्क को छोड़ देता हूं basicConfigया इसे INFO के ऊपर सेट कर देता हूं तो कंसोल लॉगर कभी भी लॉग नहीं करेगा। यदि मैं बाहर निकलता basicConfigहूं तो मैं setLevelपूरे दिन एक लकड़हारे को बुला सकता हूं (और मैं कॉल करके स्तर परिवर्तन देख सकता हूं getEffectiveLevel) लेकिन यह कभी भी नीचे WARNINGस्तर से लॉग इन नहीं करेगा । मुझे वास्तव में यकीन नहीं है कि यह सही व्यवहार नहीं है, लेकिन इसकी वह नहीं है जिसकी मुझे उम्मीद थी।
हाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.