Spring pom.xmlファイルの例で私が見たことから、それらはslf4jとlog4jのいくつかのエントリを追加し、何らかの方法でSpringアプリケーションでlog4jを使用すると、slf4jライブラリーによってラップされます。
誰かがこれがどのように魔法のように起こるか説明してくれませんか?
Spring
は引き続きすべての内部ロギングにcommons-logging
を使用します(下位互換性)。他のロギングフレームワーク(log4j
)を使用する場合は、commons logging
からフレームワークへの呼び出しをbridgeする必要があります。選択の。それ以外の場合は、複数のロギング構成を維持する必要があります。
slf4j
は、さまざまなロギングフレームワーク(jul
、log4j
、jcl
、logback
)のシンプルなファサードとして機能し、目的のプラグインを使用できますデプロイメント時のロギングフレームワーク。
サードパーティのフレームワークによって課されるロギングフレームワークの実装を使用する代わりに、実際のように機能し、実際にはロギングの呼び出しをslf4j's
またはその具体的なバインディングに転送するだけのslf4j
ブリッジ実装を提供します。
Maven pom.xmlのLoggingセクションは通常、次のようになります。
<!-- remove the real commons-logging from classpath -->
<!-- declare as provided or exclude from spring jars -->
<dependency>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<!-- add slf4j interfaces to classpath -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>
<scope>compile</scope>
</dependency>
<!-- add commons logging to slf4j bridge to classpath -->
<!-- acts as jcl but routes commons-logging calls to slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.6.4</version>
<scope>runtime</scope>
</dependency>
<!-- add log4j binding to classpath -->
<!-- routes slf4j calls to log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
<scope>runtime</scope>
</dependency>
<!-- add log4j to classpath -->
<!-- does the logging -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
これはSpringコンテナや依存性注入とは何の関係もありません、それは純粋なクラスパス、クラスローダーのものです...
slf4j
はロギングAPIであり、何も実行せず、一連のインターフェースのみを提供します。 log4j
は、具体的なクラスを持つロギングシステムです。 slf4j-log4j
slf4j APIのバックエンドとしてlog4jを使用するライブラリ。
一部のプロジェクトは明示的にlog4jに依存しており、具体的なクラスを呼び出します。そのため、slf4j APIのみを使用して賢く作成したプロジェクトに別のバックエンド(logback、j.u.l、Apache commonsなど)を使用することはできません。
すべての呼び出しをsl4jにリダイレクトするだけのモック実装(ブリッジ)でlog4jクラスを置き換える トリック があります。 Mavenでは、非常に高いバージョン番号の依存関係を宣言するだけで、このモックは最新のlog4jライブラリと見なされます。