代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

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

  •  5
  • Michael Mao  · 技术社区  · 14 年前

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

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

    基本上,日志每天由Apache“轮换”,因此可以按顺序进行排序。

    我正在尝试“一个接一个地读取它们”,这样它们就可以作为一个日志文件来处理。

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

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

    • 日志按字母顺序排列?

    我有一个Perl脚本,它可以读取单个访问日志并轻松地进行检查(我的算法是使用一个大散列,它使用IP地址作为密钥,访问时间作为值,并不断地向它推密钥/值对……)。

    2 回复  |  直到 14 年前
        1
  •  11
  •   brian d foy    14 年前

    如果你想确保一个特定的顺序,你可以自己排序,即使只是为了确保它会正确:

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

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

    local @ARGV 所以我可以使用菱形运算符,这真的很神奇 ARGV @ARGV ,它将转到下一个。通过将 @阿格夫 程序内部:

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

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

    如果你需要更新奇的东西,你可能不得不诉诸暴力。

        2
  •  2
  •   mob    14 年前

    my @files = glob("$dir/access.log.*");
    open my $one_big_logfile, "-|", "cat @files" or die ...;
    while (<$one_big_logfile>) {
       ...
    }