免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1782 | 回复: 4
打印 上一主题 下一主题

perl-学习 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-01 18:57 |只看该作者 |倒序浏览
现在有这么一个情景
日志文件
/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;
感觉此方法不一定行,或者很好,还请高手帮看看。谢谢。。。

论坛徽章:
0
2 [报告]
发表于 2010-12-02 08:16 |只看该作者
这不是Perl学习吧?是请人帮做"作业"吗?

论坛徽章:
0
3 [报告]
发表于 2010-12-02 09:39 |只看该作者
标题随便起的。谁能帮看看,谢谢了。

论坛徽章:
0
4 [报告]
发表于 2010-12-02 10:21 |只看该作者
记录初始文件的行数:  $n_old
得到一分钟后文件的行数:  $n_new

1分钟内新增的行: $n_add = $n_new - $n_old


然后想干嘛,就干嘛!


相关 shell 命令:

tail  
wc -l

论坛徽章:
0
5 [报告]
发表于 2010-12-02 11:37 |只看该作者
To:alabos
我的test.pl就是你说的记录行数差的,但是每次跑的时候行数差不一样。
现在我把最终的脚本放到后台执行(类似./a.pl &),不放在crontab里每一分钟执行了。
a.pl


#!/usr/bin/perl
my $f_in = "/var/log/quagga/ospfd.log";
open(FH,"<",$f_in) or die "$!\n";
while(1)
{
        my $strings = <FH>;
        #print $strings;
        if($strings =~ m/deleted|InterfaceUp/)
        {
                `/bin/ospfd_alert.py -m \"$strings\" -r misc -R -s \"ospf\"`;
        }
}
close FH;
那么这个脚本类似tail,会实时的监测日志文件的输出,找到日志当前行里有deleted或者是InterfaceUp的就来个报警。第一次运行此脚本会读取日志的所有内容,然后等有新的日志报出的时候,就会实时监控了。

不知道此方法是否妥当。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP