ログファイルを徐々に読み込んで処理する必要があります。 Javaでこれを行うための提案やアイデアはありますか?Javaでログファイルを段階的に読み取る
私はかなり接近するようにしようとしているあなたはChainsaw
ログファイルを徐々に読み込んで処理する必要があります。 Javaでこれを行うための提案やアイデアはありますか?Javaでログファイルを段階的に読み取る
私はかなり接近するようにしようとしているあなたはChainsaw
私はこの機能を達成するために使用したアプローチを書いていたのですが、かなり遅いですが。
5分ごとに定期的にファイルを読み込むジョブを開始したとします。最初の実行時に
の最終更新時刻以降のジョブが実行のためにそれは面白いとなります。
これまでのところ、ファイルがロールオーバーされるとどうなりますか?
を起動したときに、すでに
いくつかの奇妙なシナリオでは、IF条件をいくつかの場所に置く必要があります。そのようなシナリオの1つは、ファイルを繰り返し処理しているときで、ファイルの最終変更時刻が格納されている時刻とまったく同じ場合は、行数をリセットするだけで、次の/新しいファイルの最初の行から開始します。後続のジョブのための
サンプルコードが実行されます(ファイルのファイル:ファイル)の
{
場合(file.lastModified()> storedLastModifiedTime){
//あなたはの世話をする、処理するためのファイルを持っています他のラインカウント
} IF(file.lastModified()== storedLastModifiedTime){
//リセット保存された行数
}
}
提案/コメント/質問がありますか?
など、ファイルのロールオーバー、異なるログ・フォーマット、などのすべての可能なシナリオを検討する必要があります多くの同じ問題。一見すると些細なことではないようです。あなたはEOF/EOSの概念を無視しなければならず、ログファイルのどこにいるのかを把握しなければなりません。
私は最良のアプローチは、ログファイルを読み取るための別のスレッドを持つことだと思います。私はBufferedReader
で非常に有望なテストをしました。スレッドはファイルの末尾まですべてのデータを読み込み(はnull
)、N秒間スリープ状態になります(私の場合は5回)。その後、目を覚ました後、再び行を読むように試みる。 String
を返した場合は、処理を続けます。 null
になると、再びスリープ状態になります。成功したすべての読み取りでラインカウンタをインクリメントし、停止/開始時に読み取り/書き込みするので、ログファイル内の最後の位置を特定し、その点から処理を進めることができます。
このアプローチの唯一の問題は、N秒間の待機です。 Javaを「EOF/EOSに関係なくreadLine()
にブロックする」ように指示する方法は、はるかに正確です。 N秒待つと、データがすでに利用可能な状態で眠っているかもしれません。しかし、あなたはすべてのCPUの電力を食べたい場合を除き、睡眠が必要と思われる。
+1:最初の段落はあまり関係がありません。この質問は、ログを読むことであり、書くことではありません。しかし、チェーンソーは完全に見える。 –
チェーンソーはlog4j専用だと思いますが、他のロギングAPIはどうですか? –
ごめんなさい(少なくともオープンソースのものではない) –
を見てとることができ
おかげで、 Sudhanshu
私は質問者がこれを行うための既存のコード/ libの後であり、最初から書くのではないと思った。 –
を起動し、別の行の読み込みに失敗した場合は、ログが転記されたかどうかも確認する必要があります。 – hidralisk
ログのロールオーバーを扱うことは難しい作業です。スレッドがアイドル状態になったときに生成されるログファイルの数はどのようにして決定されますか? –
"ログファイルを段階的に読み込んで処理します。" - 詳細を追加してください。 – darioo
ログを(ファイル内に)生成しているアプリケーションがあるとしましょう。次に、これらの最新のログを生成時に読み込み、要件に従って処理するコードをJavaで記述します。最初にログを読むことは問題ではありませんが、最後に読み取ったレコード/行をどのように追跡しますか?また、サイズやその他の設定されたパラメータのためにファイルがロールオーバーした場合はどうなりますか? –
私がこの問題を抱えたとき、私はここで答えを見つけました:http://www.informit.com/guides/content.aspx?g=java&seqNum=226 – Dan