2010-11-22 8 views
0

ログファイルを徐々に読み込んで処理する必要があります。 Javaでこれを行うための提案やアイデアはありますか?Javaでログファイルを段階的に読み取る

私はかなり接近するようにしようとしているあなたはChainsaw

+0

"ログファイルを段階的に読み込んで処理します。" - 詳細を追加してください。 – darioo

+0

ログを(ファイル内に)生成しているアプリケーションがあるとしましょう。次に、これらの最新のログを生成時に読み込み、要件に従って処理するコードをJavaで記述します。最初にログを読むことは問題ではありませんが、最後に読み取ったレコード/行をどのように追跡しますか?また、サイズやその他の設定されたパラメータのためにファイルがロールオーバーした場合はどうなりますか? –

+0

私がこの問題を抱えたとき、私はここで答えを見つけました:http://www.informit.com/guides/content.aspx?g=java&seqNum=226 – Dan

答えて

2

私はこの機能を達成するために使用したアプローチを書いていたのですが、かなり遅いですが。

5分ごとに定期的にファイルを読み込むジョブを開始したとします。最初の実行時に

  1. 、ファイル全体を読み込む
  2. ストア行数とファイル

の最終更新時刻以降のジョブが実行のためにそれは面白いとなります。

  1. ファイルが変更されているかどうかを確認します(ファイルの最終変更時刻と以前のジョブ実行時に保存された時刻を使用してください)。ファイルが変更されていない場合は、何もしないでください。
  2. ファイルが変更された場合は、新しい行を読み込むだけで済みます。以前のジョブの行数があるため、スキップする行数を決定するために使用します。

これまでのところ、ファイルがロールオーバーされるとどうなりますか?

  1. が通過
  2. 反復したパターンに一致するすべてのファイルを取得し、最後にファイルが変更された時間に基づいて昇順に並べ替える...私たちは、ファイルがロールオーバーされたときにファイル命名のためのパターンを持っていると仮定すると、前回のジョブ実行時に保存された時間よりも最後に変更された時間が経過したファイルから開始します。保存された行は、あなたが、その後、新しいファイルとそれをだ

を起動したときに、すでに

  • リセットライン数をラインを読み飛ばすためにスマートに数える使用してください!

    いくつかの奇妙なシナリオでは、IF条件をいくつかの場所に置く必要があります。そのようなシナリオの1つは、ファイルを繰り返し処理しているときで、ファイルの最終変更時刻が格納されている時刻とまったく同じ場合は、行数をリセットするだけで、次の/新しいファイルの最初の行から開始します。後続のジョブのための

    サンプルコードが実行されます(ファイルのファイル:ファイル)の

    {
    場合(file.lastModified()> storedLastModifiedTime){
    //あなたはの世話をする、処理するためのファイルを持っています他のラインカウント
    } IF(file.lastModified()== storedLastModifiedTime){
    //リセット保存された行数
    }
    }

    提案/コメント/質問がありますか?

  • 3

    など、ファイルのロールオーバー、異なるログ・フォーマット、などのすべての可能なシナリオを検討する必要があります多くの同じ問題。一見すると些細なことではないようです。あなたはEOF/EOSの概念を無視しなければならず、ログファイルのどこにいるのかを把握しなければなりません。

    私は最良のアプローチは、ログファイルを読み取るための別のスレッドを持つことだと思います。私はBufferedReaderで非常に有望なテストをしました。スレッドはファイルの末尾まですべてのデータを読み込み(はnull)、N秒間スリープ状態になります(私の場合は5回)。その後、目を覚ました後、再び行を読むように試みる。 Stringを返した場合は、処理を続けます。 nullになると、再びスリープ状態になります。成功したすべての読み取りでラインカウンタをインクリメントし、停止/開始時に読み取り/書き込みするので、ログファイル内の最後の位置を特定し、その点から処理を進めることができます。

    このアプローチの唯一の問題は、N秒間の待機です。 Javaを「EOF/EOSに関係なくreadLine()にブロックする」ように指示する方法は、はるかに正確です。 N秒待つと、データがすでに利用可能な状態で眠っているかもしれません。しかし、あなたはすべてのCPUの電力を食べたい場合を除き、睡眠が必要と思われる。

    +0

    +1:最初の段落はあまり関係がありません。この質問は、ログを読むことであり、書くことではありません。しかし、チェーンソーは完全に見える。 –

    +0

    チェーンソーはlog4j専用だと思いますが、他のロギングAPIはどうですか? –

    +0

    ごめんなさい(少なくともオープンソースのものではない) –

    0

    を見てとることができ

    おかげで、 Sudhanshu

    +0

    私は質問者がこれを行うための既存のコード/ libの後であり、最初から書くのではないと思った。 –

    +0

    を起動し、別の行の読み込みに失敗した場合は、ログが転記されたかどうかも確認する必要があります。 – hidralisk

    +0

    ログのロールオーバーを扱うことは難しい作業です。スレッドがアイドル状態になったときに生成されるログファイルの数はどのようにして決定されますか? –

    関連する問題