0

我一直想让我的异常电子邮件更易于阅读/导航,我认为如果我可以对输出进行颜色编码,特别是回溯和一些 JSON 打印,它会让我的生活更轻松。

所以这个问题是双重的:

  1. 如何设置我的格式化程序SMTPHandler以便它吐出 HTML,并将SMTPHandler电子邮件作为 HTML 而不仅仅是纯文本发送?

  2. 您是否知道任何可以轻松获取回溯和/或 JSON 并将输出颜色编码为 HTML 的库?

4

1 回答 1

1

该解决方案扩展了标准 logging.SMTPHandler 并使用pygments库来创建彩色 html 版本的回溯。它不是很优雅,因为它必须使用 formatter 私有属性:_fmt来构造额外的日志信息,但它可以工作(您可以使用 pygments 或直接在 html 变量中自定义样式):

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate
import logging
from logging.handlers import SMTPHandler
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import PythonTracebackLexer
import smtplib


class ColorfulSMTPHandler(SMTPHandler):

    def emit(self, record):
        try:
            port = self.mailport
            if not port:
                port = smtplib.SMTP_PORT
            smtp = smtplib.SMTP(self.mailhost, port)
            msg = MIMEMultipart('alternative')
            msg['Subject'] = self.getSubject(record)
            msg['From'] = self.fromaddr
            msg['To'] = ",".join(self.toaddrs)
            msg['Date'] = formatdate()

            text = self.format(record)
            msg.attach(MIMEText(text, 'plain'))
            if record.exc_text:
                html_formatter = HtmlFormatter(noclasses=True)
                tb = highlight(record.exc_text, PythonTracebackLexer(), html_formatter)

                info = (self.formatter or logging._defaultFormatter)._fmt % record.__dict__
                info = '<p style="white-space: pre-wrap; word-wrap: break-word;">%s</p>' % info

                html = ('<html><head></head><body>%s%s</body></html>')% (info, tb)
                msg.attach(MIMEText(html, 'html'))
            if self.username:
                if self.secure is not None:
                    smtp.ehlo()
                    smtp.starttls(*self.secure)
                    smtp.ehlo()
                smtp.login(self.username, self.password)
            smtp.sendmail(self.fromaddr, self.toaddrs, msg.as_string())
            smtp.quit()
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)

编辑:您还可以使用我的大正义分支中的日志记录处理程序:https ://github.com/paluh/great-justice-with-logging/blob/master/great_justice/logging.py#L85

它会生成非常好的、信息丰富的回溯——在电子邮件和终端处理程序中使用相同的格式:

在此处输入图像描述

于 2012-10-08T17:13:30.637 回答