ログ

Spring Boot は、すべての内部ロギングに Commons Logging [Apache] (英語) を使用しますが、基礎となるログ実装はオープンなままです。Java Util Logging (標準 Javadoc) Log4j2 [Apache] (英語) Logback (英語) のデフォルト構成が提供されています。いずれの場合も、ロガーはコンソール出力を使用するように事前設定されており、オプションのファイル出力も利用できます。

デフォルトでは、「スターター」を使用する場合、Logback がロギングに使用されます。Java Util Logging、Commons Logging、Log4J、SLF4J を使用する依存ライブラリがすべて正しく機能することを保証するために、適切な Logback ルーティングも含まれています。

Java には多くのロギングフレームワークがあります。上記のリストがわかりにくい場合でも心配不要です。通常、ロギングの依存関係を変更する必要はなく、Spring Boot のデフォルトは問題なく機能します。
アプリケーションをサーブレットコンテナーまたはアプリケーションサーバーにデプロイする場合、Java Util Logging API を使用して実行されたログはアプリケーションのログにルーティングされません。これにより、コンテナーまたはコンテナーにデプロイされた他のアプリケーションによって実行されたログがアプリケーションのログに表示されなくなります。

ログ形式

Spring Boot からのデフォルトのログ出力は、次の例のようになります。

2024-06-20T10:08:09.995Z  INFO 111881 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Starting MyApplication using Java 17.0.11 with PID 111881 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2024-06-20T10:08:10.009Z  INFO 111881 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : No active profile set, falling back to 1 default profile: "default"
2024-06-20T10:08:15.428Z  INFO 111881 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-06-20T10:08:15.472Z  INFO 111881 --- [myapp] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-06-20T10:08:15.472Z  INFO 111881 --- [myapp] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.25]
2024-06-20T10:08:15.674Z  INFO 111881 --- [myapp] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-06-20T10:08:15.677Z  INFO 111881 --- [myapp] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5327 ms
2024-06-20T10:08:17.620Z  INFO 111881 --- [myapp] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-06-20T10:08:17.666Z  INFO 111881 --- [myapp] [           main] o.s.b.d.f.logexample.MyApplication       : Started MyApplication in 10.202 seconds (process running for 12.125)

次の項目が出力されます。

  • 日時: ミリ秒単位の精度で簡単にソート可能。

  • ログレベル: ERRORWARNINFODEBUGTRACE

  • プロセス ID。

  • 実際のログメッセージの開始を区別する --- セパレータ。

  • アプリケーション名: 角括弧 に囲まれています (spring.application.name が設定されている場合のみデフォルトでログに記録されます)

  • スレッド名: 角括弧で囲まれています(コンソール出力では切り捨てられる場合があります)。

  • 相関 ID: トレースが有効な場合 (上のサンプルには示されていません)

  • ロガー名: これは通常、ソースクラス名です(多くの場合省略されます)。

  • ログメッセージ。

Logback には FATAL レベルはありません。ERROR にマップされます。
spring.application.name プロパティがあるがログに記録したくない場合は、logging.include-application-name を false に設定できます。

コンソール出力

デフォルトのログ構成では、メッセージが書き込まれるとコンソールにエコーされます。デフォルトでは、ERROR -level、WARN -level、および INFO -level メッセージがログに記録されます。--debug フラグを使用してアプリケーションを起動することにより、「デバッグ」モードを有効にすることもできます。

$ java -jar myapp.jar --debug
application.properties で debug=true を指定することもできます。

デバッグモードを有効にすると、コアロガー(埋め込みコンテナー、Hibernate、Spring Boot)の選択がより多くの情報を出力するように構成されます。デバッグモードを有効にしても、DEBUG レベルのすべてのメッセージをログに記録するようにアプリケーションが設定されるわけではありませ

または、--trace フラグ(または application.properties の trace=true)を使用してアプリケーションを開始することにより、「トレース」モードを有効にすることができます。これにより、選択されたコアロガー(埋め込みコンテナー、Hibernate スキーマ生成、Spring ポートフォリオ全体)のトレースログが有効になります。

