问题:从IPython Notebook中的日志记录模块获取输出
当我在IPython Notebook中运行以下命令时,看不到任何输出:
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")
有人知道怎么做,这样我才能在笔记本中看到“测试”消息吗?
回答 0
请尝试以下操作:
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")
通过创建带有默认Formatter的StreamHandler并将其添加到根记录器,对记录系统进行基本配置。如果没有为根记录器定义处理程序,则debug(),info(),warning(),error()和critical()函数将自动调用basicConfig()。
如果根记录器已经为其配置了处理程序,则此功能不执行任何操作。
似乎ipython笔记本在某处调用basicConfig(或设置处理程序)。
回答 1
如果仍要使用basicConfig
,请像这样重新加载日志记录模块
from importlib import reload # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')
回答 2
我的理解是IPython会话开始记录日志,因此basicConfig不起作用。这是对我有用的设置(我希望这看起来不太好,因为我想将其用于几乎所有笔记本电脑):
import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='mylog.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)
现在,当我运行时:
logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning.')
我在与笔记本相同的目录中得到一个“ mylog.log”文件,其中包含:
2015-01-28 09:49:25,026 - root - ERROR - hello!
2015-01-28 09:49:25,028 - root - DEBUG - This is a debug message
2015-01-28 09:49:25,029 - root - INFO - this is an info message
2015-01-28 09:49:25,032 - root - WARNING - tbllalfhldfhd, warning.
请注意,如果您在不重新启动IPython会话的情况下重新运行它,则会将重复的条目写入文件,因为现在将定义两个文件处理程序
回答 3
请记住,stderr是logging
模块的默认流,因此在IPython和Jupyter笔记本中,除非将流配置为stdout,否则可能看不到任何内容:
import logging
import sys
logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
level=logging.INFO, stream=sys.stdout)
logging.info('Hello world!')
回答 4
现在对我有用的(Jupyter,笔记本服务器是:5.4.1,IPython 7.0.1)
import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)
现在,我可以使用记录器来打印信息,否则,我只会看到默认级别(logging.WARNING
)或更高级别的消息。
回答 5
您可以通过运行配置日志记录 %config Application.log_level="INFO"
有关更多信息,请参见IPython内核选项。
回答 6
我为这两个文件都设置了一个记录器,我希望它能显示在笔记本上。事实证明,添加文件处理程序会清除默认的流处理程序。
logger = logging.getLogger()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# Setup file handler
fhandler = logging.FileHandler('my.log')
fhandler.setLevel(logging.DEBUG)
fhandler.setFormatter(formatter)
# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.DEBUG)
chandler.setFormatter(formatter)
# Add both handlers
logger.addHandler(fhandler)
logger.addHandler(chandler)
logger.setLevel(logging.DEBUG)
# Show the handlers
logger.handlers
# Log Something
logger.info("Test info")
logger.debug("Test debug")
logger.error("Test error")
回答 7
似乎适用于ipython / jupyter早期版本的解决方案不再起作用。
这是适用于ipython 7.9.0的有效解决方案(也已通过jupyter服务器6.0.2测试):
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test message")
DEBUG:root:test message