以前从未尝试过这样做,但是你可以使用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)
这是一个示例,看起来是这样的:
![enter image description here](https://istack.dev59.com/aZ00a.webp)
对于HTML版本,如果HTML变得足够复杂,您可以通过与类似Jinja的HTML模板引擎组合,进一步简化它,或者添加JavaScript/小部件,使日志消息可扩展以显示更多的日志记录上下文。但我认为完整的解决方案超出了本回答的范围。