首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更改级别记录到IPython/Jupyter notebook

更改级别记录到IPython/Jupyter notebook
EN

Stack Overflow用户
提问于 2016-02-11 06:01:11
回答 3查看 12.2K关注 0票数 12

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

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

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

更多信息:

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

代码语言:javascript
复制
# In notebook
import logging
logging.basicConfig()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Import the module
import mymodule

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

代码语言:javascript
复制
# 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')

当在notebook中调用模块代码时,我希望日志向上传播,然后顶部记录器只打印info log语句。但是会同时显示debug和info log语句。

相关链接:

来自this IPython issue

访问的IPython记录器

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-04 04:40:48

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

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

代码语言:javascript
复制
# 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()调用替换为更具体的调用:

代码语言:javascript
复制
logging.getLogger('some.module').setLevel(logging.DEBUG)
票数 15
EN

Stack Overflow用户

发布于 2016-02-11 06:21:18

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

代码语言:javascript
复制
# 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,它就可以工作了。

票数 7
EN

Stack Overflow用户

发布于 2019-09-29 23:23:36

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

代码语言:javascript
复制
import logging
logging.basicConfig(level=20)

然后这就行了:

代码语言:javascript
复制
logging.getLogger().info("hello")
>> INFO:root:hello

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35326814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档