避免错误分析 bash 脚本中的大量电子邮件通知

Avoid mass e-mail notification in error analysis bash script

我正在从 docker 容器中选择错误日志详细信息,并在 shell 脚本中决定如何以及何时通过 discord and/or 电子邮件提醒该问题。

因为我经常收到邮件正文中包含相同信息的邮件提醒,所以我想实施以下两个调整:

致命错误日志选择:

FATS="$(docker logs --since 24h $NODENAME 2>&1 | grep 'FATAL' | grep -v 'INFO')"

已发送电子邮件,以防 FATS 包含一些内容:

swaks --from "$MAILFROM" --to "$MAILTO" --server "$MAILSERVER" --auth LOGIN --auth-user "$MAILUSER" --auth-password "$MAILPASS" --h-Subject "FATAL ERRORS FOUND" --body "$FATS" --silent "1"

只有在 FATS 与脚本的前一个 运行 内容不同的情况下,我如何才能发送电子邮件?我考虑过关于其内容的散列,它在文本文件中存储和读取。如果哈希值与之前的脚本相同 运行,将跳过电子邮件。

另一个选项可以是全局用户 bash 配置文件中的本地临时变量,这样就没有文件要存储在文件系统上(避免读/写)。

我该怎么做?

当您为监控编写脚本时,添加函数以获得额外的功能,例如:

  • 记录所有已发送的警报
  • 确保您每小时发送的警报不超过 1 个
  • 考虑仅在工作时间发送警告
  • 当消息失败 N 次而没有中间成功时升级消息
  • 可能向不同的接收者发送警报(不同的电子邮件地址或也向短信或团队)
  • 为操作员创建一个界面,以便他可以在第一次出现问题时回顾。

如果您可以控制要发送的消息,就可以轻松过滤重复的消息(更改 --since 后)。

我选择了@ralf-dreager 的提议并将 selection 减少到 1d 和 1h。因此,我更改了我的监控脚本,以通过 1d 或 1h 的结果,而不需要每次都一次又一次地 select。巨大的性能提升,无需在变量或文件系统中存储任何其他内容。

FATS="$(docker logs --since 1h $NODENAME 2>&1 | grep 'FATAL' | grep -v 'INFO')"