区分 bash 脚本中的日志条目时间戳

区分 bash 脚本中的日志条目时间戳

我的 Bash 脚本作为 cron 作业执行。它在日志文件中查找字符串,如果找到,则应通过邮件转发相应的日志条目。

我的脚本可以工作,但我已经报告的日志条目包含相同的字符串,但时间戳较早。我想修改它,以便它只发送感兴趣的日志条目的最新时间戳。

#!/bin/bash
grep "Too many files" /share/logs/access.log > /dev/null && grep "Too many files" /share/logs/access.log | mailx -s "Batch Error " to [email protected]

相应的 cron 作业每 10 分钟运行一次:

*/10 * * * *  /myscripts/joberror.sh

我寻找的日志条目access.log如下所示:

uzeadnos12 2020-10-14 13:29:00,443 ERROR  - Error occured while converting document using Libreoffice - /shard.tiff java.io.IOException: Cannot run program "": error=24, Too many open files

有人可以帮我改进该脚本吗?

答案1

创建一个容器(例如,一个文件~/spool/last_jobrec),您可以在其中记录 cron 作业记录的最后一个时间戳。将其与最后附加日志条目的时间戳进行比较。当两者不同时会发出通知,当两者相同时则不执行任何操作。

$ mkdir -p /path/to/spool    # choose a place for spool directory.
$ 
$ cat /myscripts/joberror.sh
#!/bin/bash
touch /path/to/spool/last_jobrec   # ensure appropriate permissions
latest_logentry=$(grep --no-messages --no-filename --max-count=1 -e "Too many open files" <(tac /share/logs/access.log))
latest_logstamp=$(cut -d' ' -f1,2 <(echo $latest_logentry))
if [ "$latest_logstamp" != "$(cat /path/to/spool/last_jobrec)" ]; then
    echo "$latest_logentry" | mailx -s "Batch Error " to [email protected]
    echo "$latest_logstamp" >| /path/to/spool/last_jobrec
fi

未经测试。特别是我不使用该mailx实用程序。

评论:
1)我假设新的日志条目附加在日志文件的末尾。
2)为了填充上面的变量,last_entrystamp我使用了基于grep.这是因为我保守地假设您的日志文件可能包含不包含字符串“太多打开文件”的行形式的其他条目。如果没有,只需将grep脚本中的行替换为 withlatest_logentry=$(tail -1 /share/logs/access.log)

相关内容