1. 概要

ロギングは、プログラムの実行時の動作を理解およびデバッグするための強力な支援手段です。 ログは重要なデータをキャプチャして保持し、いつでも分析できるようにします。

この記事では、最も人気のあるJavaロギングフレームワークであるLog4j 2とLogback、およびそれらの前身であるLog4jについて説明し、さまざまなロギングフレームワークに共通のインターフェイスを提供するロギングファサードであるSLF4Jについて簡単に触れます。

2. ロギングの有効化

この記事で説明されているすべてのロギングフレームワークは、ロガー、アペンダー、およびレイアウトの概念を共有しています。 プロジェクト内でロギングを有効にするには、次の3つの一般的な手順に従います。

  1. 必要なライブラリの追加
  2. 構成
  3. ログステートメントの配置

次のセクションでは、各フレームワークの手順について個別に説明します。

3. Log4j 2

Log4j 2は、Log4jロギングフレームワークの新しく改良されたバージョンです。 最も説得力のある改善は、非同期ロギングの可能性です。 Log4j 2には、次のライブラリが必要です。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.6.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.6.1</version>
</dependency>

log4j-api の最新バージョンは、hereおよびlog4j-corehereにあります。

3.1. 構成

Log4j 2の構成は、メイン構成log4j2.xmlファイルに基づいています。 最初に構成するのはアペンダーです。

これらは、ログメッセージがルーティングされる場所を決定します。 宛先には、コンソール、ファイル、ソケットなどがあります。

Log4j 2には、さまざまな目的のための多くのアペンダーがあります。詳細については、公式の Log4j2サイトを参照してください。

簡単な設定例を見てみましょう。

<Configuration status="debug" name="baeldung" packages="">
    <Appenders>
        <Console name="stdout" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %p %m%n"/>
        </Console>
    </Appenders>
</Configuration>

各アペンダーに名前を設定できます。たとえば、stdoutの代わりにnameconsoleを使用します。

PatternLayout要素に注意してください。これによりメッセージの外観が決まります。 この例では、パターンは pattern paramに基づいて設定されます。ここで、 %d は日付パターンを決定し、 %p –ログレベルの出力[ X150X] %m –ログに記録されたメッセージの出力および %n –改行記号を追加します。 パターンの詳細については、公式の Log4j2ページをご覧ください。

ついに – アペンダーを有効にするには (または複数)あなたはそれを追加する必要がありますセクション:

<Root level="error">
    <AppenderRef ref="STDOUT"/>
</Root>

3.2. ファイルへのロギング

ファイルへのロギングを使用する必要がある場合があるため、foutロガーを構成に追加します。

<Appenders>
    <File name="fout" fileName="baeldung.log" append="true">
        <PatternLayout>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %m%nw</Pattern>
        </PatternLayout>
    </File>
</Appenders>

ファイルアペンダーには、構成可能ないくつかのパラメーターがあります。

  • file –ログファイルのファイル名を決定します
  • append –このパラメーターのデフォルト値はtrueです。つまり、デフォルトでは、 File appenderは既存のファイルに追加し、切り捨てません。
  • 前の例で説明したPatternLayout

有効にするためにファイル追加する必要のあるアペンダーセクション:

<Root level="INFO">
    <AppenderRef ref="stdout" />
    <AppenderRef ref="fout"/>
</Root>

3.3. 非同期ロギング

Log4j 2を非同期にする場合は、LMAXディスラプターライブラリをpom.xmlに追加する必要があります。 LMAXディスラプターは、ロックフリーのスレッド間通信ライブラリです。

pom.xmlにディスラプターを追加する:

<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.3.4</version>
</dependency>

ディスラプターの最新バージョンはここにあります。

LMAXディスラプターを使用する場合は、次を使用する必要がありますそれ以外の構成で。

<AsyncRoot level="DEBUG">
    <AppenderRef ref="stdout" />
    <AppenderRef ref="fout"/>
</AsyncRoot>

または、システムプロパティLog4jContextSelectororg.apache.logging.log4j.core.async.AsyncLoggerContextSelectorに設定して、非同期ログを有効にすることができます。

もちろん、Log4j2非同期ロガーの構成の詳細を読んだり、Log4j2公式ページでいくつかのパフォーマンス図を参照したりできます。

3.4. 使用法

