【问题标题】:Change level logged to IPython/Jupyter notebook更改级别记录到 IPython/Jupyter 笔记本
【发布时间】: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')

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

相关链接:

【问题讨论】:

    标签: python python-2.7 logging ipython


    【解决方案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
      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2017-08-01
      • 2016-04-11
      相关资源
      最近更新 更多