1. ホーム
  2. java

[解決済み] log4j2でslf4jを使用する価値はありますか?

2022-04-26 02:22:24

質問

log4j2でslf4jを使うかどうか迷っています。オンラインポストに基づいて、それはどんなパフォーマンスヒットを持っていないように見えますが、それは本当に必要ですか?

また、これらの点はlog4j2に有利に働きます。

  • SLF4Jでは、アプリケーションは文字列を記録することを強制されます。Log4j 2 APIは、あなたがテキストを記録したい場合、任意のCharSequenceを記録することをサポートしますが、そのまま任意のObjectを記録することもサポートします。
  • Log4j 2 APIは、Messageオブジェクトのロギング、Java 8ラムダ式、ガベージフリーロギング(CharSequenceオブジェクトのロギング時にvararg配列の作成を避け、Stringの作成を避ける)のサポートを提供します。

どのように解決するのですか?

先に行く: slf4jの代りのlog4j2のAPIにプログラムしなさい

Log4j2 APIは、slf4jと全く同じ保証を提供します - そしてもっと。

Log4j2自体がAPIと実装モジュールに分離された今、もはやSLF4Jを使う価値はないのです。

そうですね、選択肢を広げておくことはエンジニアリングの良い習慣です。後で別のロギング実装に変更したくなるかもしれませんから。

ここ10年ほどは、このような柔軟なアプリケーションを作るには、SLF4JのようなラッパーAPIを使うのが一般的でした。このアプローチの欠点は、アプリケーションは基礎となるロギングライブラリの豊富な機能セットを使用できないことです。

Log4j2は、あなたのアプリケーションが最小公倍数に制限される必要のないソリューションを提供します。

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

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

質問で言及されたように、直接Log4j2 APIを使うことは、より多くの機能を提供し、slf4jのようなラッパーAPIを使うことに対して、いくつかの非機能的な利点を持ちます。

  • メッセージAPI
  • 遅延ログのためのラムダ
  • 文字列だけでなく、任意のオブジェクトを記録する
  • ガーベッジフリー:可能な限り、varargsの作成やStringの作成を避ける。
  • CloseableThreadContext は、使い終わったら MDC から自動的にアイテムを削除する

(参照 SLF4Jで利用できない10のLog4j2 API機能 をご覧ください)。

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

SLF4J はまだあなたの安全弁であり、あなたのアプリケーションが SLF4J API に対してコーディングする必要がないことを意味します。


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


更新:Log4j2 APIへのプログラミングが何らかの形で"facade for a facade"を導入しているといういくつかの混乱があるようです。Log4j2 APIとSLF4Jの間には、この点での違いはありません。

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

<テーブル 必要な依存関係 log4j-apiをAPIとして使用する SLF4JをAPIとして使用 Log4j 2の実装 2: log4j-apiおよびlog4j-core 4: slf4j, log4j-slf4j-impl, log4j-api, log4j-core(ログ4jコア 実装としてのログバック 4: log4j-api, log4j-to-slf4j, slf4j, ログバック 2: slf4jとLogback