Журналирование Python SMTPHandler — обработка автономного SMTP-сервера
Вопрос
Я настроил модуль журналирования для моего нового скрипта Python.У меня есть два обработчика: один отправляет данные в файл, а другой — для оповещений по электронной почте.SMTPHandler настроен на отправку по почте чего-либо на уровне ERROR или выше.
Все работает отлично, если только не происходит сбой SMTP-соединения.Если SMTP-сервер не отвечает или происходит сбой аутентификации (требуется SMTP-аутентификация), то весь скрипт умирает.
Я новичок в Python, поэтому пытаюсь понять, как перехватить исключение, которое вызывает SMTPHandler, чтобы любые проблемы с отправкой сообщения журнала по электронной почте не привели к сбою всего моего сценария.Поскольку я также записываю ошибки в файл журнала, в случае сбоя SMTP-оповещения я просто хочу продолжать работу, а не останавливать что-либо.
Если мне понадобится оператор «try:», будет ли он идти в обход настройки logging.handlers.SMTPHandler или отдельных вызовов my_logger.error()?
Решение
Исключения, возникающие во время регистрации, не должны останавливать работу вашего сценария, хотя они могут привести к печати обратной трассировки на sys.stderr
.Чтобы предотвратить эту распечатку, сделайте следующее:
logging.raiseExceptions = 0
Это не значение по умолчанию (поскольку при разработке обычно требуется знать о сбоях), но в производстве raiseExceptions
не следует устанавливать.
Вы должны обнаружить, что SMTPHandler
попытается повторно подключиться в следующий раз, когда будет зарегистрирована ОШИБКА (или более высокая).
logging
делает пройти через SystemExit
и KeyboardInterrupt
исключения, но все остальные следует обрабатывать так, чтобы они не приводили к завершению работы приложения, использующего журналирование.Если вы обнаружите, что это не так, опубликуйте подробную информацию об исключениях, которые проходят и приводят к завершению вашего сценария, а также о вашей версии Python/операционной системы.Имейте в виду, что сценарий может зависнуть, если существует тайм-аут сети, из-за которого обработчик блокируется (например.если поиск DNS занимает много времени или соединение SMTP занимает много времени).
Другие советы
Вероятно, вам нужно сделать и то, и другое.Чтобы разобраться в этом, я предлагаю установить локальный почтовый сервер и использовать его.Таким образом, вы можете закрыть его во время выполнения сценария и записать сообщение об ошибке.
Чтобы поддерживать код, вам следует расширить SMTPHandler таким образом, чтобы вы могли обрабатывать исключения в одном месте (вместо того, чтобы оборачивать каждый вызов средства ведения журнала с помощью try-Exception).