SLF4Jログファサードテクノロジー

個人的に学習ビデオを組み合わせて簡単に理解して記録します

slf4j ログ ファサードにどのログ実装が使用されるかは、pom ファイルに依存関係をインポートする順序によって決まり、先頭にある人がログ実装として使用される人を使用します。

core --slf4j 依存関係

        <!--slf4j 核心依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>

1. 入門ケース

他のログ フレームワークを統合しないことに基づいて、slf4j は組み込みのログ フレームワーク slf4j-simple を使用し、依存関係を別途導入する必要があります。

        <!--slf4j 自带的简单日志实现 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.25</version>
        </dependency>

ディスプレイ効果

64541ee12dca4cb9b13346c4ebdaa6b5.png

 1.1 文字列の連結をプレースホルダに置き換えることで、より柔軟なログ情報を動的に出力することも可能

        Logger logger = LoggerFactory.getLogger(SLF4JTest01.class);
        String name = "zs";
        int age = 23;
        //{},这个括号就是占位符
        logger.info("学生信息-姓名:"+name+";年龄:"+age);
        logger.info("学生信息-姓名:{},年龄:{}",new Object[]{name,age});
        logger.info("学生信息-姓名:{},年龄:{}",name,age);

表示されるログ情報

0d5f593e56fb49ddb8059fcdb4194dc8.png

 2. サードパーティのログ フレームワークを統合する前に、slf4j の公式 Web サイトを確認してください。

ca5f2271f6a64fd0a5db195e0b2c5e07.png

 2.1 slf4j ログ ファサードには、ログ実装をバインドする 3 つの状況があります

        1. ログ実装をバインドしないことに基づいて、ログ ファサードは機能を実装できません。slf4j-simple は slf4j 公式 Web サイトによって提供されるログ実装です。依存関係をインポートすると、自動的に slf4j ログ ファサードにバインドされます。そうでない場合は、slf4j 公式 Web サイトが提供するログ実装です。インポートされた場合、実装は提供されません。

        2. Logback と simple (nop を含む) は、どちらも slf4j ログ ファサードのタイムラインの背後で提供されるログ実装であるため、設計は slf4j に完全に準拠しており、依存関係をインポートするだけでシームレスに接続できます。すべてのログを印刷します。

        3. log4j と JUL はどちらも slf4j ログ ファサードのタイムラインの前にあるログ実装であるため、API は slf4j の設計に従いませんが、ブリッジング テクノロジーを適応させることでログ ファサードとの接続を完了できます。

ログバック依存関係

        <!-- logback依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

nop依存

        <!-- 导入nop -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.25</version>
        </dependency>
//--------------------------分割线----------------------------------------------------------

logback、simple、および nop は、slf4j ログ ファサード テクノロジの出現に属しているため、依存関係を直接インポートすることによってのみ使用できます。

3. 現時点で、log4j ログ実装を使用する必要がある場合は、機能を実現するためにブリッジング テクノロジを使用し、アダプターをバインドし、2 つの依存関係をインポートする必要があります。

        アダプターの依存関係と log4j の依存関係

        <!-- 导入log4j适配器依赖 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>

        <!-- 导入log4j依赖 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

log4j 構成ファイルも追加する必要があります。

#配置根节点logger
log4j.rootLogger=trace,console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n

ログ表示情報

cf118964aded460893ef5ac1ca033541.png

 4. JUL ログ実装 - slf4j タイムライン前のログ実装に属しており、アダプターの依存関係を追加する必要があります。JUL は JDK に組み込まれているため、依存関係を手動でインポートする必要はありません

        <!--导入JUL的适配器依赖,因为JUL是JDK内置的,所以不用导入JUL的依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>1.7.25</version>
        </dependency>

ログ表示情報

7b649350c5c247ccabf521017dc0d670.png

 

 備考: このような赤枠の警告メッセージが表示された場合は、複数のログ実装がインポートされていますが、デフォルトでは 1 つ (順番に最初のもの) のみが使用され、コメントアウトされている場合は表示されません。ただし、実際の運用環境では、通常、バインドされるログ実装は 1 つだけであり、複数のログ実装がバインドされている場合は、冗長な警告メッセージが表示されます。

955761154a3744d486566ccd7f9e44af.png

 

5.デモ

要件: プロジェクトでは log4j が使用されています。現在、log4j はプロジェクトのニーズを満たすことができません。コードを変更せずにこの問題を解決するには、slf4j+logback にリファクタリングする必要があります。

        5.1 log4j をコメントアウトします。この時点で、コードはエラーを報告する必要があります。次に、slf4j と logback の依存関係を追加し、次にブリッジの依存関係を追加します。ブリッジは、プロジェクト内のログの再構築の問題を解決します。プロジェクト API 内の以前のログ。ブリッジを通じて slf4j の実装に変換できます。

        <!--slf4j 核心依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!--桥接器-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- logback依赖 -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

 再構築前のログ情報

09f1028955774504979c249db4be29c5.png

 リファクタリングされたログ情報

09ff5e6a09aa428cb0f829cebe4cfb11.png

 リファクタリング後は、log4j パッケージ下のコンポーネント リソースが使用されているように錯覚しますが、実際のログ実装は slf4j ファサード + logback ログ実装であり、これはブリッジによってもたらされる効果です。

知らせ:

        ブリッジが結合された後は、アダプターを結合する必要はありません

        ブリッジとアダプターは同時に接続できません

        ブリッジがアダプターの上にある場合、実行時にエラーが報告されます。

        ブリッジがアダプターの下にある場合、ブリッジは実行されず、意味がありません

 

おすすめ

転載: blog.csdn.net/DDDM456/article/details/127390193