简单灵活的方法是不仅格式化电子邮件内容,还格式化电子邮件主题。这需要子类化logging.handlers.SMTPHandler。
这样,如果您配置的主题中有任何变量引用,它将按需扩展。这是包含测试代码的实现:
import logging, logging.handlers
class TitledSMTPHandler(logging.handlers.SMTPHandler):
def getSubject(self, record):
formatter = logging.Formatter(fmt=self.subject)
return formatter.format(record)
# below is to test
logging.getLogger().addHandler(TitledSMTPHandler(
('your.smtp.server',587),
'email@from.address', 'email@to.address',
'%(asctime)s Error: %(message)s',
('SMTP login', 'SMTP password'), ()
))
logging.error("TestError")
用您的替换 SMTP 配置,运行代码,您应该会收到一封电子邮件,其中错误消息在主题中(也在电子邮件正文中)。
如果您在日志配置文件中定义处理程序,请记住转义参数引用。例如%(asctime)s 应该变成 %%(asctime)s,以防止 configparser 的过早插值 - 但是在 python 3.1 和之前,%% 转义并没有受到影响。
拜托,如果您一次只问一个问题,您将对其他 Google 员工有很大帮助。您应该开始两个主题,一个叫做“有没有办法将异常名称放入邮件主题?”另一个“有没有办法防止发送仍然相同的错误?”
我只会回答您的第一个问题,以便专注于一个主题。也许您认为这两个问题可能相互依赖,因此必须一起提出,而它们只是一起出现在您的脑海中。我认为建议您更改问题的标题以强调一个问题而不是说“高级的东西”仍然是可行的。
如果问题是一个开放主题和/或无法明确定义(例如“我想要高级的东西,其他人都用什么?”),我也建议访问 comp.lang.python