Awk

過去 30 分鐘的日誌文件 grep 條目

  • August 9, 2016

我正在創建一個腳本,該腳本將通過電子郵件發送日誌中的錯誤/警告。我想每半小時發送一次,但我只想在有新條目時發送。我如何才能找出最後半小時的錯誤?

日誌中的時間戳採用以下格式。

< 2016 年 8 月 1 日 2:15:29 PM 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" user@email.com

是否可以將時間戳(2016 年 8 月 1 日下午 2:15:29 MDT)轉換為紀元時間,然後將其與目前紀元時間進行比較,或者有沒有辦法使用 sed/awk/perl 獲得最後 30 分鐘?

對於轉換到紀元,您可以使用以下語句:

# 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

我會使用perl’sFile::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() &gt; ($now + 1800 seconds) ) {
   $now=time();
   email the @lines array to you@your.address;
   @lines=();
 }
}

一個實際的工作腳本可能比上面的腳本長不到 10 行,其中大部分是設置電子郵件的標題。

還有幾行來擷取各種信號,以便在暫停或退出之前通過電子郵件發送它現在在@lines 中的內容。

有關詳細資訊,請參閱File::TailNet::SMTP(或其他)的手冊頁。

引用自:https://unix.stackexchange.com/questions/301380