从IPython Notebook中的日志记录模块获取输出

时间:2013-09-13 12:57:48

标签: python logging jupyter-notebook jupyter

当我在IPython Notebook中运行以下内容时,我看不到任何输出:

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

任何人都知道如何制作它以便我可以在笔记本中看到“测试”消息吗?

9 个答案:

答案 0 :(得分:95)

请尝试以下操作:

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

根据logging.basicConfig

  

通过创建日志记录系统的基本配置   StreamHandler使用默认格式化程序并将其添加到根目录   记录仪。函数debug(),info(),warning(),error()和   如果没有处理程序,critical()将自动调用basicConfig()   为根记录器定义。

     

如果根记录器已有处理程序,则此函数不执行任何操作   为它配置。

似乎ipython notebook在某处调用了basicConfig(或set handler)。

答案 1 :(得分:56)

如果您仍想使用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')

答案 2 :(得分:23)

我的理解是IPython会话启动了日志记录,因此basicConfig不起作用。这是适合我的设置(我希望这不是那么粗略,因为我想在几乎所有的笔记本上使用它):

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 :(得分:9)

请记住,stderr是logging模块的默认流,因此在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!')

答案 4 :(得分:7)

您可以通过运行%config Application.log_level="INFO"

来配置日志记录

有关详细信息,请参阅IPython kernel options

答案 5 :(得分:3)

现在对我有用的东西(Jupyter,笔记本服务器是:5.4.1,IPython 7.0.1)

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

现在,我可以使用记录器来打印信息,否则,我只会看到默认级别(logging.WARNING)或更高级别的消息。

答案 6 :(得分:0)

我为这两个文件都设置了一个记录器,我希望它能显示在笔记本上。事实证明,添加文件处理程序会清除默认的流处理程序。

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")

答案 7 :(得分:0)

似乎不适用于旧版本的ipython / jupyter的解决方案。

这是ipython 7.9.0的有效解决方案(也已通过jupyter服务器6.0.2测试):

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

DEBUG:root:test message

答案 8 :(得分:0)

我想要一个简单直接的答案,并带有样式优美的输出,所以这是我的建议

import sys
import logging

logging.basicConfig(
    format='%(asctime)s [%(levelname)s] %(name)s - %(message)s',
    level=logging.INFO,
    datefmt='%Y-%m-%d %H:%M:%S',
    stream=sys.stdout,
)
log = logging.getLogger('notebook')

然后,您可以在笔记本中的任何地方使用log.info()或任何其他logging levels,其输出看起来像这样

2020-10-28 17:07:08 [INFO] notebook - Hello world
2020-10-28 17:12:22 [INFO] notebook - More info here
2020-10-28 17:12:22 [INFO] notebook - And some more
相关问题