我正在创建一个脚本,它将通过电子邮件发送日志中的错误/警告。我希望每半小时发送一次,但我只想在有新条目时发送。我如何只找出最后半小时的错误?
日志中的时间戳采用以下格式。
< 2016 年 8 月 1 日下午 2:15:29 MDT> < 错误详细信息......>
到目前为止的脚本是:
#!/bin/bash
cat /var/log/logfile.log | egrep -i "error|warning" | tee -a /tmp/log.tmp
"get only last 30 min of errors" | mail -s "Errors/Warning" [email protected]
是否可以将时间戳(2016 年 8 月 1 日 2:15:29 PM MDT)转换为纪元时间,然后将其与当前纪元时间进行比较,或者是否有办法使用 sed/awk/perl 获取最后 30 分钟?
答案1
要转换为纪元,您可以使用以下语句:
# date +%s -d"Aug 1, 2016 2:15:29 PM MDT"
1470082529
要将纪元转换为 UTC,您可以使用:
# date -d @1470082529
Tue Aug 2 00:45:29 IRDT 2016 #### on Linux Box
# date -r 1470082529
Tue Aug 2 00:45:29 IRDT 2016 ###on BSD box
答案2
我会使用 的perl
模块File::Tail
。我现在没有时间写一个例子,但是在 perlish 伪代码中,它看起来像这样:
#! /usr/bin/not-actually-perl
use strict;
use File::Tail;
use Net::SMTP or Mail::Mailer or one of the squillion other
perl mail sending modules;
open a File::Tail file handle to your log file
my $now=time();
my @lines = ();
while (read the File::Tail handle) {
push @lines, $_;
if (time() > ($now + 1800 seconds) ) {
$now=time();
email the @lines array to [email protected];
@lines=();
}
}
实际的工作脚本可能比上面的脚本长不到 10 行,其中大部分是设置电子邮件的标题。
还有几行来捕获各种信号,以便在挂起或退出之前通过电子邮件发送 @lines 中现在的内容。
File::Tail
有关确切的详细信息,请参阅和Net::SMTP
(或其他内容)的手册页。
答案3
好主意,最简单的是@MelBurslan 建议比较文件。
#!/bin/sh
[email protected]
OFILE=/var/tmp/alerts.tmp
LOG30=/var/tmp/LOG30
LOGNOW=/var/tmp/LOGNOW
HOST=`hostname`
# setup file
if [ -f ${OFILE} ]; then
cat /dev/null > ${OFILE}
else
touch ${OFILE}
fi
cat /var/log/logfile.log | egrep -i "error|warning" | tee -a ${LOGNOW}
diff ${LOG30} ${LOGNOW} | tee -a ${OFILE}
if [ -f ${OFILE} ]; then
echo "Errors" | cat - ${OFILE} > temp && mv temp ${OFILE}
mailx -r [email protected] -s "Errors" ${MAILTO} < ${OFILE}
fi
rm ${LOG30}
mv ${LOGNOW} /var/tmp/LOG30
rm ${OFILE}