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


127

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

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

有人知道怎么做,这样我才能在笔记本中看到“测试”消息吗?


您正在使用哪个版本的IPython,因为它在1.0中有效?
Viktor Kerkez 2013年

@ViktorKerkez ipython3 notebook --version返回1.0.0
Kyle Brandt

imgur.com/1b7nGZz在尝试您的代码时得到此提示。
Viktor Kerkez 2013年

@ViktorKerkez:是的,我不明白,我应该提出一个问题……
Kyle Brandt

Answers:


129

请尝试以下操作:

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

根据logging.basicConfig

通过创建带有默认Formatter的StreamHandler并将其添加到根记录器,对记录系统进行基本配置。如果没有为根记录器定义处理程序,则debug(),info(),warning(),error()和critical()函数将自动调用basicConfig()。

如果根记录器已经为其配置了处理程序,则此功能不执行任何操作。

似乎ipython笔记本在某处调用basicConfig(或设置处理程序)。


4
在普通的IPython控制台中也会发生同样的情况:除非logger创建了根目录,否则它不会打印任何内容。
Ioannis Filippidis 2014年

1
此解决方案可在ipykernel4.5(可能最早于4.4)中再次使用github.com/jupyter/notebook/issues/1397
pylang

17
这不再起作用。不支持Jupyter Notebook 5.3.0
Wesam,

64

如果仍要使用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
对于尝试在Python 3中进行此操作的任何人来说,reload现在imp.reload
kuzzooroo

11
从Python 3.5开始,由于不建议使用imp模块,因此应使用importlib.reload
Webucator

2
如果有人在使用Spyder进行日志记录时遇到麻烦(所有尝试修改记录器行为的尝试均未成功),这将结束为期一天的鹅追逐。github.com/spyder-ide/spyder/issues/2572非常感谢!
FrenchKheldar

27

我的理解是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
为了减少这种“粗俗的外观”,请将代码放在python路径中的模块中,然后将其导入。将来更漂亮,更容易升级。
亚历克西斯

1
或者使用logging.config.fileConfig('logging.conf')并将所有设置都放在其中。
K.-Michael Aye

14

请记住,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!')

13

现在对我有用的(Jupyter,笔记本服务器是:5.4.1,IPython 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,并感谢您的帮助。您可能想通过添加一些解释来使答案更好。
Elias MP

1
这实际上对我来说是最有用的答案!
IanS

1
您可以添加一个示例行吗?记录器要调用以打印日志消息的句柄是什么?
Wesam '18

至少ipython 7.9.0(或jupyter 6.0.2)会忽略建议的代码,因为它不支持正在运行的控制台中的此类。运行%config查看支持的分类,Application不是其中之一。ipython 7.9.0在这里。
stason

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 / 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.