使用Perl和Linux :: Inotify2模块监视Mac地址的日志文件

时间:2014-07-28 15:09:36

标签: perl inotify

我目前在这里有我的脚本,我的目标是能够监控每秒更新的实时日志文件,并且一旦我的脚本找到这个f8:27:93:88:1c:95​​ mac地址它将该行写入脚本。

#!/usr/bin/perl
my $mac = "f8:27:93:88:1c:95";
open (OUT, ">output.txt");
sub Reader (){
    @a1 = `Tail System.log`;
}
sub Parser (){
    if( $_=~ m/f8:27:93:88:1c:95/ ){
        print OUT $_;
    }
}

我的目标是能够观看这个日志文件,它每秒都在更新,因此尾部不能正常工作。

以下是日志文件

的摘录

> [2014-07-18 14:11:22,849] <inform_stat-1> WARN event - [event] User[f8:27:93:0c:da:c5] roams from AP[dc:9f:db:1a:61:bd] to AP[dc:9f:db:1a:61:b9] on "channel 44(na)"

2 个答案:

答案 0 :(得分:0)

也许使用像File::Tail

这样的cpan模块
#!/usr/bin/perl

use strict;
use warnings;
use autodie;

use File::Tail;

my $infile = 'System.log';
my $outfile = 'output.txt';
my $mac = 'f8:27:93:88:1c:95';

open my $outfh, '>', $outfile;

my $tail = File::Tail->new($infile);
while (defined(my $line = $tail->read)) {
    print $outfh $line if $line =~ m/\Q$mac/;
}

答案 1 :(得分:0)

您已经提到日志每秒都会更改。所以inotify对你的情况没有多大帮助。因此,我建议将perl脚本作为守护程序运行,以便它可以不断分析您的日志文件并将结果输出到文本文件。为了避免加载,您应该使用seek和tell,这样整个文件就不需要加载到服务器中。以下代码适合您。

#!/usr/bin/perl
use POSIX qw(setsid);
use LWP::Simple;
$| = 1;
# daemonize the program
&daemonize;
while(1)
{
open (DATA,"</var/log/log");
open (OUT, ">output.txt");
my $position = 0;
$position = `cat /tmp/position` if -e "/tmp/position";
seek (DATA,$position,0);
while (<DATA>)
{
if( $_=~ m/f8:27:93:88:1c:95/ ){
        print OUT $_;
    }
}
$position = tell(DATA);
open (DATA1,">/tmp/position");
print DATA1 $position;
close(DATA);
close(DATA1);
close(OUT);
}
sub daemonize {
chdir '/' or die "Can’t chdir to /: $!";
open STDIN, '/dev/null' or die "Can’t read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can’t write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can’t write to /dev/null: $!";
defined(my $pid = fork) or die "Can’t fork: $!";
exit if $pid;
setsid or die "Can’t start a new session: $!";
umask 0;
}