色分けされた出力

ターミナルが ANSI をサポートしている場合は、読みやすくするためにカラー出力が使用されます。spring.output.ansi.enabled をサポートされている値 (Javadoc) に設定して、自動検出をオーバーライドできます。

カラーコーディングは、%clr 変換ワードを使用して構成されます。最も単純な形式では、次の例に示すように、コンバーターはログレベルに従って出力に色を付けます。

%clr(%5p)

次の表に、ログレベルと色のマッピングを示します。

レベル

FATAL

ERROR

WARN

INFO

DEBUG

TRACE

または、変換のオプションとして使用することにより、使用する色またはスタイルを指定できます。例: テキストを黄色にするには、次の設定を使用します。

%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}){yellow}

次の色とスタイルがサポートされています。

  • blue

  • cyan

  • faint

  • green

  • magenta

  • red

  • yellow

ファイル出力

デフォルトでは、Spring Boot はコンソールにのみログを記録し、ログファイルを書き込みません。コンソール出力に加えてログファイルを書き込む場合は、logging.file.name または logging.file.path プロパティを設定する必要があります(たとえば、application.properties で)。

次の表は、logging.* プロパティを一緒に使用する方法を示しています。

表 1: ロギングプロパティ
logging.file.namelogging.file.path サンプル 説明

(なし)

(なし)

コンソールのみのロギング。

特定のファイル

(なし)

my.log

指定されたログファイルに書き込みます。名前は、正確な場所でも、現在のディレクトリからの相対名でもかまいません。

(なし)

特定のディレクトリ

/var/log

指定されたディレクトリに spring.log を書き込みます。名前は、正確な場所でも、現在のディレクトリからの相対名でもかまいません。

ログファイルは 10MB に達するとローテーションし、コンソール出力と同様に、ERROR -level、WARN -level、および INFO -level メッセージがデフォルトでログに記録されます。

ロギングプロパティは、実際のロギングインフラストラクチャから独立しています。その結果、特定の構成キー(Logback の logback.configurationFile など)は spring Boot によって管理されません。

ファイルのローテーション

Logback を使用している場合は、application.properties または application.yaml ファイルを使用してログローテーション設定を微調整することができます。他のすべてのロギングシステムでは、ローテーション設定を自分で直接構成する必要があります (たとえば、Log4j2 を使用している場合は、log4j2.xml または log4j2-spring.xml ファイルを追加できます)。

次のローテーションポリシープロパティがサポートされています。

名前 説明

logging.logback.rollingpolicy.file-name-pattern

ログアーカイブの作成に使用されるファイル名パターン。

logging.logback.rollingpolicy.clean-history-on-start

アプリケーションの起動時にログアーカイブのクリーンアップが必要な場合。

logging.logback.rollingpolicy.max-file-size

アーカイブされる前のログファイルの最大サイズ。

logging.logback.rollingpolicy.total-size-cap

ログアーカイブが削除されるまでにかかる最大サイズ。

logging.logback.rollingpolicy.max-history

保持するアーカイブログファイルの最大数(デフォルトは 7)。

ログレベル

サポートされているすべてのロギングシステムでは、level が TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF のいずれかである logging.level.<logger-name>=<level> を使用して、Spring Environment (たとえば application.properties)にロガーレベルを設定できます。root ロガーは、logging.level.root を使用して構成できます。

次の例は、application.properties の潜在的なロギング設定を示しています。

  • プロパティ

  • YAML

logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"

環境変数を使用してログレベルを設定することもできます。例: LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG は org.springframework.web を DEBUG に設定します。

上記のアプローチは、パッケージレベルのロギングでのみ機能します。緩いバインディングは常に環境変数を小文字に変換するため、この方法で個々のクラスのログを構成することはできません。クラスのログを構成する必要がある場合は、SPRING_APPLICATION_JSON 変数を使用できます。

ロググループ

