2011-07-05 38 views
1

実行中のアプリケーションはログを書き出しています。次に、ログに記録されているかどうかについてステータスメッセージをチェックすることで、インデックス作成が完了したかどうかを確認する必要があります(ロギングが動的に進行し、プロセスが実行されていることに注意してください)。私のアプリケーションでは、インデックス作成のプロセスが完了した時点に関する信号は送信されず、単にログに記録され、他の処理が行われます。ステータスをログに記録しているかどうかを確認するためにログを継続的にポーリングする必要がありますが、それはアンチパターンまたは悪い設計のようなものです。私も忙しい待っているか何もループをしていないし、チェック、別の悪いデザインを持っていない。どのくらいの頻度でログに入力したエントリを最良の方法でチェックすることができますか?一般的なログパーサーアルゴリズム

答えて

1

ポーリングは通常の解決策です。他の解決策では、何らかの形で生成プロセスの協力が必要です。これは が可能な場合は明らかに望ましい解決策ですが、生成する プロセスがリスナーに気付かれないようにするには( という意味で)、ポーリングは唯一有効な ソリューションです。 (ログ機能に応じて、 がログを名前付きパイプに配置して読み取ることができるかもしれません)。

ポーリングは、実行していない場合に必ずしも高価ではありません。 それはあまりにもしばしば。そのログの解析を想定し

1

両方のプログラム(ログの読み取りと書き込み)を制御する場合、最も簡単な解決策は、何らかのプロセス間通信(信号など)を使用して完了したときにライターにすべてのリスナーを通知させることです。

IPCが不可能な場合のみ、変更をポーリングするよりスマートな方法を検討する必要があります。ほとんどのオペレーティングシステムでは、ファイルやディレクトリが変更されたときにコールバックを登録できます。いくつかの提案についてはthis questionを見てください。

0

はあなたが持っている唯一の選択肢である、あなたが探しているイディオムがあり、次のハイレベル表現(UNIX CLIスタイル)

# tail -f logfile.txt | grep STATUS_PATTERN 

(1)「は、tail -f」プリントを持っていますlogfile.txtに追加された新しい行を取り出し、実際のパターンマッチングを実行する(2) "grep"に渡します。

(1)と(2)の両方の機能は、独立したスレッド/プロセスとしてJava/C++で実装され、定期的なポーリングより軽量なロードを提供するのは簡単です。 また、ログのローテーション条件を検出するために、少しだけ特別な機能が必要になります。