Python 日志记录 SMTPHandler - 处理离线 SMTP 服务器

问题描述 投票:0回答:2

我已经为我的新 python 脚本设置了日志记录模块。我有两个处理程序,一个将内容发送到文件,另一个用于电子邮件警报。 SMTPHandler 被设置为发送 ERROR 级别或更高级别的任何内容。

一切正常,除非 SMTP 连接失败。如果 SMTP 服务器没有响应或身份验证失败(它需要 SMTP 身份验证),那么整个脚本就会死掉。

我是 python 的新手,所以我想弄清楚如何捕获 SMTPHandler 引发的异常,以便通过电子邮件发送日志消息的任何问题都不会破坏我的整个脚本。由于我也在将错误写入日志文件,如果 SMTP 警报失败,我只想继续前进,而不是停止任何事情。

如果我需要一个“try:”语句,它会绕过 logging.handlers.SMTPHandler 设置,还是绕过对 my_logger.error() 的单独调用?

python logging handler python-logging
2个回答
5
投票

日志记录期间发生的异常不应停止您的脚本,尽管它们可能会导致将回溯打印到

sys.stderr
。为了防止这种打印输出,请执行以下操作:

logging.raiseExceptions = 0

这不是默认值(因为在开发中你通常想知道失败)但在生产中,

raiseExceptions
不应该被设置。

您应该会发现

SMTPHandler
将在下次记录错误(或更高级别)时尝试重新连接。

logging
确实 通过
SystemExit
KeyboardInterrupt
异常,但应处理所有其他异常,以免它们导致使用日志记录的应用程序终止。如果您发现情况并非如此,请发布异常的具体细节,这些异常正在通过并导致您的脚本终止,以及您的 Python/操作系统版本。请记住,如果存在导致处理程序阻塞的网络超时(例如,如果 DNS 查找需要很长时间,或者如果 SMTP 连接需要很长时间),脚本可能会挂起。


0
投票

你可能需要两者都做。为了解决这个问题,我建议安装一个本地邮件服务器并使用它。这样,您可以在脚本运行时将其关闭并记下错误消息。

为了保持代码的可维护性,您应该以这样一种方式扩展 SMTPHandler,以便您可以在一个地方处理异常(而不是用 try-except 包装每个记录器调用)。

© www.soinside.com 2019 - 2024. All rights reserved.