1. 概要

Simple Logging Facade for Java(略称SLF4J)は、さまざまなロギングフレームワーク( java.util.logging、logback、Log4j など)のfacadeとして機能します。 汎用APIを提供し、実際の実装から独立したロギングを実現します。

これにより、さまざまなロギングフレームワークを共存させることができます。 また、あるフレームワークから別のフレームワークへの移行に役立ちます。 最後に、標準化されたAPIとは別に、いくつかの「シンタックスシュガー」も提供します。

このチュートリアルでは、SLF4JをLog4j、Logback、Log4j 2、およびJakartaCommonsLoggingと統合するために必要な依存関係と構成について説明します。

これらの各実装の詳細については、記事JavaLoggingの概要を参照してください。

2. Log4j2のセットアップ

Log4j 2で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 log4j-slf4j-implにあります。

実際のロギング構成は、ネイティブのLog4j2構成に準拠しています。

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およびLoggerFactoryorg.slf4jパッケージに属していることに注意してください。

この構成で実行されているプロジェクトの例は、こちらにあります。

3. ログバックの設定

LogbackはすでにSLF4Jを使用しているため、Logbackで使用するためにクラスパスにSLF4Jを追加する必要はありません。 これはリファレンス実装です。

したがって、Logbackライブラリを含める必要があります。

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

最新バージョンはここにあります:logback-classic

構成はログバック固有ですが、SLF4Jとシームレスに連携します。 適切な依存関係と構成が整っていれば、前のセクションと同じコードを使用してロギングを処理できます。

4Log4jセットアップ

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

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

SLF4Jをブリッジとして構成し、既存のフレームワークへの呼び出しをブリッジにリダイレクトできます。

Log4jのブリッジを作成するために必要な依存関係を追加しましょう。

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

依存関係が設定されている場合( log4j-over-slf4j で最新のものを確認してください)、Log4jへのすべての呼び出しはSLF4Jにリダイレクトされます。

既存のフレームワークのブリッジングの詳細については、公式ドキュメントをご覧ください。

他のフレームワークと同様に、Log4jは基盤となる実装として機能できます。

必要な依存関係を追加しましょう:

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

slf4j-log4j12およびlog4jの最新バージョンは次のとおりです。 このように構成されたプロジェクトの例は、こちらで入手できます。

5. JCLブリッジのセットアップ

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

JCLは、SLF4Jと同様のフレームワークとして意図されています。 主な違いは、JCLが実行時にクラスローディングシステムを介して基盤となる実装を解決することです。 このアプローチは、カスタムクラスローダーが使用されている場合に問題となる可能性があります。

SLF4Jは、コンパイル時にバインディングを解決します。 それは、よりシンプルでありながら十分に強力であると認識されています。

幸い、2つのフレームワークがブリッジモードで連携して機能します。

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

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

他の場合と同様に、同じコードベースは問題なく実行されます。 このセットアップを実行する完全なプロジェクトの例は、こちらにあります。

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で同じことを行うには、 if ブロックを追加する必要があります。これにより、debugレベルが有効になっているかどうかがチェックされます。

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

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

使用されるロギングレベルは、 ERROR WARN INFO DEBUG 、およびTRACEです。 それらの使用について詳しくは、JavaLoggingの概要を参照してください。

7. 結論

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

いつものように、コードはGitHubでにあります。さらに、異なる記事に特化した他の2つのプロジェクトを参照していますが、これらのプロジェクトには、こここちら