Mik*_*maa 5 ipython jupyter-notebook python-logging
我正在 Jupyter Notebook 服务器上运行 Python 笔记本。我正在使用 Pythonlogging模块进行日志记录,当前已连接到日志stdout,就像任何控制台应用程序一样,在 Jupyter Notebook 输出中显示日志消息。
但stdout基于默认的日志输出感觉有限。与纯文本/ANSI 输出相比,HTML 输出可以做更多的事情。
是否有任何高级 Jupyter Notebook 日志处理程序和格式化程序可以理解输出是 HTML 并进行相应调整?例如,提供更丰富的颜色和字体大小格式选项,并交互式地探索日志消息上下文参数,就像 Sentry 允许人们做的那样?
Igu*_*aut 10
以前从未想过尝试这个,但是是的,您可以使用调用它的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)
Run Code Online (Sandbox Code Playgroud)
这可以用来显示笔记本可以显示的任何内容,包括 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))
Run Code Online (Sandbox Code Playgroud)
把所有的东西放在一起你就可以像这样使用它:
log = logging.getLogger()
handler = DisplayHandler()
handler.setFormatter(HTMLFormatter())
log.addHandler(handler)
log.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
下面是它的外观示例:
对于 HTML 版本,如果 HTML 变得足够复杂,您可以通过与 Jinja 等 HTML 模板引擎相结合来进一步整理它,或者添加 JavaScript/Widget 以使日志消息可扩展以根据您的想法显示更多日志记录上下文。我认为完整的解决方案超出了这个答案的范围。
| 归档时间: |
|
| 查看次数: |
1919 次 |
| 最近记录: |