IPython नोटबुक में लॉगिंग मॉड्यूल से आउटपुट प्राप्त करें


128

जब मैं IPython नोटबुक के अंदर निम्नलिखित रन कर रहा हूँ तो मुझे कोई आउटपुट नहीं दिख रहा है:

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")

किसी को पता है कि इसे कैसे बनाया जाए ताकि मैं नोटबुक के अंदर "परीक्षण" संदेश देख सकूं?


1.0 में काम करने के बाद से आप IPython के किस संस्करण का उपयोग कर रहे हैं?
विक्टर केर्केज

@ViktorKerkez ipython3 notebook --versionरिटर्न1.0.0
काइल ब्रांट

imgur.com/1b7nGZz जब मैं आपका कोड आज़माता हूँ तो मुझे यह मिलता है।
विक्टर केर्केज़

@ViktorKerkez: हां मुझे लगता है कि नहीं मिलता है, लगता है कि मैं एक मुद्दा दायर करनी चाहिए ...
केली ब्रांट

जवाबों:


130

निम्नलिखित का प्रयास करें:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")

Logging.basicConfig के अनुसार :

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

यह फ़ंक्शन कुछ भी नहीं करता है यदि रूट लॉगर में पहले से ही हैंडलर इसके लिए कॉन्फ़िगर किए गए हैं।

ऐसा लगता है जैसे ipython नोटबुक कहीं बेसिक फोन (या सेट हैंडलर) को बुलाती है।


4
समान सामान्य IPython कंसोल में होता है: यह तब तक कुछ भी प्रिंट नहीं करता है, जब तक कि कोई रूट नहीं बनता loggerहै।
आयोनिस फिलिपिपिडिस

1
यह समाधान ipykernel4.5 में फिर से काम करता है (संभवतः 4.4 के रूप में जल्दी) github.com/jupyter/notebook/issues/1397
pylang

17
यह किसी भी अधिक काम नहीं करता है। नहीं Jupyter नोटबुक 5.3.0 के साथ
Wesam

65

यदि आप अभी भी उपयोग करना चाहते हैं basicConfig, तो लॉगिंग मॉड्यूल को इस तरह पुनः लोड करें

from importlib import reload  # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')

16
पायथन 3 में ऐसा करने की कोशिश करने वाले किसी के लिए: reloadअब हैimp.reload
कुजूरू

11
पायथन 3.5 के रूप में, आपको importlib.reload का उपयोग करना चाहिए क्योंकि छोटा मॉड्यूल अपग्रेड किया जा रहा है।
Webucator

2
यदि किसी को लॉगिंग के साथ स्पाइडर से परेशानी हो रही है (जहां लकड़हारा व्यवहार को संशोधित करने के सभी प्रयास असफल थे), तो बस एक दिन का हंस-पीछा समाप्त हो गया। github.com/spyder-ide/spyder/issues/2572 बहुत बहुत धन्यवाद!
फ्रेंचकेवलर

28

मेरी समझ यह है कि IPython सत्र शुरू हो रहा है इसलिए आधारभूत रूप से काम नहीं कर रहा है। यहां वह सेटअप है जो मेरे लिए काम करता है (काश यह इतना सकल नहीं होता, क्योंकि मैं इसे लगभग अपनी सभी नोटबुक के लिए उपयोग करना चाहता हूं):

import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='mylog.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)

अब जब मैं चला:

logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning.')

मुझे उसी नोटबुक में "mylog.log" फ़ाइल मिलती है, जिसमें मेरी नोटबुक है:

2015-01-28 09:49:25,026 - root - ERROR - hello!
2015-01-28 09:49:25,028 - root - DEBUG - This is a debug message
2015-01-28 09:49:25,029 - root - INFO - this is an info message
2015-01-28 09:49:25,032 - root - WARNING - tbllalfhldfhd, warning.

