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

A.W*_*Wan 8 python logging ipython python-2.7

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

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

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

更多信息:

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

# In notebook
import logging
logging.basicConfig()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Import the module
import mymodule
Run Code Online (Sandbox Code Playgroud)

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

# 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')
Run Code Online (Sandbox Code Playgroud)

当在笔记本中调用模块代码时,我希望日志传播,然后顶级记录器只打印信息日志语句.但是显示了debug和info log语句.

相关链接:

max*_*zig 9

使用当前的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')
Run Code Online (Sandbox Code Playgroud)

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

logging.getLogger('some.module').setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)


A.W*_*Wan 8

此问题的根本原因(来自https://github.com/ipython/ipython/issues/8282)是Notebook默认情况下创建根记录器(这与IPython默认行为不同!).解决方案是获取笔记本记录器的处理程序,并设置其级别:

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

有了这个,我不需要设置logger.propagate = True模块,它的工作原理.

  • 不工作.我得到`AssertionError` (2认同)
  • @Wesam,对于较新的ipython版本,引用的问题/解决方法不再适用.对于较新的ipython版本,默认情况下,由于其他原因,不会打印调试消息.另见我的回答. (2认同)

Ben*_*Ben 7

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

import logging
logging.basicConfig(level=20)
Run Code Online (Sandbox Code Playgroud)

然后这有效:

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

logging.info("hello")
>> INFO:root:hello
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以使用“level=logging.INFO”,而不是硬编码数字“20”。 (3认同)