Spring Bootでログインする

Spring Bootでのロギング

1. 概要

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

Logbackの詳細な情報はA Guide To Logbackで利用可能であり、Log4j2はIntro to Log4j2 – Appenders, Layouts and Filtersで導入されている。

参考文献:

テスト時のSpring Bootでのログレベルの設定

より詳細なログ出力を調べてテストの失敗を診断する必要がある場合は、テスト時にSpringアプリのログを再構成する方法を以下に示します。

Spring Bootで自動構成レポートを表示する

起動時に自動構成レポートを生成することにより、Spring BootアプリケーションでどのBeanが自動的に構成されるかを学習します。

2. 初期設定

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

それでは、唯一のクラスファイル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アプリケーションをロードしたら、we’ll be able to trigger those logging lines by simply visiting http://localhost:8080/

3. ゼロ構成ログ

Spring Bootは非常に有用なフレームワークです。構成設定の大部分を忘れることができ、その多くは自動調整されます。

ロギングの場合、必須の依存関係はApache Commons Logging.のみです。

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

We shouldn’t worry about importing spring-jcl at all if we’re using a Spring Boot Starter(ほとんどの場合私たちはそうです)。 これは、spring-boot-starter-webのようなすべてのスターターが、すでにspring-jclをプルしているspring-boot-starter-logging,に依存しているためです。

When using starters, Logback is used for logging by default

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

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

image

上の写真でわかるように、the default logging level of the Logger is preset to INFO, meaning thatTRACE and DEBUG messages are not visible.

構成を変更せずにアクティブ化するには、we can pass the –debug or –trace arguments on the command line:

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

Spring Bootもgives us access to a more fine-grained log level setting via environment variablesです。 これを実現する方法はいくつかあります。

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

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

または、Mavenを使用している場合は、define our log settings via the command line

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

Gradleを使用する場合、コマンドラインを介してログ設定を渡すことができます。 これにはsetting the bootRun taskが必要です。 それが完了したら、アプリケーションを実行できます。

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

冗長性を永続的に変更したい場合は、hereで説明されているようにapplication.propertiesファイルで変更できます。

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

最後に、change the logging level permanently by using our logging framework configuration fileを実行できます。

Spring Boot StarterではLogbackがデフォルトで使用されることを前に述べました。 2つの別々のパッケージのレベルを設定するLogback構成ファイルのフラグメントを定義する方法を見てみましょう。


if the log level for a package is defined multiple timesは上記のさまざまなオプションを使用していますが、with different log levels, the lowest level will be usedは使用していることに注意してください。

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

4. ログバック構成ログ

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

異なる色とログパターン、consolefileの出力の個別の仕様、および巨大なログファイルの生成を回避するための適切なrolling policyhow to include a Logback configurationを見てみましょう。

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

デフォルト構成に対するWhen a file in the classpath has one of the following names, Spring Boot will automatically load it

  • logback-spring.xml

  • logback.xml

  • logback-spring.groovy

  • logback.groovy

hereで説明されているように、可能な限りプレーンなものよりもSpring recommends using the -spring variant

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




    

    
        
            
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            
        
    

    
        ${LOGS}/spring-boot-logger.log
        
            %d %p %C{1.} [%t] %m%n
        

        
            
            ${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            
            
                10MB
            
        
    

    
    
        
        
    

    
    
        
        
    

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

 

image

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

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

5. Log4j2構成ログ

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

In order to use any logging library other than Logback, though, we need to exclude it from our dependencies

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


    org.springframework.boot
    spring-boot-starter-web

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


    org.springframework.boot
    spring-boot-starter-web
    
        
            org.springframework.boot
            spring-boot-starter-logging
        
    


    org.springframework.boot
    spring-boot-starter-log4j2

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

  • log4j2-spring.xml

  • log4j2.xml

Log4j2(SLF4J経由)を介して、さらに変更を加えずに印刷します。

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



    
        
            
        

        
            
                %d %p %C{1.} [%t] %m%n
            
            
                
                
                
                
            
        
    

    
        
        
            
            
        

        
        
    

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

 

image

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

Log4j2では、XML構成に加えて、hereで説明されているように、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);

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

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

7. Lombokでのロギング

例では、ロギングフレームワークからのso far, we’ve had to declare an instance of a loggerを確認しました。 この定型コードは煩わしく、Lombokによって導入されたさまざまなアノテーションを使用して回避できます。

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


    org.projectlombok
    lombok
    1.18.4
    provided

7.1. @Slf4jおよび@CommonsLog

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

また、use Lombok’s @Slf4j and @CommonsLog annotationsを使用して、適切なロガーインスタンスをクラスに追加できます。SLF4Jの場合はorg.slf4j.Logger、Apache Commons Loggingの場合はorg.apache.commons.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を使用すると、ロギング用にthe application will use underlying logging implementation Logbackが使用されます。 同様に、Log4j2実装はLog4j2-Configuration Loggingでのロギングに使用されます。

注釈@Slf4j@CommonsLog.に置き換えると、同じ動作が得られます

7.2. @Log4j2

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

@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からのコードがあり、コードをきれいに整頓するのに役立ちます。 それらの詳細については、Introduction to Project Lombokを参照してください。また、Setting up Lombok with Eclipse and IntelliJに関するチュートリアルもあります。

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

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

ただし、使用するのが得策ではない場合もあります。 the documentationから:

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

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

9. Windows上のJANSI

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

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

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

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

Logback


    
        true
        
            [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n
        
    
    

Log4j2

ANSIエスケープシーケンスは多くのプラットフォームでネイティブにサポートされていますが、Windowsではデフォルトではサポートされていません。 To enable ANSI support add the Jansi jar to our application and set property log4j.skipJansi to false.これにより、Log4jはJansiを使用して、コンソールに書き込むときにANSIエスケープコードを追加できます。

Note
Log4j 2.10より前は、Jansiはデフォルトで有効にされていました。 Jansiがネイティブコードを必要とするという事実は、Jansi can only be loaded by a single class loaderを意味します。 Webアプリケーションの場合、これはthe Jansi jar has to be in the web container’s classpathを意味します。 Webアプリケーションで問題が発生するのを避けるため、Log4jは、Log4j 2.10以降の明示的な設定なしでJansiを自動的にロードしようとしなくなりました。

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

  • layoutのドキュメントページには、highlight{pattern}{style}セクションに役立つLog4j2JANSI情報が含まれています。

  • JANSIは出力に色を付けることができますが、Spring Bootのバナー(ネイティブまたはbanner.txtファイルを介してカスタマイズ)は単色のままです

10. 結論

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

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

いつものように、完全なソースコードはover on Githubで利用できます。