0

例外の電子メールをもう少し読みやすく/ナビゲートしやすくしたいと思っていましたが、出力、特にトレースバックといくつかの JSON プリントを色分けできれば、私の人生はずっと楽になると思います。

したがって、この質問は 2 つあります。

  1. SMTPHandlerHTML を吐き出すようにフォーマッタを設定し、SMTPHandlerプレーン テキストだけでなく HTML として電子メールを送信するにはどうすればよいですか?

  2. トレースバックや JSON を取得し、出力を HTML に色分けするのを簡単にするライブラリを知っていますか?

4

1 に答える 1

1

このソリューションは、標準の logging.SMTPHandler を拡張し、pygmentsライブラリを使用してカラフルな html バージョンのトレースバックを作成します。フォーマッターのプライベート属性を使用する必要があるため、あまりエレガントではありませんが、_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 に答える