使用SMTPHandler在Python中记录MemoryHandler中的输出

Spl*_*iFF 19 python logging

我将日志记录模块MemoryHandler设置为为SMTPHandler目标排队调试和错误消息.我想要的是当包含所有调试语句的进程错误(每行一个)时发送一封电子邮件.我得到的是每个调试消息的单独电子邮件.

这似乎应该是微不足道的,并且是日志包的一部分,但我找不到任何关于它的内容,没有例子,谷歌上没有任何内容.

log = logging.getLogger()
log.setLevel(logging.DEBUG)
debug_format = logging.Formatter("%(levelname)s at %(asctime)s in %(filename)s (line %(lineno)d):: %(message)s")

# write errors to email
error_mail_subject = "ERROR: Script error in %s on %s" % (sys.argv[0], os.uname()[1])
error_mail_handler = logging.handlers.SMTPHandler(SMTP_HOST, 'errors@'+os.uname()[1], [LOG_EMAIL], error_mail_subject)
error_mail_handler.setLevel(logging.ERROR)
#error_mail_handler.setLevel(logging.DEBUG)
error_mail_handler.setFormatter(debug_format)

# buffer debug messages so they can be sent with error emails
memory_handler = logging.handlers.MemoryHandler(1024*10, logging.ERROR, error_mail_handler)
memory_handler.setLevel(logging.DEBUG)

# attach handlers
log.addHandler(memory_handler)
log.addHandler(error_mail_handler)
Run Code Online (Sandbox Code Playgroud)

与此相关:

error_mail_handler如果它是目标,我是否需要明确地添加到记录器memory_handler?应该error_mail_handler设置为DEBUG还是ERROR目标?当它被喂食时它甚至需要一个目标memory_handler吗?

很想看到解决这个问题的任何人的一些工作代码.

Vin*_*jip 28

您可能需要使用或调整BufferingSMTPHandler其在该测试脚本.

通常,如果它是已添加到记录器的MemoryHandler处理程序的目标,则无需向记录器添加处理程序.如果设置处理程序的级别,这将影响处理程序实际处理的内容 - 它将不会处理任何比其级别设置更不严重的处理程序.

  • "为什么在那里画线?" "因为你必须把它画到某个地方"真的,我的观点是,确切地说,我发现SMTPHandler基本没用,而且在记录时SMTP支持必不可少的BufferingSMTPHandler.这条线被绘制在错误的地方. (4认同)
  • 为什么那个类不是标准库的一部分?一次发送所有消息似乎更有用,特别是对于批处理作业(与长时间运行的服务器相反) (2认同)
  • @anarcat:只是因为您必须在某处画线。 (2认同)

Acu*_*nus 6

我编写了自己的beastly线程安全实现,BufferingSMTPHandler它从一个单独的线程发送电子邮件.主要目标是不阻止主线程.

如上所述,它使用两个队列 - 这似乎是必要的,以便实现一些在代码的"可配置参数"部分中定义的有用的类级参数.尽管您可以按原样使用代码,但如果您学习并使用它来编写自己的类,则可能会更好.

问题:

  • 某些类级参数可能是实例级的.
  • 或者可以使用模块threading.Timersignal模块来避免永远运行的循环.