[解決済み] log4j2でslf4jを使用する価値はありますか?
質問
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 はこの点では同じです。例えば
関連
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
java 例外。Javaツールの初期化
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】SLF4J:クラス "org.slf4j.impl.StaticLoggerBinder" の読み込みに失敗しました。
-
[解決済み】なぜjava.util.loggingを使用しないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Exceptionが発生しました エラー解決
-
java の例外が発生しました java
-
IllegalArgumentException この例外を解決する方法
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
final, finally, finalizeの違いについて話してください。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。