【问题标题】:Rich logging output in Jupyter IPython NotebookJupyter IPython Notebook 中丰富的日志记录输出
【发布时间】:2021-08-16 17:57:58
【问题描述】:

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

但默认的基于stdout 的日志输出感觉有限。除了纯文本/ANSI 输出之外,您还可以使用 HTML 输出做更多事情。

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

【问题讨论】:

    标签: jupyter-notebook ipython python-logging


    【解决方案1】:

    以前从未想过要尝试这个,但是你可以使用 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()。这不是很漂亮,但您可以采用基本概念并对其进行改进,或者将两个类组合成一个 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))
    

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

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

    这是一个外观示例:

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

    【讨论】:

    • 太棒了。非常感谢@Iguananaut。我很惊讶 IPython 没有开箱即用地提供这个功能。可能是一个不错的添加功能。
    • @MikkoOhtamaa 谢谢!是的,我真的很喜欢您使用交互式小部件进行丰富日志记录的想法。扩展到 Jupyter 扩展可能是一个好主意,尽管我个人目前并没有强烈的需要进一步使用它......
    【解决方案2】:

    假设您知道要打印的格式化输出类型,您可以使用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')
    

    我不确定你所说的“探索上下文参数”到底是什么意思,所以也许这里有一个例子可以说明问题。

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 2019-06-12
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多