我在Jupyter Notebook服务器上运行Python Notebook。我正在使用Python logging模块进行日志记录,目前可以像任何控制台应用程序一样连接到stdout,并在Jupyter Notebook输出中显示日志记录消息。
但是默认的基于stdout的日志输出感觉有限。与纯文本/ANSI输出相比,您可以使用HTML输出做更多的事情。
有没有高级的Jupyter Notebook日志处理程序和格式化程序可以理解输出是HTML并进行相应的调整?例如,提供更丰富的带有颜色和字体大小的格式化选项,并交互式地探索日志消息上下文参数,如Sentry允许做什么?
发布于 2021-08-25 23:00:01
以前从来没有想过要尝试这样做,但是你可以使用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组合在一起,后者输出一个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变得足够复杂,您可以通过与HTML模板引擎(如Jinja )相结合来进一步整理,或者添加JavaScript/Widgets以使日志消息可扩展以根据您的想法显示更多的日志记录上下文。我认为一个完整的解决方案超出了这个答案的范围。
发布于 2021-08-24 08:43:33
假设您知道要打印的格式化输出的类型,您可以使用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')我不确定你所说的“探索上下文参数”到底是什么意思,所以也许这里的一个例子就能说明问题。
https://stackoverflow.com/questions/68807282
复制相似问题