更改级别记录到 IPython/Jupyter 笔记本
Change level logged to IPython/Jupyter notebook
我有一个包依赖于几个不同的模块,每个模块都设置了自己的记录器。这让我可以记录每条日志消息的来源,这很有用。
但是,在 IPython/Jupyter 笔记本中使用此代码时,我无法控制屏幕上打印的内容。具体来说,我收到了很多我不想看到的 DEBUG 级消息。
如何更改打印到笔记本的日志级别?
更多信息:
我尝试在笔记本中设置根记录器,如下所示:
# 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
此问题的根本原因(来自 https://github.com/ipython/ipython/issues/8282)是笔记本默认创建根记录器(这与 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)
无效,即没有 info/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)
添加另一个解决方案,因为该解决方案对我来说更容易。 Ipython 内核启动时:
import logging
logging.basicConfig(level=20)
然后这个有效:
logging.getLogger().info("hello")
>> INFO:root:hello
logging.info("hello")
>> INFO:root:hello
如果我在导入的函数中有类似的日志记录代码 运行,也会显示该消息。
我有一个包依赖于几个不同的模块,每个模块都设置了自己的记录器。这让我可以记录每条日志消息的来源,这很有用。
但是,在 IPython/Jupyter 笔记本中使用此代码时,我无法控制屏幕上打印的内容。具体来说,我收到了很多我不想看到的 DEBUG 级消息。
如何更改打印到笔记本的日志级别?
更多信息:
我尝试在笔记本中设置根记录器,如下所示:
# 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
此问题的根本原因(来自 https://github.com/ipython/ipython/issues/8282)是笔记本默认创建根记录器(这与 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)
无效,即没有 info/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)
添加另一个解决方案,因为该解决方案对我来说更容易。 Ipython 内核启动时:
import logging
logging.basicConfig(level=20)
然后这个有效:
logging.getLogger().info("hello")
>> INFO:root:hello
logging.info("hello")
>> INFO:root:hello
如果我在导入的函数中有类似的日志记录代码 运行,也会显示该消息。