0

すべてのアクションでログに書き込む永続的なイベント駆動型 HTTP アップロード プログラム (ホット フォルダー) があります。ユーザーが閉じることを決定するまで、無期限に実行されます。

アプリケーションが閉じられたときにログが確実に閉じられるように、ログへの書き込みごとに、ログ ファイルを開いて書き込み、ログを閉じるようにプログラムを作成しました。

そのようです:

fh = new FileHandler(logName, true);
fh.setFormatter(new MyCustomFormatter());
logger.addHandler(fh);
logger.info(message);
logger.removeHandler(fh);
fh.close();

最近、アップロード ジョブの実行中にログを開き (ログへの数百回の書き込みが発生する可能性があります)、ジョブが完了したら閉じることで、開閉の回数を減らすことを検討しました。

簡単に言えば、これによりどの程度のパフォーマンスが向上すると期待できますか? 閉じられていないログ ファイルなしでアプリケーションを確実に閉じるための他のオプションはありますか?

4

1 に答える 1

1

FileHandler を閉じると、syncのコストが発生する可能性があります。

JVM のシャットダウン時に FileHandler をロガーにアタッチしたままにしておくと、LogManager はログ ファイルを閉じます。ロガーからハンドラーを削除する場合は、それを閉じる必要があります。ロガーがシャットダウン前にガベージ コレクションされる場合、FileHandler は閉じられません。このタイプの「ファイルのごみ」は、コードを変更することで修正できます。

JVM がクラッシュするか、log/lck ファイルのクローズに関連する I/O 例外が発生した場合、lck ファイルが残っており、フォーマッタ テール文字列が含まれていない可能性があるログ ファイルが表示されます。そのようなケースはまれですが、防ぐ方法はありません。これらのケースを取り除くには、検出して正しい戦略を適用する必要があります。

于 2014-08-13T18:49:59.543 に答える