【问题标题】:How to start writing a web log analyzer in Perl?如何开始在 Perl 中编写 Web 日志分析器?
【发布时间】:2011-07-10 09:52:29
【问题描述】:

从文件中获取信息,该文件以这种格式逐个输出条目: 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) 中将 % 的歧义使用解析为运算符 % (W ambiguous)(S) 你说的东西可能不会被这样理解 你以为。通常很容易通过提供来消除歧义 缺少引号、运算符、括号对或声明。

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

【问题讨论】:

  • 你知道第 3 行告诉 Perl 执行monster.log 命令并用它的输出行填充@pageFile 吗?只要有可能,只需使用while (<>) 来读取所有 argumnets 的所有行。你知道每个 Perl 脚本都必须以 use strict; use warnings; 开头吗?

标签: perl apache logging analyzer


【解决方案1】:

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

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

my @hashstuff;

并在那里添加参考。也可以使用$hashstuff[$x] 访问单个项目(注意开头的美元):

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

或者你可以完全摆脱$x

push @hashstuff, { %info };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多