1概要

この短いチュートリアルでは、Spring Bootで利用可能な主なロギングオプションを探ります。

Logbackについてのより深い情報はリンクにあります:/logback[Logback to Guide to Logback]、一方Log4j2はリンクに導入されています:/log4j2-appenders-layouts-filters[Log4j2の紹介 – アペンダー、レイアウトとフィルタ]


2初期設定

まずSpring Bootモジュールを作成しましょう。推奨される方法はhttps://start.spring.io/[Spring Initializr]を使用することです。これについてはリンクで説明します:/spring-boot-start[Spring Boot Tutorial]。

それでは、私たちの唯一のクラスファイル

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ゼロ構成ロギング

Spring Bootは非常に役に立つフレームワークです – それは私達が構成設定の大部分を忘れるのを助けます、そしてそれの大部分はそれが意外にも自動チューニングします。

ロギングの場合、唯一の必須の依存関係は__Apache Commons Loggingです。

Spring 4.xを使用している場合にのみインポートする必要があります(https://github.com/spring-projects/spring-boot/blob/1.5.x/spring-boot-dependencies/pom.xml#L154[Spring Boot 1 .x])、Spring 5以降(https://github.com/spring-projects/spring-boot/blob/2.0.x/spring-boot-project/spring-boot-dependencies/pom.xml#L154[)。 Spring Boot 2.x])これはSpring Frameworkの


spring-jcl


モジュールによって提供されます。

Spring Boot Starterを使っているのであれば

spring-jcl

をインポートすることについて心配する必要はまったくありません** (これはほとんどいつもそうです)。なぜなら、私たちの

spring-boot-starter-web

のようなすべてのスターターは、

spring-boot-start-logging-

に依存しているからです。

  • スターターを使用している場合、デフォルトではLogbackがロギングに使用されます。

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

それでは、アプリケーションを実行して


http://localhost:8080/


ページにアクセスし、コンソールで何が行われるのかを確認しましょう。

上の図からわかるように、LoggerのデフォルトのロギングレベルはINFOにプリセットされています。つまり、



TRACE

および

DEBUG

メッセージは表示されません。

設定を変更せずにそれらを有効にするために、**

debug

または

trace

引数をコマンドラインで渡すことができます。

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

冗長性を恒久的に変更したい場合は、https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.htmlに記載されているように

application.properties

ファイルで変更できます。 #boot-features-custom-log-levels[ここ]:

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


4ログバック設定のログ記録

デフォルトの設定は便利ですが(たとえば、POCや簡単な実験の間にゼロ時間で始めるために)、それは私たちの日々のニーズには十分ではない可能性があります。

色とロギングパターンを変え、

console



file

の出力を別々に指定し、巨大なログファイルが生成されないように適切な

rolling policy

を付けて** Logback設定を含める方法を見てみましょう。

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

  • クラスパス内のファイルが次のいずれかの名前を持つ場合、Spring Bootは自動的にデフォルト設定を上書きします。


  • logback-spring.xml


  • logback.xml


  • logback-spring.groovy


  • logback.groovy


https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html#bootで説明されているように、


Springは可能な限り普通のものより


spring

の変形を** 使用することを推奨-features-custom-log-configuration[ここ]。

簡単な__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を完全に使用していることの証明です。

XML設定に加えて、Log4j2はhttps://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html#howtoに記述されているように、YAMLまたはJSON設定も使用することを可能にします。 -configure-log4j-logging-yaml-or-json-config[ここ]。


6. SLF4JなしのLog4j2

SLF4Jを介さずにLog4j2をネイティブに使用することもできます。

そのためには、単にネイティブクラスを使用する必要があります。

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

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

これまでのSLF4JインタフェースにとらわれずにLog4j2のまったく新しい機能を利用できるようになりましたが、この実装にも縛られているため、別のロギングフレームワークに切り替える場合はコードを書き換える必要があります。


7. Java Util Logging

に注意してください.

Spring Bootは

logging.properties

設定ファイルを通してJDKロギングもサポートします。

ただし、使用するのが得策ではない場合があります。

ドキュメント

から:

Java Util Loggingには、「実行可能jar」から実行したときに問題を引き起こすクラスローディングの問題が知られています。可能であれば、「実行可能jar」から実行するときは避けることをお勧めします。

Spring 4を使うとき、pom.xmlで

commons-logging

を手動で除外し、ロギングライブラリ間の潜在的な衝突を避けることもまた良い習慣です。代わりにSpring 5が自動的にそれを処理するので、Spring Boot 2を使うときは何もする必要はありません。

===

8 JANSI on Windows

LinuxやMac OS Xなどの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>

ANSIエスケープシーケンスは、多くのプラットフォームでネイティブにサポートされていますが、Windowsではデフォルトではサポートされていません。
























































































































































































































































































































** ANSIサポートを有効にするには、Jansi jarをアプリケーションに追加し、

log4j.skipJansiプロパティを

false __に設定します。これにより、Log4jはJansiを使用してコンソールに書き込むときにANSIエスケープコードを追加できます。

注:Log4j 2.10より前のバージョンでは、Jansiはデフォルトで有効になっていました。 Jansiがネイティブコードを必要とするという事実は、

Jansiは単一のクラスローダー

によってのみロードできることを意味します。 Webアプリケーションの場合、これは

Jansi jarがWebコンテナのクラスパス内になければならないことを意味します

。 Webアプリケーションに問題を起こさないようにするために、Log4jはLog4j 2.10以降の明示的な設定なしにJansiを自動的にロードしようとしなくなりました。

次のことも知っておく価値があります。

ドキュメントページには、Log4j2 JANSIに関する便利な情報が含まれています。


ハイライト\ {パターン} \ {スタイル}


セクション
** JANSIは出力に色を付けることができますが、Spring Bootのバナー(ネイティブまたは


banner.txt

ファイルを使ってカスタマイズした場合、

===

9結論

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

また、すべてのソリューションの主な利点と落とし穴についても調査しました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/blob/master/spring-boot-logging-log4j2[Githubで利用可能]です。