ログデータが3行1セットで必ず出力される
お世話になります。
logsurferというログ監視ソフトを使ってログデータファイルから使用したい分だけデータを切り出したいです、最初は一つだけのPCのログを監視して、トラブルがありませんでした。
今から二つPCのログを監視しますので、元のソースがデータを判断してから切り出しところがトラブルが発生する事をありました。
トラブルは前のログデータを来てからソースの判断の時間はログの時間により遅くて間に合わないから、判断しずにのまま、次のログデータを上書かされました。
前のソース:
#!/usr/bin/perl
###################read testlog#################################
open(LOGFILE,'/var/log/testlog');
@logarray=(0,<LOGFILE>);
close(LOGFILE);
while (defined($logarray[$i])){
if((index($logarray[$i],"sshd") ne -1) and (index($logarray[$i],"Failed") ne -1)){
#print $i," ";
$tty=0;
$lastfail=$i;
}elsif((index($logarray[$i],"failure") ne -1) and (index($logarray[$i],"tty=tty") ne -1)){
$tty=1;
$lastfail=$i;
}
#print index($logarray[$i],sshd)," ";
#print index($logarray[$i],Failed),"\n";
$i++;
}
#print "1 ",$lastfail,"\n";
open OUT,">rensyu4.txt";
print OUT $logarray[$lastfail];
close OUT;
今の発想はログデータがそのまま別のファイルの書き込んで、そして、そのファイルから三行ずつ切り出して判断してから別のファイルに書き込みたいです。
今のソース:
#!/usr/bin/perl
###################read testlog#################################
open(LOGFILE,"/var/log/testlog");
open(OUT,">testlog.txt");
my $last_data;
while (<LOGFILE>){
print OUT $_ if ($last_data ne $_);
$last_data=$_;
}
close OUT;
close(LOGFILE);
open(TESTLOG,"testlog.txt");
@logarray=(0,<TESTLOG>);
close(TESTLOG);
while (defined($logarray[$i])){
if((index($logarray[$i],"sshd") ne -1) and (index($logarray[$i],"Failed") ne -1)){
#print $i," ";
$tty=0;
$lastfail=$i;
}elsif((index($logarray[$i],"failure") ne -1) and (index($logarray[$i],"tty=tty") ne -1)){
$tty=1;
$lastfail=$i;
}
#print index($logarray[$i],sshd)," ";
#print index($logarray[$i],Failed),"\n";
$i++;
}
#print "1 ",$lastfail,"\n";
open OUT,">rensyu4.txt";
print OUT $logarray[$lastfail];
close OUT;
ログデータ:
May 13 17:55:57 fc4-03 sshd[1403]: error: Could not get shadow information for plan
May 13 17:55:57 fc4-03 sshd[1403]: Failed password for plan from ::ffff:10.42.42.131 port 3040 ssh2
May 13 17:55:58 fc4-03 last message repeated 2 times
May 13 17:56:03 fc4-03 sshd[1406]: error: Could not get shadow information for ougun
May 13 17:56:03 fc4-03 sshd[1406]: Failed password for ougun from ::ffff:10.42.42.130 port 1398 ssh2
May 13 17:56:08 fc4-03 last message repeated 2 times
May 13 17:56:09 fc4-03 sshd[1412]: error: Could not get shadow information for plan
May 13 17:56:09 fc4-03 sshd[1412]: Failed password for plan from ::ffff:10.42.42.131 port 3041 ssh2
May 13 17:56:09 fc4-03 last message repeated 2 times
May 13 17:56:19 fc4-03 sshd[1415]: error: Could not get shadow information for ougun
May 13 17:56:19 fc4-03 sshd[1415]: Failed password for ougun from ::ffff:10.42.42.130 port 1399 ssh2
May 13 17:56:19 fc4-03 last message repeated 2 times
ログデータファイルから三行1セットで切り出したいです。
どなたか教えて頂けると助かります、宜しくお願いします。
お礼
ご回答ありがとうございます。 >grep "^Jun 2 08:1[5-9]" とすれば実行できます。 >雑プロ(一時的に統計を取りたいなどの理由でその場限りのプログラムを書くこと)ではこれでいいのではないでしょうか。 なるほどぉ。確かにこのように設定を行えば、5分以内という形で抽出可能になりますね。 >● シェル上での日付プログラミングを見たことがありますが、月や年・うるう年の処理を全部しなくてはいけない。 年間を通して実行すると確かにそうならざるを得ないんですね。 ● どういう要件で5分としているのかわかりませんが(cronで5分単位で実行するのでしょうか)、5分が10分に変更しようとした場合、さらにテストが必要。 >はい。cronにて実装する予定でした。 時間の変更を行えば、汎用性はございませんので、テストが必要となりますね。 ほかの質問にもありましたが、そういう場合はログ監視ツールを使用してください。 >はい。貴重なご意見ありがとうございました。