web-dev-qa-db-ja.com

大規模なマージIISログ

Webalizerを使用してIISログを分析およびグラフ化することを計画していますが、サーバーファームがあるため、Webalizerではすべてのログが時系列になっていることを確認する必要があります(そうでない場合は結果のスキップを開始します)。

ログはgzipで保存されているため、すべてを解凍して別々のファイルにすることから始め、次にLogParser2.2を使用してそれらのファイルをマージしました。 LogParserコマンドは次のとおりです。

LogParser.exe -i:iisw3c "select * into combinedLogFile.log from *.log order by date, time" -o:w3c 

私はおそらく*を必要としませんが、Webalizerがそれらを必要とするので、私はほとんどのフィールドを必要とします。これは一部のログでは完全に正常に機能しますが、サーバーファームクラスターの1つが大量のログを生成します。14台のサーバーがあり、各サーバーのログは(少なくとも)1日あたり2.5 GBです(各ログは別の日にあります)。したがって、これらのログをマージしようとすると、LogParserがクラッシュして意味のない一般的なエラーが発生します。

これはメモリの問題だと思ったので、メモリを最小限に抑えるためにいくつかの方法を試しました。

私はPowerShellを使用してLogParserを呼び出しているので、標準のPowershellパイプを使用して入力をパイプすることを試み始めました。 (これにより、Powershellで(LogParserではなく)OutOfMemoryExceptionが発生し、ファイルを使用するよりも早く発生しました)。

最終的に私が最終的に得たのは、「Cat」へのバッチファイル呼び出しから呼び出される複数の名前付きパイプを使用して、それをLogParserに直接パイプすることです...そして、それらを事前に圧縮していたときに開始した場所に戻りました。

これらの同じログファイルを処理する他のスクリプトがあり、それらのいずれにも問題はありません(ただし、それらの出力は通常、これよりも小さくなります)。

したがって、これらすべてのファイルをマージするためのより良い方法や、私が思いついたものでは不十分であるために機能するLogParserスクリプトについて何かアイデアがあるかどうかを知りたいだけです。

P.S.個々のログはすべてすでに並べ替えられているので、おそらく.NETでマージプログラムを作成できることはわかっています。したがって、一度に数行以上を読み取る必要はありませんが、可能であればそれを行わないようにしています。 。

1

1日のデータを並べ替えようとして問題が発生していることを考えると、2つの戦略のいずれかに目を向けます。

  1. より良いソートを見つけてください。 Windowsの並べ替えツールを使用できるかどうかを確認してください。ログは、理由のために、最初に日付と時刻でASCIIテキストソートに適した形式でリギングされます。使用するメモリがはるかに少なく、並べ替えのために行を解析する必要がありません。私の賭けはこれがあなたのために働くということです。

  2. 14個のファイルすべてを開き、それぞれの先頭から最初の行を引き出して、14個のファイルを同時に処理するインターリーブを作成します。私はこれを考えると震えますが、ファイルごとに64KBのメモリしか必要ありません。

古い答え:

分割統治。ログを読み取り、日付が含まれる既知のファイル名(weblog-20110101.log)を使用して、日付ごとに新しいファイルに配置する1つのスクリプトを記述します。時間でソートする各ファイルでソートを実行します。必要なファイルを一緒に猫にします。

4
Mark