Jupyter IPython Notebook 中的丰富日志输出

Mik*_*maa 5 ipython jupyter-notebook python-logging

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

stdout基于默认的日志输出感觉有限。与纯文本/ANSI 输出相比,HTML 输出可以做更多的事情。

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

Igu*_*aut 10

以前从未想过尝试这个,但是是的,您可以使用调用它的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)
Run Code Online (Sandbox Code Playgroud)

这可以用来显示笔记本可以显示的任何内容,包括 HTML、Markdown、图像???、音频???(如果您希望笔记本向您读取日志)。

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

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))
Run Code Online (Sandbox Code Playgroud)

把所有的东西放在一起你就可以像这样使用它:

log = logging.getLogger()
handler = DisplayHandler()
handler.setFormatter(HTMLFormatter())
log.addHandler(handler)
log.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

下面是它的外观示例:

在此输入图像描述

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