记录最近 30 分钟的 grep 条目

记录最近 30 分钟的 grep 条目

我正在创建一个脚本,它将通过电子邮件发送日志中的错误/警告。我希望每半小时发送一次,但我只想在有新条目时发送。我如何只找出最后半小时的错误?

日志中的时间戳采用以下格式。

< 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}

相关内容