- 论坛徽章:
- 0
|
现在有这么一个情景
日志文件
/var/log/quagga/ospfd.log,此文件会实时刷新。
比如文件内容如下:
2010/12/01 16:52:12 OSPF: nsm_change_state(125.46.63.72, Full -> Down): scheduling new router-LSA origination
2010/12/01 16:52:12 OSPF: NSM[gre8:10.0.0.146:125.46.63.72]: neighbor deleted
2010/12/01 16:52:12 OSPF: ISM[gre8:10.0.0.146]: Point-To-Point (InterfaceDown)
2010/12/01 16:52:12 OSPF: ospf_check_abr_status(): Start
我现在想来个perl脚本读此文件,然后,如果找到deleted那行,就把那行打印出来。
此perl脚本放到crontab里,执行周期为每1分钟,而我每次需要读取最新的这一分钟间隔时间内在日志文件里新增加的内容,并且打印出来。
做了如下的一些工作:
比如我运行一个测试脚本,来判断1分内,数据增加了多少行,然后最终的定时任务脚本用tail -n 行数 /var/log/quagga/ospfd.log > tail.data
然后再匹配和打印。但是,问题是每1分内的数据增加行数不同,而用tail -f只会每次读10行的内容。
测试行数相差脚本如下:
test.pl
#!/usr/bin/perl
my ($i,$j);
my $f_1 = "/var/log/quagga/ospfd.log";
open (FH,"<",$f_1) or die "Can't open $f_1 $!\n";
while(<FH>)
{
$i++;
}
close FH;
`sleep 60`;
open (FH,"<",$f_1) or die "Can't open $f_1 $!\n";
while(<FH>)
{
$j++;
}
close FH;
my $diff = $j - $i;
print "$i,$j,$diff\n";
最终定时任务脚本如下:
ospfd_life_check.pl
#!/usr/bin/perl
my $f_in = "tail.data";
`tail -n 1000 /var/log/quagga/ospfd.log > $f_in &`;
my $f_out="/var/log/quagga/ospfd_check.log";
open(FH_IN,"<",$f_in) or die "Can't open $f_in $!\n";
open (FH_OUT,">",$f_out)or die "Can't open $f_out $!\n";
while(<FH_IN>)
{
print FH_OUT if /deleted/;
}
close FH_OUT;
close FH_IN;
感觉此方法不一定行,或者很好,还请高手帮看看。谢谢。。。 |
|