如何将许多日志文件视为Perl中的一个虚拟文件?

Mic*_*Mao 5 perl filehandle

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

access.log.1284642120
access.log.1284687600
access.log.1284843260
Run Code Online (Sandbox Code Playgroud)

基本上,日志由Apache每天"旋转",因此可以按顺序对它们进行排序.

我试图"一个接一个地读取它们",以便它们可以被视为一个日志文件.

my @logs = glob('logs/access.log.*');
Run Code Online (Sandbox Code Playgroud)

上面的代码将全部记录所有日志,但我不确定:

  • 按字母顺序排列日志的顺序是什么?
  • 如果我想查看"来自唯一IP的最新访问时间",我该怎么做?

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

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

bri*_*foy 11

如果您想确保特定订单,请自行排序,即使只是为了确保自己能够正确排序:

 my @files = sort { ... } glob( ... );
Run Code Online (Sandbox Code Playgroud)

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

 my @files = sort glob( ... );
Run Code Online (Sandbox Code Playgroud)

要将它们作为一个超文件读取,我喜欢使用,local @ARGV所以我可以使用钻石操作符,这实际上只是魔术ARGV文件句柄.当它到达一个文件的末尾时@ARGV,它会移动到下一个文件.这个伪造通过分配到@ARGV程序内部来指定命令行上的所有文件:

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

 while( <> ) {
      ...;
      }
 }
Run Code Online (Sandbox Code Playgroud)

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

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