1. 概要

この短いチュートリアルでは、Spring Bootで利用可能な主なロギングオプションについて説明します。

Logbackの詳細については、 A Guide to Logback を参照してください。一方、Log4j2は Introduction to Log4j2 – Appenders、Layouts andFiltersで紹介されています。

2. 初期設定

まず、Spring Bootモジュールを作成しましょう。 これを行うための推奨される方法は、 Spring Initializr を使用することです。これについては、 Spring BootTutorialで説明しています。

それでは、唯一のクラスファイルLoggingControllerを作成しましょう。

@RestController
public class LoggingController {

    Logger logger = LoggerFactory.getLogger(LoggingController.class);

    @RequestMapping("/")
    public String index() {
        logger.trace("A TRACE Message");
        logger.debug("A DEBUG Message");
        logger.info("An INFO Message");
        logger.warn("A WARN Message");
        logger.error("An ERROR Message");

        return "Howdy! Check out the Logs to see the output...";
    }
}

Webアプリケーションをロードすると、 http:// localhost:8080/にアクセスするだけでこれらのログ行をトリガーできるようになります。

3. ゼロ構成ロギング

SpringBootは非常に役立つフレームワークです。 これにより、構成設定の大部分を忘れることができます。その多くは、自動調整されていると考えられています。

ロギングの場合、必須の依存関係は ApacheCommonsLogging。のみです。

Spring 4.x( Spring Boot 1.x )を使用する場合にのみインポートする必要があります。これは、SpringFrameworkのspring-jclモジュールによって提供されるためです。 X147X] 5( Spring Boot 2.x )。

Spring Bootスターター(ほとんどの場合)を使用している場合は、spring-jclのインポートについてまったく心配する必要はありません。 これは、 spring -boot-starter-web のようなすべてのスターターが、 spring -boot-starter-logging、に依存しているためです。 ]-jcl。

3.1. デフォルトのログバックログ

スターターを使用する場合、デフォルトではログバックがロギングに使用されます。

Spring Bootは、標準出力を読みやすくするために、パターンとANSIカラーで事前構成します。

アプリケーションを実行してhttp:// localhost:8080 / ページにアクセスし、コンソールで何が起こるかを見てみましょう。

ご覧のとおり、ロガーのデフォルトのログレベルはINFOに事前設定されています。つまり、TRACEおよびDEBUGメッセージは表示されません。

構成を変更せずにそれらをアクティブ化するために、コマンドラインで–debugまたは–trace引数を渡すことができます

java -jar target/spring-boot-logging-0.0.1-SNAPSHOT.jar --trace

3.2. ログレベル

Spring Bootはまた、環境変数を介してよりきめ細かいログレベル設定にアクセスできるようにします。これを実現する方法はいくつかあります。

まず、VMオプション内でログレベルを設定できます。

-Dlogging.level.org.springframework=TRACE 
-Dlogging.level.com.baeldung=TRACE

または、Mavenを使用している場合は、コマンドラインを使用してログ設定を定義できます。

mvn spring-boot:run 
  -Dspring-boot.run.arguments=--logging.level.org.springframework=TRACE,--logging.level.com.baeldung=TRACE

Gradleを使用する場合、コマンドラインからログ設定を渡すことができます。 これには、bootRunタスクの設定が必要になります。

それが完了したら、アプリケーションを実行します。

./gradlew bootRun -Pargs=--logging.level.org.springframework=TRACE,--logging.level.com.baeldung=TRACE

詳細度を永続的に変更する場合は、ここで説明されているようにapplication.propertiesファイルで変更できます。

logging.level.root=WARN
logging.level.com.baeldung=TRACE

最後に、ロギングフレームワーク構成ファイルを使用してロギングレベルを永続的に変更できます。

SpringBootStarterはデフォルトでLogbackを使用することを説明しました。 2つの別々のパッケージのレベルを設定するLogback構成ファイルのフラグメントを定義する方法を見てみましょう。

<logger name="org.springframework" level="INFO" />
<logger name="com.baeldung" level="INFO" />

パッケージのログレベルが上記のさまざまなオプションを使用して複数回定義されているが、ログレベルが異なる場合は、最も低いレベルが使用されることに注意してください。

したがって、Logback、Spring Boot、および環境変数を同時に使用してログレベルを設定すると、ログレベルは TRACE になり、要求されたレベルの中で最も低くなります。

4. ログバック構成ログ

デフォルトの構成は便利ですが(たとえば、POCや迅速な実験中にゼロ時間で開始する場合)、日常のニーズには十分ではない可能性があります。

異なる色とログパターン、コンソールファイル出力の個別の仕様、および適切なを使用してログバック構成を含める方法を見てみましょう。巨大なログファイルの生成を回避するためのローリングポリシー。

