更改级别记录到 IPython/Jupyter 笔记本

Posted

技术标签:

【中文标题】更改级别记录到 IPython/Jupyter 笔记本【英文标题】:Change level logged to IPython/Jupyter notebook 【发布时间】:2016-02-10 22:01:10 【问题描述】:

我有一个依赖于几个不同模块的包,每个模块都设置了自己的记录器。这允许我记录每条日志消息的来源,这很有用。

但是,当在 IPython/Jupyter 笔记本中使用此代码时,我无法控制打印到屏幕上的内容。具体来说,我收到了很多我不想看到的调试级消息。

如何更改打印到笔记本的日志级别?

更多信息:

我尝试在笔记本中设置一个根记录器,如下所示:

# In notebook
import logging
logging.basicConfig()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Import the module
import mymodule

然后在我的模块顶部,我有

# In mymodule.py
import logging
logger = logging.getLogger('mypackage.' + __name__)
logger.setLevel(logging.DEBUG)
logger.propagate = True
# Log some messages
logger.debug('debug')
logger.info('info')

当在笔记本中调用模块代码时,我希望日志能够向上传播,然后顶部记录器仅打印信息日志语句。但是调试和信息日志语句都会显示。

相关链接:

来自this IPython issue,似乎需要注意两种不同级别的日志记录。一,在ipython_notebook_config 文件中设置,仅影响内部 IPython 日志记录级别。另一个是 IPython 记录器,使用 get_ipython().parent.log 访问。 https://github.com/ipython/ipython/issues/8282 https://github.com/ipython/ipython/issues/6746

【问题讨论】:

【参考方案1】:

对于当前的 ipython/Jupyter 版本(例如 6.2.1),logging.getLogger().handlers 列表在启动后为空,logging.getLogger().setLevel(logging.DEBUG) 无效,即不打印任何信息/调试消息。

在 ipython 中,您还必须更改 ipython 配置设置(可能还需要解决 ipython 错误)。例如,降低日志记录阈值以调试消息:

# workaround via specifying an invalid value first
%config Application.log_level='WORKAROUND'
# => fails, necessary on Fedora 27, ipython3 6.2.1
%config Application.log_level='DEBUG'
import logging
logging.getLogger().setLevel(logging.DEBUG)
log = logging.getLogger()
log.debug('Test debug')

为了仅获取一个模块的调试消息(参见该模块中的 __name__ 值),您可以将上述 setLevel() 调用替换为更具体的调用:

logging.getLogger('some.module').setLevel(logging.DEBUG)

【讨论】:

【参考方案2】:

这个问题的根本原因(来自https://github.com/ipython/ipython/issues/8282)是 Notebook 默认创建一个根记录器(这与 IPython 的默认行为不同!)。解决方案是获取 notebook logger 的 handler,并设置其级别:

# At the beginning of the notebook
import logging
logger = logging.getLogger()
assert len(logger.handlers) == 1
handler = logger.handlers[0]
handler.setLevel(logging.INFO)

有了这个,我不需要在模块中设置logger.propagate = True,它就可以工作了。

【讨论】:

@Wesam,对于较新的 ipython 版本,引用的问题/解决方法不再适用。对于较新的 ipython 版本,由于其他原因,默认情况下不会打印调试消息。另请参阅我的回答。【参考方案3】:

添加另一个解决方案,因为该解决方案对我来说更容易。在 Ipython 内核启动时:

import logging
logging.basicConfig(level=20)

然后这个工作:

logging.getLogger().info("hello")
>> INFO:root:hello

logging.info("hello")
>> INFO:root:hello

如果我在导入和运行的函数中有类似的日志记录代码,也会显示该消息。

【讨论】:

您可以使用level=logging.INFO,而不是硬编码数字20

以上是关于更改级别记录到 IPython/Jupyter 笔记本的主要内容,如果未能解决你的问题,请参考以下文章

在 IPython (Jupyter) 中更改 Latex 输出的颜色

如何更改 IPython(Jupyter) 中代码的突出显示颜色样式?

在 IPython/Jupyter Notebooks 中显示行号

如何在 Markdown 单元格 ipython/jupyter 笔记本中更改颜色?

sh 将ipython / jupyter内核添加到python环境中

iPython/jupyter qtconsole 无法在 anaconda 2.4.0 中启动