避免错误分析 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')"
我正在从 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')"