Jupyter IPython Notebook 中丰富的日志输出

Rich logging output in Jupyter IPython Notebook

我是 运行 Python Jupyter 笔记本服务器上的笔记本。我正在使用 Python logging 模块进行日志记录,目前连接到 stdout 就像任何控制台应用程序一样,在 Jupyter Notebook 输出中显示日志消息。

但默认的基于 stdout 的日志记录输出感觉有限。 HTML 输出比普通 text/ANSI 输出可以做的更多。

是否有任何高级 Jupyter Notebook 日志记录处理程序和格式化程序可以理解输出为 HTML 并进行相应调整?例如。提供更丰富的颜色和字体大小格式选项,并以交互方式探索日志消息上下文参数,就像 Sentry 允许的那样?

假设您知道要打印哪种类型的格式化输出,您可以使用 IPython.core.display 包。

例如,要打印 HTML 格式的输出,您可以这样做:

from IPython.core.display import HTML
HTML('<a href="http://example.com">link</a>')

要打印 Markdown 格式的输出,您可以这样做:

from IPython.core.display import Markdown
Markdown('# This will be an H1 title')

我不确定你所说的“探索上下文参数”到底是什么意思,所以也许这里的一个例子会清楚一些。

以前从未想过要尝试这个,但是是的,你可以使用 IPython.display.display 和一个自定义的 logging.Handler 来做到这一点:

import logging
from IPython.display import display, HTML

class DisplayHandler(logging.Handler):
    def emit(self, record):
        message = self.format(record)
        display(message)

这可以用来显示笔记本可以显示的任何内容,包括HTML、Markdown、图像???、音频????? (如果你想让你的笔记本读你的日志给你)。

我将其与自定义 logging.Formatter 相结合,该自定义 logging.Formatter 输出一个 HTML 对象以传递给 display()。它不是很漂亮,但你可以采用基本概念并加以改进,或者将两个 classes 组合成一个 NotebookHTMLHandler class 或类似的东西:

class HTMLFormatter(logging.Formatter):
    level_colors = {
        logging.DEBUG: 'lightblue',
        logging.INFO: 'dodgerblue',
        logging.WARNING: 'goldenrod',
        logging.ERROR: 'crimson',
        logging.CRITICAL: 'firebrick'
    }
    
    def __init__(self):
        super().__init__(
            '<span style="font-weight: bold; color: green">{asctime}</span> '
            '[<span style="font-weight: bold; color: {levelcolor}">{levelname}</span>] '
            '{message}',
            style='{'
        )
    
    def format(self, record):
        record.levelcolor = self.level_colors.get(record.levelno, 'black')
        return HTML(super().format(record))

放在一起你可以这样使用它:

log = logging.getLogger()
handler = DisplayHandler()
handler.setFormatter(HTMLFormatter())
log.addHandler(handler)
log.setLevel(logging.DEBUG)

这是一个外观示例:

对于 HTML 版本你可以进一步整理,如果 HTML 变得足够复杂,通过结合像 Jinja 这样的 HTML 模板引擎,或者添加 JavaScript/Widgets 根据您的想法使日志消息可扩展以显示更多日志记录上下文。我认为完整的解决方案超出了这个答案的范围。