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

更改级别记录到IPython/Jupyter笔记本,python,python-2.7,logging,ipython,Python,Python 2.7,Logging,Ipython,我有一个包,它依赖于几个不同的模块,每个模块都设置了自己的记录器。这允许我记录每个日志消息的来源,这很有用 然而,在IPython/Jupyter笔记本中使用此代码时,我无法控制打印到屏幕上的内容。具体来说,我收到了很多我不想看到的调试级消息 如何更改打印到笔记本的日志级别 更多信息: 我已尝试在笔记本中设置根记录器,如下所示: # In notebook import logging logging.basicConfig() logger = logging.getLogger() logg

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

然而,在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')
当在记事本中调用模块代码时,我希望日志被传播,然后顶部的记录器只打印info log语句。但是debug和info log语句都会显示出来

相关链接:

  • 从中可以看出,有两种不同的日志记录级别需要注意。一个是在
    ipython\u notebook\u config
    文件中设置的,它只影响内部ipython日志记录级别。另一个是IPython记录器,通过
    get\u IPython().parent.log
    访问

此问题(从)的根本原因是笔记本默认情况下创建了根记录器(这与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)

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

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

在ipython内部,您还必须更改ipython配置设置(并可能解决ipython bug)。例如,要降低日志记录阈值以调试消息,请执行以下操作:

# 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')
对于仅获取一个模块的调试消息(请参阅该模块中的
\uu name\uu
值),您可以将上述
setLevel()
调用替换为更具体的调用:

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

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

import logging
logging.basicConfig(level=20)
那么这就行了:

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

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

如果我导入并运行的函数中有类似的日志代码,则消息也会显示。

@Wesam,对于较新的ipython版本,引用的问题/解决方法不再适用。对于较新的ipython版本,由于其他原因,默认情况下不会打印调试消息。另请参见我的答案。您可以使用
level=logging.INFO
,而不是硬编码编号
20