1

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

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

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

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

4

2 回答 2

5

记录期间发生的异常不应停止您的脚本,尽管它们可能会导致将回溯打印到sys.stderr. 为了防止这种打印输出,请执行以下操作:

logging.raiseExceptions = 0

这不是默认值(因为在开发中您通常想了解故障),但在生产中raiseExceptions不应设置。

您应该会发现SMTPHandler下次记录错误(或更高)时将尝试重新连接。

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

于 2009-08-20T18:32:40.013 回答
0

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

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

于 2009-08-20T07:55:43.407 回答