Python logging SMTPHandler - 处理离线SMTP服务器

1 投票
2 回答
1670 浏览
提问于 2025-04-15 13:44

我为我的新Python脚本设置了日志记录模块。我有两个处理器,一个是把日志信息发送到文件,另一个是用来发送邮件提醒的。SMTPHandler被设置为在错误级别或更高的情况下发送邮件。

一切运行得很好,除非SMTP连接失败。如果SMTP服务器没有响应或者认证失败(它需要SMTP认证),那么整个脚本就会崩溃。

我对Python还比较陌生,所以我在想怎么捕捉SMTPHandler抛出的异常,这样在通过邮件发送日志信息时出现问题就不会导致整个脚本停止。因为我也在写错误到日志文件,如果SMTP提醒失败,我只想继续运行,而不是停下来。

如果我需要一个“try:”语句,它应该放在logging.handlers.SMTPHandler的设置周围,还是放在我调用my_logger.error()的每个地方呢?

2 个回答

0

你可能需要同时做这两件事。为了弄明白怎么做,我建议你安装一个本地的邮件服务器,然后用它。这样,你可以在脚本运行的时候把邮件服务器关掉,然后记录下错误信息。

为了让代码更容易维护,你应该扩展SMTPHandler,这样你就可以在一个地方处理所有的异常(而不是每次记录日志的时候都用try-except包裹)。

5

在记录日志时发生的错误不应该让你的脚本停止运行,虽然可能会在sys.stderr上打印出错误信息。为了避免这种打印输出,你可以这样做:

logging.raiseExceptions = 0

这不是默认设置(因为在开发阶段你通常希望知道哪里出错了),但在生产环境中,raiseExceptions不应该被设置。

你会发现,SMTPHandler会在下次记录错误(或更严重的错误)时尝试重新连接。

logging确实会处理SystemExitKeyboardInterrupt这两种异常,但其他的异常应该被处理,以免导致使用日志记录的应用程序终止。如果你发现情况不是这样,请提供具体的异常信息,这些异常导致你的脚本终止,以及你使用的Python版本和操作系统。请记住,如果网络超时导致处理程序阻塞,脚本可能会看起来像是卡住了(例如,如果DNS查询耗时很长,或者SMTP连接耗时很长)。

撰写回答