Python的日志记录模块中的SMTPHandler一次发送一封电子邮件。我怎么能阻止这个?

时间:2011-11-19 03:42:09

标签: python logging

我正在尝试使用Python的logging模块发送包含日志的电子邮件。我遇到的问题是,每次写日志条目时,都会发送一封电子邮件。如何在脚本结束时对日志消息进行排队并发送一封电子邮件?

我觉得这是用emit()方法完成的,但我无法弄清楚如何使用它。

import logging, logging.handlers
log = logging.getLogger("mylogger")
log.setLevel(logging.DEBUG)
h2 = logging.handlers.SMTPHandler(mailhost='mailserver',
                            fromaddr='noreply@example.com',
                            toaddrs=['me@example.com'],
                            subject='The log',
                            credentials=('user','pwd'),
                            secure=None)
h2.setLevel(logging.INFO)
h2.setFormatter(f)
log.addHandler(h2)

log.info("Did something")
log.info("Did something else")
log.info("This would send a third email. :-(")

2 个答案:

答案 0 :(得分:8)

请参阅this answer我提供的类似问题。要使用的示例处理程序是here;你可以根据自己的要求进行调整。

答案 1 :(得分:2)

简单地将SMTPHandler子类化以产生想要的行为。 例如,您可以覆盖emit方法,以便在每个第三条记录的消息上发送邮件

警告:根据您选择的实施方式,如果您只记录一次或两次,则根本不会发送任何邮件。也许延迟发送可能是解决方案:在发送邮件之前等一下。如果在一秒之后没有接收到其他行,则发送它否则将该行添加到要发送的消息中并等待另一秒......依此类推......(延迟发送必须在单独的线程中完成(考虑使用{ {3}})