関連するロガーをグループ化して、すべてを同時に構成できると便利なことがよくあります。例: Tomcat 関連のすべてのロガーのログレベルを一般的に変更する可能性がありますが、トップレベルのパッケージを簡単に覚えることはできません。

これを支援するために、Spring Boot では、Spring Environment でロギンググループを定義できます。例: application.properties に "tomcat" グループを追加して定義する方法は次のとおりです。

  • プロパティ

  • YAML

logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
logging:
  group:
    tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"

定義したら、グループ内のすべてのロガーのレベルを 1 行で変更できます。

  • プロパティ

  • YAML

logging.level.tomcat=trace
logging:
  level:
    tomcat: "trace"

Spring Boot には、すぐに使用できる次の事前定義されたロギンググループが含まれています。

名前 ロガー

web

org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans

sql

org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

ログシャットダウンフックの使用

アプリケーションの終了時にロギングリソースを解放するために、JVM の終了時にログシステムのクリーンアップをトリガーするシャットダウンフックが提供されています。このシャットダウンフックは、アプリケーションが war ファイルとしてデプロイされていない限り、自動的に登録されます。アプリケーションに複雑なコンテキスト階層がある場合、シャットダウンフックがニーズを満たさない可能性があります。そうでない場合は、シャットダウンフックを無効にして、基盤となるロギングシステムによって直接提供されるオプションを調べましょう。例: Logback は、各ロガーを独自のコンテキストで作成できるようにするコンテキストセレクターを提供 (英語) します。 logging.register-shutdown-hook プロパティを使用して、シャットダウンフックを無効にすることができます。false に設定すると、登録が無効になります。プロパティは、application.properties または application.yaml ファイルで設定できます。

  • プロパティ

  • YAML

logging.register-shutdown-hook=false
logging:
  register-shutdown-hook: false

カスタムログ設定

さまざまなロギングシステムは、クラスパスに適切なライブラリを含めることでアクティブにでき、クラスパスのルートまたは次の Spring Environment プロパティで指定された場所に適切な構成ファイルを提供することでさらにカスタマイズできます: logging.config

org.springframework.boot.logging.LoggingSystem システムプロパティを使用して、Spring Boot に特定のログシステムを強制的に使用させることができます。値は、LoggingSystem 実装の完全修飾クラス名でなければなりません。none の値を使用して、Spring Boot のログ設定を完全に無効にすることもできます。

ApplicationContext が作成される前にロギングが初期化されるため、Spring @Configuration ファイルの @PropertySources からのロギングを制御することはできません。ロギングシステムを変更または完全に無効にする唯一の方法は、システムプロパティを使用することです。

ロギングシステムに応じて、次のファイルがロードされます。

ロギングシステム カスタム

Logback

logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy

Log4j2

log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)

logging.properties

可能な場合、ロギング構成に -spring バリアントを使用することをお勧めします(たとえば、logback.xml ではなく logback-spring.xml)。標準の構成場所を使用する場合、Spring はログの初期化を完全に制御できません。
Java Util Logging には、「実行可能な jar」から実行するときに課題を引き起こす既知のクラスローディングの課題があります。「実行可能な jar」から実行する場合は、可能な限り回避することをお勧めします。

カスタマイズを容易にするために、他のいくつかのプロパティが Spring Environment からシステムプロパティに転送されます。これにより、システム構成のログ記録によってプロパティを使用できるようになります。例: 環境変数として application.properties または LOGGING_FILE_NAME に logging.file.name を設定すると、LOG_FILE システムプロパティが設定されます。転送されるプロパティについては、次の表で説明します。

Spring 環境 システムプロパティ コメント

logging.exception-conversion-word

LOG_EXCEPTION_CONVERSION_WORD

例外を記録するときに使用される変換語。

logging.file.name

LOG_FILE

定義されている場合、デフォルトのログ構成で使用されます。

logging.file.path

LOG_PATH

定義されている場合、デフォルトのログ構成で使用されます。

