Spring Bootでログインする
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カラーを取得できます。
ただし、クラスローディングの潜在的な欠点に注意を払う必要があります。
次のような設定でインポートして明示的にアクティブ化する必要があります。
Logback
:<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アプリケーションの場合、これは
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で利用可能]です。