从 IPython Notebook 中的日志模块获取输出

当我在 IPython Notebook 中运行以下命令时,我没有看到任何输出:

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")

有人知道怎么做吗,这样我就能看到笔记本里的“测试”信息了?

127110 次浏览

试试以下方法:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")

根据 BasicConfig:

通过创建一个 具有默认 Formatter 并将其添加到根目录的 StreamHandler 函数 debug ()、 info ()、 police ()、 error ()和 如果没有处理程序被调用,则 basic ()将自动调用 basicConfig () 为根日志记录器定义的。

如果根日志记录器已经有处理程序,则此函数不执行任何操作 为其配置

它看起来像是某个地方的 ipython 笔记本调用 basicConfig (或设置处理程序)。

如果您仍然希望使用 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')

我的理解是,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 会话的情况下重新运行这个命令,它将向文件中写入重复的条目,因为现在定义了两个文件处理程序

请记住,stderr 是 logging模块的默认流,因此在 IPython 和 Jupiter 笔记本中,除非将流配置为 stdout,否则您可能看不到任何内容:

import logging
import sys


logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
level=logging.INFO, stream=sys.stdout)


logging.info('Hello world!')

可以通过运行 %config Application.log_level="INFO"来配置日志记录

有关更多信息,请参见 IPython 内核选项

现在对我有用的(Jupiter,笔记本服务器是: 5.4.1,IPython 7.0.1)

import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)

现在我可以使用日志打印信息,否则我将只看到来自默认级别(logging.WARNING)或以上的消息。

我为这两个文件设置了一个日志记录器,我希望它显示在笔记本上。原来添加一个文件处理程序会清除默认的流处理程序。

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")

我想要一个简单而直接的答案,有很好的样式输出,所以这里是我的建议

import sys
import logging


logging.basicConfig(
format='%(asctime)s [%(levelname)s] %(name)s - %(message)s',
level=logging.INFO,
datefmt='%Y-%m-%d %H:%M:%S',
stream=sys.stdout,
)
log = logging.getLogger('notebook')

然后,您可以使用 log.info()或任何其他 记录水平在您的笔记本电脑的任何地方与输出,看起来像这样

2020-10-28 17:07:08 [INFO] notebook - Hello world
2020-10-28 17:12:22 [INFO] notebook - More info here
2020-10-28 17:12:22 [INFO] notebook - And some more

设计

import logging


# make a handler
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)


# add it to the root logger
logging.getLogger().addHandler(handler)

从你自己的日志

# make a logger for this notebook, set verbosity
logger = logging.getLogger(__name__)
logger.setLevel('DEBUG')


# send messages
logger.debug("debug message")
logger.info("so much info")
logger.warning("you've veen warned!")
logger.error("bad news")
logger.critical("really bad news")
2021-09-02 18:18:27,397 - __main__ - DEBUG - debug message
2021-09-02 18:18:27,397 - __main__ - INFO - so much info
2021-09-02 18:18:27,398 - __main__ - WARNING - you've veen warned!
2021-09-02 18:18:27,398 - __main__ - ERROR - bad news
2021-09-02 18:18:27,399 - __main__ - CRITICAL - really bad news

从其他库捕获日志记录

logging.getLogger('google').setLevel('DEBUG')


from google.cloud import storage


client = storage.Client()
2021-09-02 18:18:27,415 - google.auth._default - DEBUG - Checking None for explicit credentials as part of auth process...
2021-09-02 18:18:27,416 - google.auth._default - DEBUG - Checking Cloud SDK credentials as part of auth process...
2021-09-02 18:18:27,416 - google.auth._default - DEBUG - Cloud SDK credentials not found on disk; not using them
...

从日志记录版本3.8开始,添加了一个 force参数,它删除了所有现有的处理程序,从而允许 basicConfig工作。这适用于 IPython 版本7.29.0和 Jupiter Lab 版本3.2.1。

import logging
logging.basicConfig(level=logging.DEBUG,
force = True)
logging.debug("test")