Python日志记录SMTPHandler - 处理脱机SMTP服务器

时间:2009-08-20 07:45:57

标签: python logging handler

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

除非SMTP连接失败,否则一切正常。如果SMTP服务器没有响应或身份验证失败(它需要SMTP身份验证),则整个脚本将会终止。

我对python很新,所以我试图找出如何捕获SMTPHandler正在引发的异常,以便通过电子邮件发送日志消息的任何问题都不会导致我的整个脚本崩溃。由于我也在向日志文件写错误,如果SMTP警报失败,我只想继续,不要停止任何事情。

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

2 个答案:

答案 0 :(得分:5)

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

logging.raiseExceptions = 0

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

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

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

答案 1 :(得分:0)

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

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