Журналирование Python SMTPHandler — обработка автономного SMTP-сервера

StackOverflow https://stackoverflow.com/questions/1304593

  •  19-09-2019
  •  | 
  •  

Вопрос

Я настроил модуль журналирования для моего нового скрипта 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top