logging.pattern.console

CONSOLE_LOG_PATTERN

コンソール(stdout)で使用するログパターン。

logging.pattern.dateformat

LOG_DATEFORMAT_PATTERN

ログ日付形式のアペンダーパターン。

logging.charset.console

CONSOLE_LOG_CHARSET

コンソールログに使用する文字セット。

logging.threshold.console

CONSOLE_LOG_THRESHOLD

コンソールロギングに使用するログレベルのしきい値。

logging.pattern.file

FILE_LOG_PATTERN

ファイルで使用するログパターン(LOG_FILE が有効な場合)。

logging.charset.file

FILE_LOG_CHARSET

ファイルロギングに使用する文字セット(LOG_FILE が有効になっている場合)。

logging.threshold.file

FILE_LOG_THRESHOLD

ファイルのロギングに使用するログレベルのしきい値。

logging.pattern.level

LOG_LEVEL_PATTERN

ログレベルをレンダリングするときに使用する形式(デフォルト %5p)。

PID

PID

現在のプロセス ID(可能な場合、OS 環境変数としてまだ定義されていない場合に検出されます)。

Logback を使用する場合、次のプロパティも転送されます。

Spring 環境 システムプロパティ コメント

logging.logback.rollingpolicy.file-name-pattern

LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN

ロールオーバーされたログファイル名のパターン(デフォルト ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)。

logging.logback.rollingpolicy.clean-history-on-start

LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START

起動時にアーカイブログファイルをクリーンアップするかどうか。

logging.logback.rollingpolicy.max-file-size

LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE

ログファイルの最大サイズ。

logging.logback.rollingpolicy.total-size-cap

LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP

保持するログバックアップの合計サイズ。

logging.logback.rollingpolicy.max-history

LOGBACK_ROLLINGPOLICY_MAX_HISTORY

保持するアーカイブログファイルの最大数。

サポートされているすべてのログシステムは、構成ファイルを解析するときにシステムプロパティを参照できます。例については、spring-boot.jar のデフォルト構成を参照してください。

ロギングプロパティでプレースホルダーを使用する場合は、基になるフレームワークの構文ではなく、Spring Boot の構文を使用する必要があります。特に、Logback を使用する場合は、: をプロパティ名とそのデフォルト値の間の区切り文字として使用し、:- は使用しないでください。

LOG_LEVEL_PATTERN (または Logback で logging.pattern.level)のみをオーバーライドすることにより、MDC およびその他のアドホックコンテンツをログ行に追加できます。例: logging.pattern.level=user:%X{user} %5p を使用する場合、デフォルトのログ形式には、次の例に示すように、"user" の MDC エントリが含まれます(存在する場合)。

2019-08-30 12:30:04.031 user:someone INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request

Logback 拡張

Spring Boot には、高度な構成に役立つ Logback の拡張機能が多数含まれています。これらの拡張機能を logback-spring.xml 構成ファイルで使用できます。

標準の logback.xml 構成ファイルのロードが早すぎるため、拡張機能を使用できません。logback-spring.xml を使用するか、logging.config プロパティを定義する必要があります。
拡張は Logback の構成スキャンで (英語) は使用できません。設定しようとすると、構成ファイルに変更を加えると、次のいずれかのエラーがログに記録されます。
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

プロファイル固有の構成

<springProfile> タグを使用すると、アクティブな Spring プロファイルに基づいて、オプションで構成のセクションを含めたり除外したりできます。プロファイルセクションは、<configuration> 要素内のどこでもサポートされます。name 属性を使用して、構成を受け入れるプロファイルを指定します。<springProfile> タグには、プロファイル名 ( staging など) またはプロファイル式を含めることができます。プロファイル式を使用すると、production & (eu-central | eu-west) など、より複雑なプロファイルロジックを表現できます。詳細については、Spring Framework リファレンスガイドを確認してください。次のリストは、3 つのサンプルプロファイルを示しています。

<springProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev | staging">
	<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
	<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