以下は、ロギングにLog4jを使用する方法を示す簡単な例です。

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class Log4jExample {

    private static Logger logger = LogManager.getLogger(Log4jExample.class);

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

実行後、アプリケーションは次のメッセージをコンソールと baeldung.logという名前のファイルの両方に記録します:

2016-06-16 17:02:13 INFO  Info log message
2016-06-16 17:02:13 ERROR Error log message

ルートログレベルをERRORに上げると、次のようになります。

<level value="ERROR" />

出力は次のようになります。

2016-06-16 17:02:13 ERROR Error log message

ご覧のとおり、ログレベルを上位パラメータに変更すると、ログレベルが低いメッセージはアペンダーに出力されません。

メソッドlogger.errorを使用して、発生した例外をログに記録することもできます。

try {
    // Here some exception can be thrown
} catch (Exception e) {
    logger.error("Error log message", throwable);
}

3.5. パッケージレベルの構成

たとえば、 com.baeldung.log4j2などの特定のパッケージからのメッセージをログレベルTRACEで表示する必要があるとします。

logger.trace("Trace log message");

他のすべてのパッケージについては、INFOメッセージのみのログ記録を続行する必要があります。

TRACEは、構成で指定したルートログレベルINFOよりも低いことに注意してください。

いずれかのパッケージのロギングのみを有効にするには、前に次のセクションを追加する必要がありますあなたに log4j2.xml

<Logger name="com.baeldung.log4j2" level="debug">
    <AppenderRef ref="stdout"/>
</Logger>

com.baeldung.log4j パッケージのログが有効になり、出力は次のようになります。

2016-06-16 17:02:13 TRACE Trace log message
2016-06-16 17:02:13 DEBUG Debug log message
2016-06-16 17:02:13 INFO  Info log message
2016-06-16 17:02:13 ERROR Error log message

4. ログバック

Logbackは、Log4jを作成したのと同じ開発者によって開発されたLog4jの改良版であることが意図されています。

Logbackには、Log4jと比較してはるかに多くの機能があり、それらの多くはLog4j2にも導入されています。 公式サイトでLogbackのすべての利点を簡単に見てみましょう。

pom.xmlに次の依存関係を追加することから始めましょう。

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

この依存関係は、別の2つの依存関係、logback-coreslf4j-apiを一時的に取り込みます。 Logbackの最新バージョンはここにあります。

4.1. 構成

次に、ログバック構成の例を見てみましょう。

<configuration>
  # Console appender
  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      # Pattern of log message for console appender
      <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n</Pattern>
    </layout>
  </appender>

  # File appender
  <appender name="fout" class="ch.qos.logback.core.FileAppender">
    <file>baeldung.log</file>
    <append>false</append>
    <encoder>
      # Pattern of log message for file appender
      <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n</pattern>
    </encoder>
  </appender>

  # Override log level for specified package
  <logger name="com.baeldung.log4j" level="TRACE"/>

  <root level="INFO">
    <appender-ref ref="stdout" />
    <appender-ref ref="fout" />
  </root>
</configuration>

LogbackはSLF4Jをインターフェースとして使用するため、SLF4JのLoggerおよびLoggerFactoryをインポートする必要があります。

4.2. SLF4J

SLF4Jは、ほとんどのJavaロギングフレームワークに共通のインターフェースと抽象化を提供します。 ファサードとして機能し、ロギングフレームワークの基盤となる機能にアクセスするための標準化されたAPIを提供します。

Logbackは、その機能のネイティブAPIとしてSLF4Jを使用します。 次に、ログバックロギングを使用した例を示します。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Log4jExample {

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

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

出力は前の例と同じままです。

5. Log4J

最後に、由緒あるLog4jロギングフレームワークを見てみましょう。

この時点ではもちろん時代遅れですが、より現代的な後継者の基盤を築くため、議論する価値があります。

構成の詳細の多くは、Log4j2セクションで説明されているものと一致します。

5.1. 構成

まず、プロジェクトにLog4jライブラリを追加する必要があります pom.xml:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

ここでは、Log4jの最新バージョンを見つけることができるはずです。

1つのコンソールアペンダーのみを使用した単純なLog4j構成の完全な例を見てみましょう。

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">

    <!--Console appender-->
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" 
              value="%d{yyyy-MM-dd HH:mm:ss} %p %m%n" />
        </layout>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="stdout" />
    </root>

</log4j:configuration>

1つのプロパティを持つ構成全体のオープンタグです– デバッグ 。 Log4jデバッグ情報をログに追加するかどうかを決定します。

5.2. 使用法

Log4jライブラリと構成を追加した後、コードでロガーを使用できます。 簡単な例を見てみましょう。

import org.apache.log4j.Logger;

public class Log4jExample {
    private static Logger logger = Logger.getLogger(Log4jExample.class);

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

6. 結論

この記事では、Log4j、Log4j2、Logbackなどのさまざまなロギングフレームワークを使用する方法の非常に簡単な例を示します。 上記のすべてのフレームワークの簡単な構成例について説明します。

記事に付随する例は、GitHubのにあります。