首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jupyter IPython Notebook中丰富的日志输出

Jupyter IPython Notebook中丰富的日志输出
EN

Stack Overflow用户
提问于 2021-08-16 17:57:59
回答 2查看 265关注 0票数 1

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-25 23:00:01

以前从来没有想过要尝试这样做,但是你可以使用IPython.display.display和一个调用它的自定义logging.Handler来实现:

代码语言:javascript
复制
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组合在一起,后者输出一个HTML对象以传递给display()。它并不美观,但您可以采用基本概念并对其进行改进,或者将两个类合并为一个NotebookHTMLHandler类或类似的东西:

代码语言:javascript
复制
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))

综合起来,你可以像这样使用它:

代码语言:javascript
复制
log = logging.getLogger()
handler = DisplayHandler()
handler.setFormatter(HTMLFormatter())
log.addHandler(handler)
log.setLevel(logging.DEBUG)

下面是一个示例,展示了它的外观:

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

票数 3
EN

Stack Overflow用户

发布于 2021-08-24 08:43:33

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

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

代码语言:javascript
复制
from IPython.core.display import HTML
HTML('<a href="http://example.com">link</a>')

要打印Markdown格式的输出,您可以执行以下操作:

代码语言:javascript
复制
from IPython.core.display import Markdown
Markdown('# This will be an H1 title')

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68807282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档