5

以下の命名規則に従って、logs ディレクトリに複数のアクセス ログがあります。

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

基本的に、ログは Apache によって 1 日ごとに「ローテーション」されるため、順番に並べ替えることができます。

それらを1つのログファイルとして扱うことができるように、「それらを次々に読み取る」ことを試みています。

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

上記のコードはすべてのログをグロブしますが、よくわかりません:

  • ログはどの順序でアルファベット順に編成されますか?
  • 「一意の IP からの最新のアクセス時刻」を確認したい場合、どうすればよいですか?

単一のアクセス ログを読み取り、これを簡単に確認できる Perl スクリプトがあります (私のアルゴリズムは、IP アドレスをキーとして、アクセス時間を値として使用する大きなハッシュを持ち、キーと値のペアをプッシュし続けることです) ...)。しかし、このプロセスのためだけに、すべてのアクセス ファイルを 1 つの一時ファイルにマージしたくありません。

助言がありますか?よろしくお願いします。

4

2 に答える 2

11

特定の順序を確保したい場合は、自分で並べ替えてください。

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

この場合、特定の数字を除いてファイル名がすべて同じである場合、ソート ブロックは必要ない可能性があります。

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

それらを 1 つの超ファイルとして読み取るには、a を使用するのが好きです。local @ARGVこれにより、ダイヤモンド演算子を使用できるようになります。これは、実際には単なる魔法のARGVファイルハンドルです。で 1 つのファイルの最後に@ARGV到達すると、次のファイルに移動します。@ARGVこれは、プログラム内でに割り当てることにより、コマンドラインですべてのファイルを指定するように偽装します。

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

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

現在処理しているファイルを知る必要がある場合は、 を参照して$ARGVください。

もっと派手なものが必要な場合は、総当たりに頼る必要があるかもしれません.

于 2010-09-18T10:58:00.397 に答える
2

Unix-y 環境では、シェルを利用してファイルをグループ化できます。

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 に答える