我想监视日志文件中的错误,然后向管理员发送电子邮件。
日志文件包含如下数据
11 Aug 02:30 Service1 restarted
11 Aug 05:35 Service1 restarted
11 Aug 08:43 Service2 restarted
11 Aug 11:20 Service1 restarted
11 Aug 14:53 Service2 restarted
我想创建一个每 5 分钟运行一次的脚本,并检查最后一次出现的服务重新启动并发送电子邮件。
例如:如果脚本在 02:35 运行,它会看到Service1
重新启动,因此它将发送一封电子邮件,例如Service1 restarted at 02:30
.现在,当脚本在 5:45 运行时,它应该Service1
仅发送在 05:35 重新启动的电子邮件(不应包括 02:35 重新启动)
有没有办法达到这个要求呢?我对 Linux 和 Shell 脚本基本上是新手
答案1
首先创建一个五分钟的 crontab:
*/5 * * * * myscript.sh
它运行 myscript.sh (在$HOME
目录中)
#!/bin/bash
tail -1 /path/to/file.log > /some/dir/after
if cmp -s /some/dir/after /some/dire/before
then
cat /some/dir/after | mail -s "restart" [email protected]
cp /some/dir/after /some/dir/before
fi
具有正确的价值观(当然)。
请注意,这意味着五分钟内不会有两次重新启动。
答案2
我假设在 02:35,文件的最后一行将是 02:30 重新启动,因此您需要的只是一个 cron 条目,如下所示
*/5 * * * * tail -1 /path/to/file.log | mailx -s "Last restart" [email protected]
这种方法的缺点是管理员将在 02:35、02:40、02:45、... 收到相同的电子邮件。
答案3
尝试这个:
定时任务
*/5 * * * * /path/to/checklog.bash
脚本
#!/bin/bash
service=$(tail -1 /path/to/logfile | awk '{print $4}')
logdate=$(tail -1 /path/to/logfile | awk '{print $1,$2,$3}')
if test 'find "/path/to/logfile" -mmin -5'
then
echo "$service was restarted on $logdate" | mail -s "Restart notification" [email protected]
fi
答案4
处理此问题的更可靠方法是使用专为您所想到的具体场景而构建的工具(即监视日志并根据新检测到的模式发送电子邮件)。
解压缩并运行它后,您将看到许多可以模仿的现实生活示例。您要关注的一个示例是 MODEL13,它解决了每当在一个或多个不同日志中检测到某种模式时向特定电子邮件地址发送电子邮件通知的任务。
./logrobot localhost /var/tmp/logXray autonda /var/log 60m '.*error.*_P_.*fatal.*' '.' 1 1 errchk -ndshow [email protected]
在上面的命令中,以下是您必须根据需要更改的参数:
'.*错误。*_P_.*致命。*'- 此处,正在 /var/log 目录中的所有日志中搜索两种模式
/var/日志- 这是您要监视其日志的目录。如果您希望监视特定日志文件,请将其替换为日志文件的绝对路径。
- 1 - 如果在日志中找到 1 个条目,则发送警告警报
- 1 - 如果在日志中找到 1 个条目,则发送严重警报
- 如果警告和严重相同,则当在日志中发现受监视的模式时,检查将发出严重警报。
- errchk - 这是此特定日志检查的标签。给它一个合适的名称...与正在监视的日志类型匹配的名称...即 tomcatLogCheck
- 当然还有电子邮件=。将其更改为适当的电子邮件地址。
这是一个更好的选项,因为它包含必要的逻辑,确保仅扫描添加到受监视日志的新行。它的效率也高得多。而且它还应该是便携式的。
当然,请确保主机上安装了 postfix,以便可以发送电子邮件。我可能在这里忘记了一些东西,但这应该是该工具如何工作的要点。