環境プロパティ

<springProperty> タグを使用すると、Spring から Environment のプロパティを公開して、Logback 内で使用できます。これは、Logback 構成の application.properties ファイルの値にアクセスする場合に役立ちます。このタグは、Logback の標準 <property> タグと同様に機能します。ただし、直接 value を指定するのではなく、プロパティの source を(Environment から)指定します。local スコープ以外の場所にプロパティを保存する必要がある場合は、scope 属性を使用できます。フォールバック値が必要な場合(プロパティが Environment に設定されていない場合)、defaultValue 属性を使用できます。次の例は、Logback 内で使用するプロパティを公開する方法を示しています。

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
		defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
	<remoteHost>${fluentHost}</remoteHost>
	...
</appender>
source は、ケバブの場合(my.property-name など)で指定する必要があります。ただし、緩和されたルールを使用して、Environment にプロパティを追加できます。

Log4j2 拡張機能

Spring Boot には、高度な構成に役立つ Log4j2 の拡張機能が多数含まれています。これらの拡張子は、任意の log4j2-spring.xml 構成ファイルで使用できます。

標準の log4j2.xml 構成ファイルのロードが早すぎるため、拡張機能を使用できません。log4j2-spring.xml を使用するか、logging.config プロパティを定義する必要があります。
拡張機能は、Log4J によって提供される Spring Boot サポート [Apache] (英語) に取って代わります。ビルドに org.apache.logging.log4j:log4j-spring-boot モジュールを含めないようにしてください。

プロファイル固有の構成

<SpringProfile> タグを使用すると、アクティブな Spring プロファイルに基づいて、オプションで構成のセクションを含めたり除外したりできます。プロファイルセクションは、<Configuration> 要素内のどこでもサポートされます。name 属性を使用して、構成を受け入れるプロファイルを指定します。<SpringProfile> タグには、プロファイル名 ( staging など) またはプロファイル式を含めることができます。プロファイル式を使用すると、production & (eu-central | eu-west) など、より複雑なプロファイルロジックを表現できます。詳細については、Spring Framework リファレンスガイドを確認してください。次のリストは、3 つのサンプルプロファイルを示しています。

<SpringProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active -->
</SpringProfile>

<SpringProfile name="dev | staging">
	<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</SpringProfile>

<SpringProfile name="!production">
	<!-- configuration to be enabled when the "production" profile is not active -->
</SpringProfile>

環境プロパティのルックアップ

Log4j2 構成内で Spring Environment からプロパティを参照する場合は、spring: プレフィックス付きルックアップ [Apache] (英語) を使用できます。これは、Log4j2 構成の application.properties ファイルから値にアクセスする場合に役立ちます。

次の例は、Spring Environment から spring.application.name を読み取る applicationName という名前の Log4j2 プロパティを設定する方法を示しています。

<Properties>
	<Property name="applicationName">${spring:spring.application.name}</Property>
</Properties>
ルックアップキーはケバブケース ( my.property-name など) で指定する必要があります。

Log4j2 システムプロパティ

Log4j2 は、さまざまな項目の構成に使用できる多数のシステムプロパティ [Apache] (英語) をサポートしています。例: log4j2.skipJansi システムプロパティを使用して、ConsoleAppender が Windows でジャンシ [GitHub] (英語) 出力ストリームを使用しようとするかどうかを構成できます。

Log4j2 の初期化後に読み込まれるすべてのシステムプロパティは、Spring Environment から取得できます。例: log4j2.skipJansi=false を application.properties ファイルに追加して、ConsoleAppender が Windows で Jansi を使用するようにすることができます。

Spring Environment は、システムプロパティと OS 環境変数にロードされる値が含まれていない場合にのみ考慮されます。
初期の Log4j2 初期化中にロードされるシステムプロパティは、Spring Environment を参照できません。例: デフォルトの Log4j2 実装を選択できるようにするために Log4j2 が使用するプロパティは、Spring 環境が使用可能になる前に使用されます。