如何开始在Perl中编写Web日志分析器?

时间:2011-03-07 14:41:42

标签: perl apache logging analyzer

从以下格式输入条目的文件中获取信息: IPAddress x x [date:time -x]“method url httpversion”statuscode bytes“referer”“useragent”

您将如何将该文件作为命令行参数访问并存储该信息,以便您可以按IP地址的字母顺序排列,同时将所有信息保存在一起?我假设我需要以某种方式使用哈希和数组。

理论上你可以拥有任意数量的文本文件作为命令行参数,但到目前为止我没有得到那部分工作,我只是:

./logprocess.pl monster.log #monster.log is the file that contains entries

然后在代码中,假设所有未指定的变量都已声明为标量

my $x = 0;
my @hashstuff;
my $importPage = $ARGV[0];
my @pageFile = `$importPage`;
foreach my $line (@pageFile)
{

    $ipaddy, $date, $time, $method, $url, $httpvers, $statuscode, $bytes, $referer, $useragent =~ m#(\d+.\d+.\d+.\d+) \S+ \S+ [(\d+/\S+/\d+):(\d+:\d+:\d+) \S+] "(\S+) (\S+) (\S+)" (\d+) (\d+) "(\S+)" "(\S+ \S+ \S+ \S+ \S+)"#
    %info = ('ipaddy' => $ipaddy, 'date' => $date, 'time' => $time, 'method' => $method, 'url' => $url, 'httpvers' => $httpvers, 'statuscode' => $statuscode, 'bytes' => $bytes, 'referer' => $referer, 'useragent' => $useragent);
    $hashstuff[$x] = %info;
    $x++;
}

肯定有更好的方法,因为我的编译器说我有全局符号错误,如:

  

在./logprocess.pl第51行(#2)上模糊使用%resolve as operator%   (W模棱两可)(S)你说的话可能无法解释   你以为。通常情况下,通过提供消除歧义很容易   缺少引号,运算符,括号对或声明。

它不会执行。我不能使用任何模块。

1 个答案:

答案 0 :(得分:4)

如果日志是由Apache生成的,则可以使用Apache::ParseLog模块。请查看页面末尾的示例以获取灵感。

关于您提到的错误,您应该使用my声明您的数组:

my @hashstuff;

并添加引用。此外,还可以使用$hashstuff[$x]访问单个项目(请注意开头的美元):

$hashstuff[$x] = { %info };

或者你可以完全摆脱$x

push @hashstuff, { %info };