2012-03-27 1 views
0

ログメッセージをファイルシステムに非同期で書き込むJava Loggingフレームワークを作成しています。このため私はFileHandlerを使用して最終的にFileに書き込むMemoryHandlerを使用しています。私は、ログに記録されるとすぐにファイルにログメッセージを書きたくない代わりに、バッファが一定の時間に達すると、外部クラスプッシュを通じてメモリのすべての内容をフラッシュしたい。外部のクラスを記述してMemoryHandlerのpushメソッドを明示的に呼び出す良い例を教えてもらえますか?前もって感謝します。MemoryHandlerバッファからログメッセージをプッシュするための外部クラスを作成する

public void log(String msg) { 
    buffer.append(msg); 
    if (buffer.length() > threshold) { 
    new Thread() { 
     public void run() { 
     flush(); 
     } 
    }.start(); 
    } 

private void flush() { 
    // ... 
} 

これはフラッシュ非同期を維持し、回避されます。そうのようにログに記録するメッセージを追加する方法では

+0

MemoryHandlerは、それがしきい値に達するタイミングを(おそらく)伝えることができるので、なぜそれ自体をフラッシュできないのですか? – jpm

+0

フィードバックいただきありがとうございます。それは自分自身をフラッシュすることができますが、私は、外部クラス(スレッドかもしれません)からこれを呼び出すことによって、オンラインアプリケーションのIO待機を避けたかったのです。 – user1296594

答えて

0

(私たちはlog(String msg)それを呼ぶことにします)、あなたは、フラッシュするスレッドをキックオフすることができます1つのメソッドを呼び出すためのクラス全体を作成します。あなたがしたくないかもしれないフラッシュを公開する必要はありません。

EDIT:既に設定されているスレッドプールがある場合は、代わりに新しいRunnableを作成して実行に渡すことができます。しかし、そのコンセプトは同じです。

+0

フィードバックをいただきありがとうございます。これはうまくいきます。私が持っているその他の質問は、別のスレッドを使用してフラッシュが行われている間に、アプリケーションからの着信ログに何が起こるかということです。このスレッドが既存のバッファのフラッシュを完了するか、それがどのように機能するかをアプリケーションは待たなければなりませんか?これはほとんど混乱しません。ありがとう。 – user1296594

+0

この問題を解決する1つの方法は、保留中のメッセージを一時バッファにコピーして元のデータを消去することによって 'flush()'を開始することです。これらの操作を 'synchronized'ブロック内に置くと、その瞬間に入ってくる新しいログ操作は、メモリ操作が完了するのを待ってから新しいバッファに書き込むだけで済むでしょう。一方、フラッシュスレッドは、呼び出されたときのスナップショットから作業します。これにより、すべてのメッセージが正確に1回だけ書き込まれることが保証されます。 – jpm

+0

最後に、予期しない終了時に保留中のメッセージが確実にフラッシュされるようにする方法を見つけることがあります。残念ながら、私はこのツールにどのようなツールが使用できるのかよく知らないので、その点でどのようなオプションがあるのか​​調べてみましょう。 – jpm

関連する問題