2016-11-11 13 views
0

Spring Webアプリケーションで非同期ロガーを実装したいと考えています。ネットで検索した後、私はこれを実現するために次の3つの方法を利用することができました。Springとの非同期ロガーの統合

  1. commons.log4j
  2. log4j2春に
  3. @Async。 (私は他の方法があまりにもありますけど、私は、これら3のいずれかに固執したい)

今、私は1つは、より良いパフォーマンスで使用するのがベストだろうかを知りたいですか? commons.log4jを使用した非同期ログには多くの欠点がありますか?

誰でもドキュメントを思い付くことができれば素晴らしいと思います。

答えて

-1

非同期ロギングとはどういう意味ですか?ロギングがアプリケーションを大幅にブロックする方法はありません。非常に軽い操作です。私はあなたが示唆していることを実行することでパフォーマンスを上げることはできないだろうと考えています。また、ログの時系列順を破ることもあります。あなたが提案していることをする理由はありません。

+1

パフォーマンスが向上した非同期ロガーと呼ばれるものがあります。これは主に大規模な分散アプリケーションを使用している場合に使用されます。 –

+0

ログはバッファリングすることもできます。つまり、ログを書き込む別のスレッドに送信することはバッファに送信することと同じです。少なくともバッファは別のスレッドを持たないでしょう。あなたが私に信じていないかどうか聞いてみると、あなたが求めていることをすることに意味がない。 – Snickers3192

0

Log4j2には、LMAX Disruptorに基づく非同期ロガーがあります。これは本質的にロックフリーのキューで、他のロギングライブラリと比較して大きなパフォーマンス上の利点をもたらします。 recent benchmark results hereを参照してください。

Log4j2にはガーベッジフリーなので、ガベージコレクタに負荷をかけません。結果として、アプリケーションの一時的なオブジェクトが古いgenに高速に昇格されず、full gcの一時停止が少なくなります。しかし、それは持っているだけでいいです。

ロギングファサードの場合、Commons Loggingは一般にレガシーテクノロジとみなされ、回避する理由はいくつかあります。 SLF4Jは普及しているようですが、単にLog4j2 APIを使用するだけで何も問題はありません(Log4j 1.2とは異なり、実際には別のlog4j-apiモジュールがあります)。

Spring @Asyncは非同期ログ用ではありません。バックグラウンドスレッドで実行したい粗い粒度のタスクに適しています。各ロギングステートメントのSpringのTaskExecutorを経由すると、エグゼキュータキューが圧倒される可能性があります(私が知る限りロックフリーではありません)。また、コードを読みにくくなる可能性があります。

関連する問題