1

特定のしきい値を超えると、アプリケーションのメッセージをログに記録したいと考えています。10メッセージ後に言ってください。私はメモリハンドラについて読み、それを使用しました。ただし、ドキュメントに記載されているようにメッセージをバッファリングするのではなく、メッセージを即座にログに記録することがわかりました。ここにコードがあります

Handler h = new FileHandler('/var/tmp/process.log',Level.INFO);
Handler h2 = new MemoryHandler(h, 10, Level.ALL);
logger.addHandler(h2);

for(int i=0; i<10; i++) {
    logger.log(Level.INFO, "Sample message");
    Thread.sleep(1000);
}

このコードは、上記のメッセージを即座に追加しています。私は何が欠けていますか?私の目的は、ディスク I/O が発生しすぎないようにすることです。助けてください

4

2 に答える 2

2

の 3 番目のコンストラクター引数

Handler h2 = new MemoryHandler(h, 10, Level.ALL);

プッシュ レベルを定義します。つまり、指定されたレベル以上のメッセージがログに記録された場合、MemoryHandler はそれを構成済みのダウンストリーム ハンドラーにプッシュします ( jdk ドキュメント)。

MemoryHandler が達成したい目的に適しているとは思いません。バッファがいっぱいになるたびにフラッシュする、固定サイズのバッファを持つ MemoryHandler の独自の実装を作成できます。ただし、このアプローチの欠点を考慮してください。アプリケーションの終了時にログ メッセージが失われる可能性があり、フラッシュには I/O のブロックが含まれる可能性があり、どのスレッドがその I/O を実行する必要があるかを判断できません。

あるいは、logback や log4j2 など、実績のある別のロギング フレームワークの使用を検討することもできます。これらは通常、より高度な機能を提供します。非同期ロギングを探すことをお勧めします。

于 2013-10-11T19:59:10.987 に答える