ध्यान दें कि यदि आप IPython सत्र को फिर से शुरू किए बिना इसे फिर से शुरू करते हैं, तो यह फ़ाइल में डुप्लिकेट प्रविष्टियों को लिख देगा क्योंकि अब दो फ़ाइल हैंडलर परिभाषित होंगे


3
इसे कम "सकल दिखने" बनाने के लिए, अपने अजगर पथ पर एक मॉड्यूल में कोड डालें, और इसे आयात करें। भविष्य में बेहतर और उन्नत करने के लिए आसान।
एलेक्सिस

1
या logging.config.fileConfig ('logging.conf') का उपयोग करें और सभी सेटअप को वहां रखें।
के।-माइकल ऐ

14

इस बात को ध्यान में रखें कि loggingमॉड्यूल के लिए stderr डिफ़ॉल्ट स्ट्रीम है , इसलिए IPython और Jupyter पुस्तिकाओं में आप तब तक कुछ भी नहीं देख सकते जब तक आप स्ट्रीम को stdout में कॉन्फ़िगर नहीं करते:

import logging
import sys

logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
                     level=logging.INFO, stream=sys.stdout)

logging.info('Hello world!')

13

मेरे लिए अब क्या काम किया (जुपिटर, नोटबुक सर्वर: 5.4.1, आईपीथॉन 7.0.1)

import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)

अब मैं जानकारी को प्रिंट करने के लिए लकड़हारे का उपयोग कर सकता हूं, अन्यथा मुझे डिफ़ॉल्ट स्तर ( logging.WARNINGया ऊपर) से केवल संदेश दिखाई देगा ।


2
हां, वह काम करता है। एक है चलाने के लिए basicConfig()tp यह काम करते हैं।
ब्रांट

11

आप लॉगिंग को कॉन्फ़िगर करके चला सकते हैं %config Application.log_level="INFO"

अधिक जानकारी के लिए, IPython कर्नेल विकल्प देखें


1
StackOverflow में आपका स्वागत है और आपकी मदद के लिए धन्यवाद। आप कुछ स्पष्टीकरण जोड़कर अपने उत्तर को और बेहतर बनाना चाहते हैं।
एलियास एमपी

1
यह वास्तव में मेरे लिए सबसे उपयोगी उत्तर था!
बजे

1
क्या आप एक उदाहरण के साथ कुछ पंक्तियाँ जोड़ सकते हैं? लॉग संदेश मुद्रित करने के लिए लॉगर हैंडल क्या है?
वेसम

कम से कम ipython 7.9.0 (या jupyter 6.0.2) सुझाए गए कोड को अनदेखा करता है, क्योंकि यह चलने वाले कंसोल से इस वर्ग का समर्थन नहीं करता है। %configसमर्थित वर्ग को देखने के लिए भागो , Applicationउनमें से एक नहीं है। यहां ipython 7.9.0।
स्टैसन

4

मैंने दोनों फ़ाइल के लिए एक लकड़हारा सेटअप किया और मैं चाहता था कि यह नोटबुक पर दिखाई दे। एक फ़ाइलहैंडलर को जोड़ने से टर्न आउट डिफ़ॉल्ट डिफ़ॉल्ट हैंडलर को साफ़ करता है।

logger = logging.getLogger()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Setup file handler
fhandler  = logging.FileHandler('my.log')
fhandler.setLevel(logging.DEBUG)
fhandler.setFormatter(formatter)

# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.DEBUG)
chandler.setFormatter(formatter)

# Add both handlers
logger.addHandler(fhandler)
logger.addHandler(chandler)
logger.setLevel(logging.DEBUG)

# Show the handlers
logger.handlers

# Log Something
logger.info("Test info")
logger.debug("Test debug")
logger.error("Test error")

0

ऐसा लगता है कि समाधान जो पुराने संस्करणों के लिए काम करते थे, अब काम नहीं करते हैं।

यहाँ ipython 7.9.0 (ज्यूपिटर सर्वर 6.0.2 के साथ परीक्षण किया गया) के लिए एक कार्यशील समाधान है:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test message")

DEBUG:root:test message
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.