このソリューションは、標準の 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
これは非常に有益なトレースバックを生成します。同じ形式が電子メールとターミナル ハンドラで使用されます。