1概要

Simple Logging Facade for Java(略してSLF4J) – さまざまなロギングフレームワークに対してhttps://en.wikipedia.org/wiki/Facade__pattern[facade]として機能します(例:

java.util.logging、

。 logback、Log4j])。ロギングを実際の実装から独立させる汎用APIを提供します。

これにより、異なるロギングフレームワークを共存させることができます。フレームワーク間の移行にも役立ちます。最後に、標準化されたAPIとは別に、いくつかの「構文糖」も提供しています。

この記事ではSLF4JをLog4j2、Logback、Log4J2、およびJakarta Commons Loggingと統合するために必要な依存関係と設定について説明します。これらの各実装の詳細については、記事のリンクを参照してください。/java-logging-intro[Javaロギングの概要]


2.

** Log4j2セットアップ+

**

Log4j2でSLF4Jを使用するには、

pom.xml

に次のライブラリを追加する必要があります。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.7</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.7</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.7</version>
</dependency>

最新版はここにあります。


log4j-api



log4j-core

、http://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl[log4j-slf4j-impl]。

実際のロギング設定は、ネイティブのLog4j 2設定に準拠しています。

Logger

インスタンスがどのように作成されるのかを見てみましょう。

public class SLF4JExample {

    private static Logger logger = LoggerFactory.getLogger(SLF4JExample.class);

    public static void main(String[]args) {
        logger.debug("Debug log message");
        logger.info("Info log message");
        logger.error("Error log message");
    }
}


Logger



LoggerFactory



org.slf4j

パッケージに属しています。説明されている設定で実行されているプロジェクトの例は、https://github.com/eugenp/tutorials/tree/master/feign[here]にあります。


3.

** ログバック設定

**

LogbackでSLF4Jを使用するために、SLF4Jをクラスパスに追加する必要はありません。

ログバックはすでにSLF4Jを使用しています。これは参照実装と見なされます。 Logbackライブラリを含めるだけで済みます。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>

最新版はここにあります。

設定はLogback特有ですが、SLF4Jとシームレスに連携します。

適切な依存関係と設定が整っていれば、前のセクションと同じコードを使用してロギングを処理できます。

4


.


** Log4jセットアップ+

**

前のセクションでは、SLF4Jが特定のロギング実装の上に置かれるユースケースについて説明しました。このように使用すると、基礎となるフレームワークが完全に抽象化されます。

既存のロギングソリューションを置き換えることができない場合があります。サードパーティの要件によるものです。しかしこれは、プロジェクトがすでに使用されているフレームワークに対してのみ「刑を宣告」されることを意味するのではありません。

SLF4Jはブリッジとして構成でき、既存のフレームワークへの呼び出しはそこにリダイレクトされます。 Log4jのブリッジを作成するために必要な依存関係を追加しましょう。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.21</version>
</dependency>

依存関係を整えて(https://search.maven.org/classic/#search%7C1%7Cg%3A%22org.slf4j%22%20AND%20a%3A%22log4j-over-slf4jで最新のものを確認%22[log4j-over-slf4j])、Log4jへのすべての呼び出しはSLF4Jにリダイレクトされます。既存のフレームワークを橋渡しすることについてもっと学ぶためにhttp://www.slf4j.org/legacy.html[公式文書]を検討してください。

他のフレームワークと同様にLog4jは基本的な実装として機能します。必要な依存関係を追加しましょう。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>


slf4j-の最新バージョンがこちらにあります。 log4j12

およびhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22log4j%22%20AND%20a%3A%22log4j%22[log4j]。

説明された方法で構成された例示的なプロジェクトは、https://github.com/eugenp/tutorials/tree/master/testing-modules/rest-assured[ここ]から入手可能です。


5.

** JCLブリッジの設定+

**

前のセクションでは、異なる実装を使用してロギングをサポートするために同じコードベースを使用する方法を示しました。これがSLF4Jの主な約束と強みですが、それはJCL(Jakarta Commons LoggingまたはApache Commons Logging)の背後にある目標でもあります。

意図的には、JCLはSLF4Jに似たフレームワークです。主な違いは、JCLがクラスローディングシステムを通じて実行時に基礎となる実装を解決することです。この方法は、カスタムクラスローダが使用されている場合には問題があると考えられます。

SLF4Jはコンパイル時にそのバインディングを解決します。それは単純だが十分に強力だと感じています。

幸いなことに、2つのフレームワークはブリッジモードで一緒に動作することができます。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.21</version>
</dependency>

最新の依存関係バージョンはここにあります。[jcl-over-slf4j]

他の場合と同様に、同じコードベースでも問題なく動作します。この設定を実行する完全なプロジェクトの例はhttps://github.com/eugenp/tutorials/tree/master/core-java[ここ]にあります。


6.

さらに** SLF4Jの良さ+

**

SLF4Jには、ロギングをより効率的にし、コードを読みやすくするための追加機能があります。例えば、SLF4Jはパラメーターを処理するための非常に便利なインターフェースを提供します。

String variable = "Hello John";
logger.debug("Printing variable value: {}", variable);

これは同じことをするLog4jのコード例です:

String variable = "Hello John";
logger.debug("Printing variable value: " + variable);

ご覧のとおり、Log4jは

debug

レベルが有効か無効かにかかわらず

Strings

を連結します。高負荷アプリケーションでは、これはパフォーマンス問題を引き起こすかもしれません。 SLF4Jは、

debug

レベルが有効な場合にのみ

Strings

を連結します。 Log4Jで同じことをするには、

debug

levelが有効かどうかをチェックする

if

ブロックを追加する必要があります。

String variable = "Hello John";
if (logger.isDebugEnabled()) {
    logger.debug("Printing variable value: " + variable);
}

SLF4Jは、特定の実装ごとに異なるロギングレベルを標準化しました。ロギングフレームワークでは、アプリケーションをいつ終了させるかを決定するべきではないという前提に基づいて、

FATAL

ロギングレベルが低下しました(Log4jで導入されました)。

使用されるログ記録レベルは

ERROR、WARN、INFO、DEBUG、TRACE

です。これらの使い方についての詳細は、リンク:/java-logging-intro[Javaロギングの概要]の記事を参照してください。

** 7. 結論

**

SLF4Jは、ロギングフレームワーク間のサイレントスイッチングを支援します。シンプルでありながら柔軟性があり、読みやすさとパフォーマンスの向上を可能にします。

いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/logging-modules/log4j[over on GitHubで見つけることができます。しかし、議論されたログ設定、https://github.com/eugenp/tutorials/tree/master/feign[here]およびhttps://github.com/eugenp/tutorials/tree/master/core-java[here]を含みます。