SMTPHandler в модуле протоколирования Python, отправляя электронные письма по одному. Как я могу остановить это?

Я пытаюсь использовать модуль Python logging для отправки писем, содержащих журналы. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я пишу запись в журнале, отправляется электронное письмо. Как мне помещать в очередь сообщения журнала и отправлять одно электронное письмо по завершении script?

У меня такое ощущение, что оно выполняется с помощью метода emit(), но я не могу понять, как его использовать.

import logging, logging.handlers
log = logging.getLogger("mylogger")
log.setLevel(logging.DEBUG)
h2 = logging.handlers.SMTPHandler(mailhost='mailserver',
                            fromaddr='[email protected]',
                            toaddrs=['[email protected]'],
                            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. :-(")

Ответы

Ответ 1

См. этот ответ, который я дал для аналогичного вопроса. Например, обработчик примера здесь; вы можете адаптировать его к своим требованиям.

Ответ 2

Просто подкласс SMTPHandler для создания желаемого поведения. вы можете, например, переопределить метод emit для отправки почты на каждое третье зарегистрированное сообщение

Внимание: в зависимости от выбранной вами реализации никакой почты вообще не будет отправлено, если вы регистрируетесь только один или два раза. Возможно, отложенная отправка может быть решением: подождите несколько секунд, прежде чем отправлять почту. Если после второго нет другой строки, а затем отправьте ее, добавьте строку в сообщение для отправки и подождите еще секунду... и так далее... (Отложенная отправка должна выполняться в отдельном потоке (рассмотрите возможность использования Timer)