Java(Springなどなど)が生成するさまざまなフレームワークの各フレームワークは、異なるログシステムを使用します。 1つのJVMで複数の異なるログを混合することには、特定の問題があります。ここでは、Javaシステムの一般的なログフレームワークを整理し、SFL4Jを中心とした各ログフレームワークとの関係を紹介し、生産環境でさまざまなログフレームワークを管理する方法を紹介します。
1。インターフェイスの紹介
Javaシステムには、主に2つのログシステムインターフェイスがあります:SLF4Jと共通ログ。ログバック、log4jなど、実装する多くのフレームワークがあります。
もちろん、両方ともインターフェイスですが、2つはブリッジパケットを介して相互ログプロキシ出力を実現することもできます。
マウントされたコモンロギングのログ実装は、多くの場合LOG4Jです。初期化中、誰がマウントするかの特別な仕様がない場合、上記の順序で自動的にインスタンス化されます。 log4jloggerは、log4jのロガーをカプセル化し、ログを印刷するときにlog4jを呼び出します。
2。bridge bridge and slf4jに橋渡しされています
インターフェイス定義として、SLF4Jは下部に多くの実装フレームワークを持つことができ、SFL4Jの他のログ実装またはフレームワークもサポートできます。その実装は、さまざまなブリッジパッケージに基づいています。
2.1 SLF4Jブリッジ
インターフェイス定義として、以下に多くの実装があります。実装の原則は、iLoggerFactoryを取得するときに初期化を実行することです。初期化プロセスは、実装オブジェクトにバインドします:StaticLoggerbinderを実装するすべてのクラスをロードし、そのシングルトンを取得します。 GetLoggerを実行すると、このSingletonクラスの方法が呼び出され、ロギング関数の特定の実装で対応するロガーオブジェクトを取得します。複数の実装がある場合は、そのうちの1つをバインドします。この状況では、不要なログ実装クラスの削除が必要です。
2.2 slf4jがブリッジされています
上記の図は、他のログシステムがSLF4Jログシステムにどのように接続されているかを示しています。基本的な原則は、それぞれのログシステムをプロキシにして、それらをSFL4Jインターフェイスに出力することです。特定の実装については、ブリッジパッケージの実装を確認できます。基本的に、元のログ実装は再実装されており、実際にログ出力を呼び出す根本的な方法はSLF4Jにあります。
JavaにはJDKの実装が搭載されており、これらのクラスを再刷新することは不可能であるため、7月だけが例外です。この場所は、7月のハンドラー拡張メカニズムに基づいてSLF4Jハンドラーを実装し、logをslf4jに書き込みます。施行するには、JRE/LIB/LOGGING.PROPERTIESを変更して、.Handlersプロパティに新しいハンドラーを構成する必要があります。一般的に、生産はこのように行われません。
2.3アプリケーション
実際のプロジェクトを適用するときは、橋渡しとブリッジされたパッケージが同時に表示されないことに注意してください。そうしないと、デッドループが発生します。たとえば、sfl4jはlog4jとlog4jの両方をブリッジし、その後、log4j出力コールはSlf4jを指し、Slf4jはこのループでlog4jをポイントします。役に立たないパッケージを排除してください。
生産の提案:slf4j-apiに取り付けられたSLF4J-APIの実装は、ログバックのみを保持し、上部ログ印刷ブリッジはすべてSLF4Jを指すことができます。
次の依存関係を参照してください。他のすべてのログパッケージは除外されています。
<Dependencies> <Dependency> <GroupId> org.slf4j </groupid> <artifactid> slf4j-api </artifactid> <バージョン> 1.7.24 </version> </dependency> <dependency> <edpentage> <Dependency> groupId> org.slf4j </groupid> <artifactid> jcl-over-slf4j </artifactid> <version> 1.7.14 </version> </dependency> <依存関係> <groupid> org.slf4j </groupid> <artifactid> log4j-over-slf4j </artifid> </Dependency> <Dependency> <GroupId> org.slf4j </groupId> <artifactid> jul-to-slf4j </artifactid> <バージョン> 1.7.7 </version> </dependency> </dependencies>
3.テストコードの実装とPOM
テストコード
public class testloggers { / ** * slf4j-api-> slf4j-log4j12-- log4j * / public void testsfl4juplog4j(){org.slf4j.logger = loggeractory.getlogger(testloggers.class.getName()); logger.info( "slf4j print use log4j"); } / ** * slf4j-api - > slf4j-jcl-> common-logging-api(utomaticallicatically to log4j) - > log4j * * / public void testslf4j2commonlogging(){org.slf4j.logger logger = loggerfactory.getlogger(testloggers.class.class.class.getname(); logger.warn( "slf4j print to common logging"); } / ** * log4j-over-slf4j-api - > logback-classic * / public void testlog4j2slf4j(){org.apache.log4j.logger logger = org.apache.log4j.logger.getlogger(testloggers.class.getname()); logger.info( "log4j print to slf4j"); } / ** * jcl-over-slf4j - > sfl4-api - > logback * / public void testcommonlogging2sl4j(){log log = logfactory.getlog(testloggers.class.getname()); log.info( "slf4jへの共通ログ"); }/** * Jul(コンソールデフォルト) - > Jul-to-slf4j-> slf4j-> logback * org.slf4j.bridge.slf4jbridgehandlerを追加するには、jre/lib/logging.properties */public void testjul2slf4j(){java.logging.loggerger java.util.logging.logger.getLogger(testloggers.class.getName()); logger.info( "Jul Print to Slf4j"); } public static void main(string [] args){testloggers tester = new testloggers(); tester.testslf4j2commonlogging(); }}Maven依存関係をテストします
<Dependencies> <Dependency> <groupId> org.slf4j </groupId> <artifactid> slf4j-api </artifactid> <バージョン> 1.7.24 </version> </dependency> <dependency> <! - <dependency> - > <! - <GroupId> org.slf4j </groupId> - > <! - <ArtifActid> jcl-over-slf4j </artifactid> - > <! - <バージョン> 1.7.14 </version> - > <! - </dependency> - > <artifactid> log4j-over-slf4j </artifactid> <bersion> 1.7.24 </version> </dependency> <! - <dependency> - > <! - <groupid> org.slf4j </groupid> - > <! - <artifactid> jul-to-slf4j </verversion <! - </Dependency> - > <! - <Dependency> - > <! - <GroupId> ch.qos.logback </groupid> - > <! - <Artifactid> - > artifactid> - > <! - <バージョン> 1.2.1 </バージョン> - > <! - </依存関係> <! - <GroupId> org.slf4j </groupId> - > <! - <artifactid> slf4j-log4j12 </artifactid> - > <! - <バージョン> 1.7.5 </バージョン> - > <! <バージョン> 1.2.17 </version> </dependency> <dependency> <groupid> org.slf4j </groupId> <artifactid> slf4j-jcl </artifactid> <バージョン> 1.7.24 </バージョン> </dependency> </dependencies>
上記の記事では、SLF4Jの互換性と他のログシステムとの使用について簡単に説明しています。私が共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。