更改级别记录到IPython/Jupyter笔记本
我有一个包,它依赖于几个不同的模块,每个模块都设置了自己的记录器。这允许我记录每个日志消息的来源,这很有用 然而,在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
# 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日志记录级别。另一个是IPython记录器,通过ipython\u notebook\u config
访问get\u IPython().parent.log
# 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
。