Jupyter IPython Notebook 中丰富的日志输出
Rich logging output in Jupyter IPython Notebook
我是 运行 Python Jupyter 笔记本服务器上的笔记本。我正在使用 Python logging
模块进行日志记录,目前连接到 stdout
就像任何控制台应用程序一样,在 Jupyter Notebook 输出中显示日志消息。
但默认的基于 stdout
的日志记录输出感觉有限。 HTML 输出比普通 text/ANSI 输出可以做的更多。
是否有任何高级 Jupyter Notebook 日志记录处理程序和格式化程序可以理解输出为 HTML 并进行相应调整?例如。提供更丰富的颜色和字体大小格式选项,并以交互方式探索日志消息上下文参数,就像 Sentry 允许的那样?
假设您知道要打印哪种类型的格式化输出,您可以使用 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')
我不确定你所说的“探索上下文参数”到底是什么意思,所以也许这里的一个例子会清楚一些。
以前从未想过要尝试这个,但是是的,你可以使用 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()
。它不是很漂亮,但你可以采用基本概念并加以改进,或者将两个 classes 组合成一个 NotebookHTMLHandler
class 或类似的东西:
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 根据您的想法使日志消息可扩展以显示更多日志记录上下文。我认为完整的解决方案超出了这个答案的范围。
我是 运行 Python Jupyter 笔记本服务器上的笔记本。我正在使用 Python logging
模块进行日志记录,目前连接到 stdout
就像任何控制台应用程序一样,在 Jupyter Notebook 输出中显示日志消息。
但默认的基于 stdout
的日志记录输出感觉有限。 HTML 输出比普通 text/ANSI 输出可以做的更多。
是否有任何高级 Jupyter Notebook 日志记录处理程序和格式化程序可以理解输出为 HTML 并进行相应调整?例如。提供更丰富的颜色和字体大小格式选项,并以交互方式探索日志消息上下文参数,就像 Sentry 允许的那样?
假设您知道要打印哪种类型的格式化输出,您可以使用 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')
我不确定你所说的“探索上下文参数”到底是什么意思,所以也许这里的一个例子会清楚一些。
以前从未想过要尝试这个,但是是的,你可以使用 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()
。它不是很漂亮,但你可以采用基本概念并加以改进,或者将两个 classes 组合成一个 NotebookHTMLHandler
class 或类似的东西:
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 根据您的想法使日志消息可扩展以显示更多日志记录上下文。我认为完整的解决方案超出了这个答案的范围。