2011-02-01 12 views
1

Java.util.Loggerを使用して、私のプロジェクトのさまざまなイベントを記録しています。私はファイルハンドラを使ってログを作成しています。イベントがログに書き込まれる割合(ディスク内)は、ほとんどの場合、イベントが発生するペースであることがわかります。これは同時に良いと悪いようです。イベントの更新が素早く書かれているので良いですが、IO時間が心配です。ログに書き込む必要のあるデータがたくさんあることがあります。そのような場合、私のプログラムはこのロギングのために遅くなりますが、これは望ましくありません。Java Loggerの最適化ディスク書き込み

誰かが私がこの場合に何をすべきかを示唆することができれば、大きな助けになるでしょう。イベントが記録される割合は気にしません。実行終了時にログファイルに記録するだけです。

ありがとうございました。

+0

ログイベントのメモリにバッファリングがある場合、アプリケーションがクラッシュします。通常、それはあなたが何を言ったかを知りたがっているものです。 –

答えて

0

私は広く使用されているlog4jのような別のロギングソリューションを試してみることをお勧めします(多くの場合、コモンズログと組み合わせて)。これは、ロギングに対する実践的なアプローチを提供します。

さらに多くの制御が必要な場合は、独自のアペンダーを実装できます。あなたがファイルアペンダーを望むと仮定すると、FileAppenderappendルーチンを上書きすることができます。

フルデバッグログを実行するときに、5〜10%の性能低下が予想され、例えば、

public class BatchingFileAppender extends FileAppender { 
    private List<LoggingEvent> batch = new LinkedList<LoggingEvent>; 
    public static final int BATCH_SIZE = 10; 


    @Override 
    protected void append(LoggingEvent event) { 
     batch.add(event); 

     // you can even optionally push ever 10'th or so messages to file 
     if (batch.size() == BATCH_SIZE) { 
      appendBatch(); 
     } 
    } 

    @Override 
    protected void reset() { 
     appendBatch(); 
    } 

    @Override 
    protected void closeWriter() { 
     appendBatch(); 
    } 

    private void appendBatch() { 
     for(LoggingEvent event : batch) { 
      super.append(event); 
     } 
     batch.clear(); 
    } 

} 
+0

組み込みの 'AsyncAppender'を使うのではなく、自分のバッファをローリングするのは何のメリットですか? –

+0

このアプローチでは、すべてのロギングイベントをアプリケーションシャットダウン時に実行できます(上記のコードを少し修正しています)。 –

2

。これは私たちの顧客にとって受け入れられるようです。

ログアウトするために、コンテンツの一部を生成するためのコードが高価である場合は、デバッグをオフにすると、このコードを実行しないようにするために、このような簡単なテストを使用することを検討しては:

if (log.isLoggable(Level.FINEST)) { 
    // code to generate the log entry 
} 

あなたはまたjava.util.logging.MemoryHandlerを作成することができます定期的な間隔でファイルにプッシュアウトします。

+0

ありがとうございました。私のアプリケーションでは、MemoryHandlerがうまくいくはずです。あなたの助けに感謝。 – Vandana

0

log4jまたはslf4jなどの非同期/バッファリングされたアペンダをサポートする、より最新のロギングライブラリを使用します。 log4jので

、あなたはそれにAsyncAppender(バッファリング機能を提供する)と、ワイヤアップFileAppenderを使用することができます。

AsyncAppenderがそれに送信されたイベントを収集し、その全てのアペンダにそれらを派遣しますそれに添付されています。 AsyncAppenderに複数のアペンダーをアタッチすることができます。

AsyncAppenderは、別のスレッドを使用して、そのバッファ内のイベントを処理します。

このように、イベントは制御された方法でディスクに書き込まれ、実際の作業を行っているスレッドはディスクI/Oに縛られません。

また、このプログラムを実行しているときに実際にログを完全に出力する必要があるかどうかを検討するのが簡単です。 DEBUGレベルでのロギングを使用して、本番環境でアプリケーションを実行することはしばしば難しいことです。

+0

Mattさん、ありがとうございます。これは完璧です。 – Vandana

1

Jochen Bedersdorferの回答は良いものです。just4logは、後処理を経て自動的に行うシステムです。したがって、ログステートメントの周りのifステートメントでコードを醜いものにする必要はありません。

0

Logbackをご覧ください。私が間違っていないなら、log4jと同じ著者。

log4jの上の私たちの前の仕事に基づいて、logbackの内部は 速く、特定の重要な 実行パスの約10倍を実行するために再書かれています。ログバックコンポーネントの高速化だけでなく、 という小さなメモリフットプリントも備えています。

1

Pexusは最近、java.util.logging。* APIに基づくアプリケーションロガーを含むPerfLogというオープンソースパフォーマンスロギングパッケージをリリースしました。これには、すべてのJ2EEコンテナ(1.4+)で使用可能なCommon J Work Managerを使用した非同期ロギングのオプションが含まれています

+2

ようこそスタックオーバーフロー!あなたの答えを投稿してくれてありがとう! [自己プロモーションに関するよくある質問](http://stackoverflow.com/faq#promotion)をよく読んでください。また、自分のサイト/製品にリンクするたびに免責条項を掲示することが必須*であることにも注意してください。 –

関連する問題