まず、他の多くのアプリケーション設定で一般的に使用されている application.properties、を汚染するのではなく、ロギング設定のみを処理できるソリューションを見つける必要があります。

クラスパス内のファイルの名前が次のいずれかである場合、SpringBootはデフォルト構成でそのファイルを自動的にロードします

  • logback-spring.xml
  • logback.xml
  • logback-spring.groovy
  • logback.groovy

Springは、ここで説明されているように、可能な限りプレーンバリアントよりも-springバリアントを使用することをお勧めします。

簡単なlogback-spring.xmlを書いてみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="LOGS" value="./logs" />

    <appender name="Console"
        class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS}/spring-boot-logger.log</file>
        <encoder
            class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily and when the file reaches 10 MegaBytes -->
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    
    <!-- LOG everything at INFO level -->
    <root level="info">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <!-- LOG "com.baeldung*" at TRACE level -->
    <logger name="com.baeldung" level="trace" additivity="false">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </logger>

</configuration>

そして、アプリケーションを実行すると、次の出力が得られます。

 

ご覧のとおり、TRACEおよびDEBUGメッセージをログに記録するようになり、全体的なコンソールパターンは、テキストと色の両方で以前とは異なります。

また、現在のパスの下に作成された / logs フォルダー内のファイルにログオンし、ローリングポリシーを介してアーカイブするようになりました。

5. Log4j2構成ログ

Apache Commons Loggingがコアであり、Logbackが提供されるリファレンス実装ですが、他のロギングライブラリへのすべてのルーティングは、それらへの切り替えを容易にするためにすでに含まれています。

ただし、Logback以外のロギングライブラリを使用するには、依存関係から除外する必要があります。

このようなすべてのスターターに対して(この例ではこれが唯一のスターターですが、多くのスターターを使用できます):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

それをスキニーバージョンに変換し、(一度だけ)代替ライブラリをここでスターター自体を介して追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

この時点で、次のいずれかの名前のファイルをクラスパスに配置する必要があります。

  • log4j2-spring.xml
  • log4j2.xml

Log4j2(SLF4J上)をさらに変更せずに印刷します。

簡単なlog4j2-spring.xmlを書いてみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable" />
        </Console>

        <RollingFile name="RollingFile"
            fileName="./logs/spring-boot-logger-log4j2.log"
            filePattern="./logs/$${date:yyyy-MM}/spring-boot-logger-log4j2-%d{-dd-MMMM-yyyy}-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- rollover on startup, daily and when the file reaches 
                    10 MegaBytes -->
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy
                    size="10 MB" />
                <TimeBasedTriggeringPolicy />
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- LOG everything at INFO level -->
        <Root level="info">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile" />
        </Root>

        <!-- LOG "com.baeldung*" at TRACE level -->
        <Logger name="com.baeldung" level="trace"></Logger>
    </Loggers>

</Configuration>

そして、アプリケーションを実行すると、次の出力が得られます。

 

ご覧のとおり、出力はLogbackの出力とはかなり異なります。これは、現在Log4j2を完全に使用していることの証明です。

Log4j2では、XML構成に加えて、ここで説明されているYAMLまたはJSON構成も使用できます。

6. SLF4JなしのLog4j2

SLF4Jを経由せずに、Log4j2をネイティブに使用することもできます。

これを行うには、ネイティブクラスを使用するだけです。

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
// [...]
Logger logger = LogManager.getLogger(LoggingController.class);

標準のLog4j2Spring Boot構成に他の変更を加える必要はありません。

これで、古いSLF4Jインターフェイスにとらわれることなく、Log4j2の新しい機能を活用できます。 ただし、この実装にも関係しているため、別のロギングフレームワークに切り替えるときにコードを書き直す必要があります。

7. ロンボクでのロギング

これまで見てきた例では、ロギングフレームワークからロガーのインスタンスを宣言する必要がありました。

この定型コードは煩わしい場合があります。 Lombokによって導入されたさまざまな注釈を使用してそれを回避できます。

最初に、ビルドスクリプトにLombok依存関係を追加して、それを操作する必要があります。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>

7.1. @Slf4jおよび@CommonsLog

SLF4JおよびApacheCommonsLogging APIを使用すると、コードに影響を与えることなく、ロギングフレームワークを柔軟に変更できます。

また、Lombokの@Slf4jおよび@CommonsLogアノテーションを使用して、適切なロガーインスタンスをクラスに追加できます。SLF4Jおよびorg.apache.commonsの場合はorg.slf4j.Loggerです。 ApacheCommonsLoggingのlogging.Log

