ログ
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-10-24T12:02:42.179Z INFO 112052 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : Starting MyApplication using Java 17.0.13 with PID 112052 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2024-10-24T12:02:42.211Z INFO 112052 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : No active profile set, falling back to 1 default profile: "default"
2024-10-24T12:02:45.743Z INFO 112052 --- [myapp] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http)
2024-10-24T12:02:45.764Z INFO 112052 --- [myapp] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-10-24T12:02:45.765Z INFO 112052 --- [myapp] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.31]
2024-10-24T12:02:45.863Z INFO 112052 --- [myapp] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-10-24T12:02:45.869Z INFO 112052 --- [myapp] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3429 ms
2024-10-24T12:02:47.030Z INFO 112052 --- [myapp] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/'
2024-10-24T12:02:47.049Z INFO 112052 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : Started MyApplication in 6.238 seconds (process running for 7.345)
次の項目が出力されます。
日時: ミリ秒単位の精度で簡単にソート可能。
ログレベル:
ERROR
、WARN
、INFO
、DEBUG
、TRACE
プロセス 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)
次の表に、ログレベルと色のマッピングを示します。
レベル | 色 |
---|---|
| 赤 |
| 赤 |
| 黄 |
| 緑 |
| 緑 |
| 緑 |
または、変換のオプションとして使用することにより、使用する色またはスタイルを指定できます。例: テキストを黄色にするには、次の設定を使用します。
%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.file.path
は無視され、logging.file.name
のみが使用されます。
次の表は、logging.*
プロパティを一緒に使用する方法を示しています。
logging.file.name | logging.file.path | 説明 |
---|---|---|
(なし) | (なし) | コンソールのみのロギング。 |
特定のファイル (たとえば、 | (なし) |
|
(なし) | 特定のディレクトリ (たとえば、 |
|
特定のファイル | 特定のディレクトリ |
|
ログファイルは 10MB に達するとローテーションし、コンソール出力と同様に、ERROR
-level、WARN
-level、および INFO
-level メッセージがデフォルトでログに記録されます。
ロギングプロパティは、実際のロギングインフラストラクチャから独立しています。その結果、特定の構成キー(Logback の logback.configurationFile など)は spring Boot によって管理されません。 |
ファイルのローテーション
Logback を使用している場合は、application.properties
または application.yaml
ファイルを使用してログローテーション設定を微調整することができます。他のすべてのロギングシステムでは、ローテーション設定を自分で直接構成する必要があります (たとえば、Log4j2 を使用している場合は、log4j2.xml
または log4j2-spring.xml
ファイルを追加できます)。
次のローテーションポリシープロパティがサポートされています。
名前 | 説明 |
---|---|
| ログアーカイブの作成に使用されるファイル名パターン。 |
| アプリケーションの起動時にログアーカイブのクリーンアップが必要な場合。 |
| アーカイブされる前のログファイルの最大サイズ。 |
| ログアーカイブが削除されるまでにかかる最大サイズ。 |
| 保持するアーカイブログファイルの最大数(デフォルトは 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 |
|
sql |
|
ログシャットダウンフックの使用
アプリケーションの終了時にロギングリソースを解放するために、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 |
|
Log4j2 |
|
JDK (Java Util Logging) |
|
可能な場合、ロギング構成に -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 環境 | システムプロパティ | コメント |
---|---|---|
|
| 例外を記録するときに使用される変換語。 |
|
| 定義されている場合、デフォルトのログ構成で使用されます。 |
|
| 定義されている場合、デフォルトのログ構成で使用されます。 |
|
| コンソール(stdout)で使用するログパターン。 |
|
| ログ日付形式のアペンダーパターン。 |
|
| コンソールログに使用する文字セット。 |
|
| コンソールロギングに使用するログレベルのしきい値。 |
|
| ファイルで使用するログパターン( |
|
| ファイルロギングに使用する文字セット( |
|
| ファイルのロギングに使用するログレベルのしきい値。 |
|
| ログレベルをレンダリングするときに使用する形式(デフォルト |
|
| 現在のプロセス ID(可能な場合、OS 環境変数としてまだ定義されていない場合に検出されます)。 |
Logback を使用する場合、次のプロパティも転送されます。
Spring 環境 | システムプロパティ | コメント |
---|---|---|
|
| ロールオーバーされたログファイル名のパターン(デフォルト |
|
| 起動時にアーカイブログファイルをクリーンアップするかどうか。 |
|
| ログファイルの最大サイズ。 |
|
| 保持するログバックアップの合計サイズ。 |
|
| 保持するアーカイブログファイルの最大数。 |
サポートされているすべてのログシステムは、構成ファイルを解析するときにシステムプロパティを参照できます。例については、spring-boot.jar
のデフォルト構成を参照してください。
ロギングプロパティでプレースホルダーを使用する場合は、基になるフレームワークの構文ではなく、Spring Boot の構文を使用する必要があります。特に、Logback を使用する場合は、 |
|
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 環境が使用可能になる前に使用されます。 |