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

问题描述:

我已经设置为我的新Python脚本日志模块。我有两个处理程序,一个发送文件到一个文件,另一个发送电子邮件警报。 SMTPHandler设置为以ERROR级别或更高级别发送邮件。Python记录SMTPHandler - 处理离线SMTP服务器

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

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

如果我需要一个“尝试:”语句,它会去周围的logging.handlers.SMTPHandler设置,或者围绕单个调用my_logger.error()?

异常不应该停止你的脚本,虽然他们可能会导致回溯至被打印到sys.stderr。为了防止这种情况的打印输出,做到以下几点:

logging.raiseExceptions = 0 

这不是默认的(因为在发展,你通常想知道关于失败的),但在生产,raiseExceptions不应设置。

你应该发现,SMTPHandler将在下一次的错误(或更高版本)登录尝试重新连接。

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

+0

谢谢。我已经添加了raiseExceptions代码。你是对的,它没有终止脚本......重试造成了这样的延迟,我认为是这样。 – 2009-08-22 00:29:40

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

为了保持代码的可维护性,你应该在你可以处理在一个地方例外这样的方式延伸SMTPHandler(而不是包装与尝试 - 除了每个记录调用)。记录过程中发生的

+0

我们将使用本地SMTP服务器进行生产。服务器对于dev是远程的,因此我遇到了错误。 – 2009-08-22 00:30:26