以前从未想过要尝试这个,但是你可以使用 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 以使日志消息可扩展以显示更多日志记录上下文,从而进一步整理这些内容,根据你的想法。我认为一个完整的解决方案超出了这个答案的范围。