log4j2でslf4jを使用する価値はありますか


114

log4j2でslf4jを使用するかどうかを決定できません。オンライン投稿に基づくと、パフォーマンスに影響があるようには見えませんが、本当に必要ですか?

また、これらの点は、log4j2を支持するものです。

  • SLF4Jはアプリケーションに文字列のログを強制します。Log4j 2 APIは、テキストをログに記録する場合、CharSequenceのロギングをサポートしますが、オブジェクトをそのままロギングすることもサポートします。
  • Log4j 2 APIは、メッセージオブジェクトのロギング、Java 8ラムダ式、ガベージフリーロギングのサポートを提供します(可変引数配列の作成を回避し、CharSequenceオブジェクトのロギング時に文字列の作成を回避します)。

2
多分。アプリケーションサーバーにslf4jlogback(またはlog4jv1)が含まれている場合はどうなりますか?次に、アプリケーションを使用するために3番目のロガーをインストールするように強制する必要がありますか?あるいは、企業のセキュリティがjava.util.logging、本番環境でのみ使用することを決定したとしたら、どうなるでしょうか。
エリオットフリッシュ2017年

書いてくれてありがとう。しかし、すべての人が組織全体でlog4jを使用している場合、上記の引数は有効になりません。
Andy897 2017年

4
SLF4Jを使用すると、会社のポリシーが変更された場合(たとえば、会社が買収され、新しいポリシーが強制された場合)に、実装の置き換えが非常に簡単になります。ここでSLF4Jを使用すると、コードを作成するときに、Log4jを直接使用するよりも時間がかかりません。後で直接Log4j呼び出しを置き換えると、かなりの時間がかかります。SLF4Jは将来のための無料の投資/保険です。それはLog4j 2 API機能よりも重要ですか?あなた(または会社のポリシー)だけがそれを決定できます。
Andreas

あなたが望めばlog4j2でslf4jを使う方法さえありますか?このページでは、log4j-バージョン1.2-のサポートが終了したため、log4j2のオプションはありません。方法がある場合、なぜslf4jはそれについて言及しないのですか?
Jウッドチャック

回答:


162

先に進む:slf4jの代わりにlog4j2 APIにプログラムする

安全です。Log4j2APIは、slf4jとまったく同じ保証を提供します。

Log4j2自体がAPIと実装モジュールに分離されたので、SLF4Jを使用しても何の価値もありません。

はい、オプションを開いたままにしておくことは、優れたエンジニアリング手法です。後で別のロギング実装に変更したい場合があります。

過去10年ほどの間、アプリケーションでこのような柔軟性を構築するには、SLF4JのようなラッパーAPIを使用する必要がありました。ただし、この柔軟性は無料ではありません。このアプローチの欠点は、アプリケーションが基礎となるロギングライブラリの豊富な機能セットを使用できないことです。

Log4j2は、アプリケーションが最小公分母に制限されることを必要としないソリューションを提供します。

エスケープバルブ:log4j-to-slf4j

Log4j2にはlog4j-to-slf4jブリッジモジュールが含まれています。Log4j2 APIに対してコーディングされたアプリケーションは、いつでもバッキング実装を任意のslf4j準拠の実装に切り替えることを選択できます。

log4j-to-slf4j

質問で述べたように、Log4j2 APIを直接使用すると、より多くの機能が提供され、slf4jのようなラッパーAPIを使用する場合と比べて、機能上いくつかの利点があります。

  • メッセージAPI
  • 遅延ロギングのラムダ
  • 文字列だけでなく任意のオブジェクトをログに記録する
  • ガベージフリー:可能な場合は可変引数の作成や文字列の作成を避けます
  • CloseableThreadContextは、項目を使い終えると、MDCから自動的に項目を削除します

(詳しくは、SLF4J使用できない10 Log4j2 API機能を参照してください。)

アプリケーションは、ネイティブのLog4j2コア実装にロックされることなく、Log4j2 APIのこれらの豊富な機能を安全に使用できます。

SLF4Jは依然として安全弁ですが、アプリケーションがSLF4J APIに対してコーディングする必要があるという意味ではありません。


開示:私はLog4j2に貢献しています。


更新:Log4j2 APIへのプログラミングが何らかの形で「ファサードのファサード」を導入するという混乱があるようです。Log4j2 APIとSLF4Jの間でこの点に違いはありません。

どちらのAPIも、ネイティブ実装を使用する場合は2つの依存関係、非ネイティブ実装を使用する場合は4つの依存関係が必要です。この点で、SLF4JとLog4j2 APIは同じです。例えば:

必要な依存関係はSLF4JとLog4j 2 APIで同様です


7
わかります。質問を言い換えましょう。log4j2以外にlog4j2 APIの独立した実装はありますか?
Ceki

5
Log4j2 APIとimplは「密結合」されていません。これらのSLF4J実装はすべて使用可能です。Log4j2APIに対してコード化されたアプリケーションlog4j-to-slf4jlog4j-core、前述のSLF4J実装の代わりに依存関係を選択して選択できます。Log4j2 API のネイティブ実装の数は関係ありません。
Remko Popma 2017年

19
問題は、slf4jを使用するライブラリに依存していることが多いため、そのまま使用する方が簡単です。
Davio

18
それで、私は実装のためのインターフェースにインターフェースを使うべきですか?いや、結構です... Slf4jは、ロギングの実装への優れたインターフェースを提供することにより、log4jを強力に打ち抜きました... log4j2は、slf4j apiを実装するだけです。機能、log4j2 apiインターフェースの場合があるかもしれません...
RockMeetHardplace

4
@RemkoPopma-あなたはまだlog4jインターフェースの使用に反対しています。はい、わかりました。log4j2のインターフェース-> slf4jのインターフェース->あらゆる実装を連鎖させることができますが、抽象化を抽象化したくありません。
RockMeetHardplace 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.