5

我在日志目录中有多个访问日志,遵循以下命名约定:

access.log.1284642120
access.log.1284687600
access.log.1284843260

基本上,Apache 每天都会“轮换”这些日志,因此它们可以按顺序排序。

我正在尝试“一个接一个地阅读它们”,以便将它们视为一个日志文件。

my @logs = glob('logs/access.log.*');

上面的代码将覆盖所有日志,但我不确定:

  • 日志将按字母顺序组织?
  • 如果我想检查“来自唯一 IP 的最新访问时间”,我该怎么做?

我有一个 Perl 脚本,它可以读取单个访问日志并轻松检查(我的算法是有一个大哈希,它使用 IP 地址作为键和访问时间作为值,并不断将键/值对推送给它...)。但我不想仅仅为了这个过程将所有访问文件合并到一个临时文件中。

有什么建议么?提前谢谢了。

4

2 回答 2

11

如果您想确保特定顺序,请自行排序,即使只是为了向自己保证它会正确:

 my @files = sort { ... } glob( ... );

在这种情况下,除了特定数字之外,文件名都相同,您可能不需要排序块:

 my @files = sort glob( ... );

要将它们作为一个 über 文件读取,我喜欢使用 alocal @ARGV这样我就可以使用菱形运算符,这实际上只是神奇的ARGV文件句柄。当它到达一个文件的末尾时@ARGV,它会移动到下一个文件。这通过在程序内部分配来伪造指定命令行上的所有文件@ARGV

 {
 local @ARGV = sort { ... } glob( ... );

 while( <> ) {
      ...;
      }
 }

如果您需要知道当前正在处理的文件,请查看$ARGV.

如果你需要更花哨的东西,你可能不得不求助于蛮力。

于 2010-09-18T10:58:00.397 回答
2

在 Unix-y 环境中,您可以利用 shell 将文件组合在一起:

my @files = glob("$dir/access.log.*");
open my $one_big_logfile, "-|", "cat @files" or die ...;
while (<$one_big_logfile>) {
   ...
}
于 2010-09-18T18:18:03.060 回答