これらのアノテーションの動作を確認するために、 LoggingController に似たクラスを作成しますが、ロガーインスタンスはありません。 LombokLoggingController という名前を付け、 @Slf4jで注釈を付けます。

@RestController
@Slf4j
public class LombokLoggingController {
 
    @RequestMapping("/lombok")
    public String index() {
        log.trace("A TRACE Message");
        log.debug("A DEBUG Message");
        log.info("An INFO Message");
        log.warn("A WARN Message");
        log.error("An ERROR Message");
 
        return "Howdy! Check out the Logs to see the output...";
    }
}

log をロガーインスタンスとして使用して、スニペットを少し調整したことに注意してください。 これは、注釈 @ Slf4j を追加すると、logという名前のフィールドが自動的に追加されるためです。

Zero-Configuration Logging を使用すると、アプリケーションは基盤となるロギング実装Logbackを使用してロギングを行います。 同様に、Log4j2実装は、Log4j2-ConfigurationLoggingを使用したロギングに使用されます。

アノテーション@Slf4j@CommonsLog。に置き換えると、同じ動作が得られます。

7.2. @ Log4j2

注釈@Log4j2 を使用して、Log4j2を直接使用できます。 したがって、 LombokLoggingController に簡単な変更を加えて、 @Slf4jまたは@CommonsLogの代わりに@Log4j2を使用します。

@RestController
@Log4j2
public class LombokLoggingController {
 
    @RequestMapping("/lombok")
    public String index() {
        log.trace("A TRACE Message");
        log.debug("A DEBUG Message");
        log.info("An INFO Message");
        log.warn("A WARN Message");
        log.error("An ERROR Message");
 
        return "Howdy! Check out the Logs to see the output...";
    }
}   

ロギング以外にも、コードをクリーンで整頓するのに役立つLombokのアノテーションがあります。 それらの詳細については、 Project Lombokの概要を参照してください。また、EclipseとIntelliJを使用したLombokのセットアップに関するチュートリアルもあります。

8. JavaUtilロギングに注意してください

Spring Bootは、logging.properties構成ファイルを介してJDKロギングもサポートします。

ただし、それを使用するのは良い考えではない場合があります。 ドキュメントから:

Java Util Loggingには、「実行可能jar」から実行するときに問題を引き起こす既知のクラスローディングの問題があります。 可能な限り、「実行可能jar」から実行する場合は回避することをお勧めします。

また、Spring4を使用してpom.xmlでcommons-loggingを手動で除外し、ログライブラリ間の潜在的な衝突を回避することもお勧めします。 Spring 5は代わりに自動的に処理するため、Spring Boot2を使用する場合は何もする必要はありません。

9. Windows上のJANSI

LinuxやMacOSXなどのUnixベースのオペレーティングシステムはデフォルトでANSIカラーコードをサポートしていますが、Windowsコンソールでは、すべてが悲しいことに単色になります。

Windowsは、JANSIと呼ばれるライブラリを介してANSIカラーを取得できます。

ただし、クラスローディングの欠点の可能性に注意を払う必要があります。

次のように、構成でインポートして明示的にアクティブ化する必要があります。

ログバック

<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <withJansi>true</withJansi>
        <encoder>
            <pattern>[%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>
    <!-- more stuff -->
</configuration>

Log4j2

ANSIエスケープシーケンスは多くのプラットフォームでネイティブにサポートされていますが、Windowsではデフォルトではサポートされていません。 ANSIサポートを有効にするには、アプリケーションにJansi jarを追加し、プロパティlog4j.skipJansiをfalseに設定します。これにより、Log4jはコンソールに書き込むときにJansiを使用してANSIエスケープコードを追加できます。

注:Log4j 2.10より前は、Jansiはデフォルトで有効にされていました。 Jansiがネイティブコードを必要とするという事実は、Jansiが単一のクラスローダーによってのみロードできることを意味します。 Webアプリケーションの場合、これは JansijarがWebコンテナのクラスパスにある必要があることを意味します。Webアプリケーションで問題が発生しないように、Log4jはLog4j2.10以降の明示的な構成なしでJansiを自動的にロードしようとしなくなりました。

また、注目に値します。

  • layout ドキュメントページには、highlight {pattern}{style}セクションに役立つLog4j2JANSI情報が含まれています。
  • JANSIは出力に色を付けることができますが、Spring Bootのバナー(ネイティブまたは Banner.txt ファイルを介してカスタマイズ)は単色のままです。

10. 結論

Spring Bootプロジェクト内から主要なロギングフレームワークとインターフェイスする主な方法を見てきました。

また、各ソリューションの主な利点と落とし穴についても説明しました。

いつものように、完全なソースコードはGitHubから入手できます。