- Spring
Spring Bootログ設定|logback-spring.xml全文と設定対応表
Spring Boot のログ設定は、application.yml の logging.* プロパティで書く方法と、logback-spring.xml で書く方法の2つがあり、レベル・出力先・ローテーション・JSON 出力まではプロパティだけで設定できます。 プロファイルごとに出力先の構成そのものを変えたいときや、独自の appender を足したいときに logback-spring.xml を使います。
この記事では、logback-spring.xml の全文テンプレート、同じ内容を application.yml だけで書いた版、logging.* プロパティと XML 要素の対応表、どちらを使うかの判断表、構造化ログ3形式とロググループをまとめます。SLF4J の書き方や Logback 単体の設定は扱わず、Spring Boot 固有の部分に絞っています。
確認環境:Spring Boot 4.1.1 の公式リファレンスで確認(2026年10月7日)。Logback 単体で再現できる部分は Java 21(OpenJDK 21.0.10)と Logback 1.2.11 で、JSON の読み取りは Python 3.11.15 で実行しています。
Spring Bootログ設定の早見表
| やりたいこと | 設定(application.yml のキー) | XMLが要るか |
|---|---|---|
| レベルを変える | logging.level.<ロガー名> |
不要 |
| まとめてレベルを変える | logging.group.<名前> と logging.level.<名前> |
不要 |
| ファイルに出す | logging.file.name または logging.file.path |
不要 |
| ローテーションを決める | logging.logback.rollingpolicy.* |
不要 |
| コンソール出力を止める | logging.console.enabled: false |
不要 |
| 出力の形を変える | logging.pattern.console/file |
不要 |
| JSON で出す | logging.structured.format.console/file |
不要 |
| プロファイルで値を変える | spring.config.activate.on-profile で分ける |
不要 |
| プロファイルで appender の構成を変える | <springProfile> |
要る |
| 独自の appender・フィルタを足す | <appender>・<filter> |
要る |
設定ファイルの名前は logback.xml ではなく logback-spring.xml にします。公式リファレンスは「可能な限り -spring の付いた名前を使う。標準の場所を使うと、Spring がログの初期化を完全には制御できない」と説明しています。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Spring Bootログ設定|logback-spring.xml全文と設定対応表」
Spring Bootのログの既定の動き
公式リファレンス(4.1.1)に書かれている既定の動きです。
| 項目 | 既定の動き |
|---|---|
| ログの仕組み | starter を使うと Logback |
| 出力先 | コンソールのみ。ファイルには書かない |
| 出力されるレベル | ERROR・WARN・INFO |
| ファイルのローテーション | 10 MB に達したら切り替え |
| 残す世代 | 7 |
| 文字コード(Boot 4) | ファイルは UTF-8。コンソールは Console#charset() が使えればそれ、なければ UTF-8 |
公式リファレンスに載っている既定の出力例です(先頭2行)。
2026-08-17T10:51:28.508Z INFO 11390 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : Starting MyApplication using Java 25.0.4 with PID 11390 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2026-08-17T10:51:28.527Z INFO 11390 --- [myapp] [ main] o.s.b.d.f.logexample.MyApplication : No active profile set, falling back to 1 default profile: "default"
左から順に、日時(ISO-8601、ミリ秒まで)、レベル、プロセス ID、区切りの ---、アプリ名(spring.application.name を設定した場合)、スレッド名、ロガー名、メッセージです。spring.application.group を設定するとアプリのグループ名が、トレーシングを有効にすると相関 ID も加わります。
logback-spring.xmlの全文テンプレート
開発中(prod 以外)はコンソールに詳しく、prod ではファイルにローテーションつきで出す構成です。src/main/resources/logback-spring.xml として置きます。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- Spring Boot が用意している既定値(CONSOLE_LOG_PATTERN、FILE_LOG_PATTERN など) -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- application.yml の値を Logback の変数として取り込む -->
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="app"/>
<springProperty scope="context" name="logDir" source="app.log.dir" defaultValue="logs"/>
<!-- コンソール出力 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${CONSOLE_LOG_CHARSET:-UTF-8}</charset>
</encoder>
</appender>
<!-- ファイル出力(日付とサイズでローテーション) -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${appName}.log</file>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${FILE_LOG_CHARSET:-UTF-8}</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${appName}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- prod 以外(dev やプロファイル指定なし): コンソールに詳しく出す -->
<springProfile name="!prod">
<logger name="com.example.shop" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!-- prod: ファイルに出す -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
合わせて使う application.yml です。<springProperty> の source に書いたキーがここから読まれます。
spring:
application:
name: shop
app:
log:
dir: logs
テンプレートの読み方
| 部分 | 役割 |
|---|---|
<include resource=".../defaults.xml"/> |
Spring Boot の既定値(変換ルール、パターンの変数、よく使うロガーの設定)を取り込む |
<springProperty> |
Spring の設定値を Logback の変数にする。source は kebab-case で書く |
defaultValue |
設定値が無いときの代わりの値 |
${CONSOLE_LOG_PATTERN} |
既定のコンソール用パターン。logging.pattern.console を設定するとその値になる |
${FILE_LOG_CHARSET:-UTF-8} |
:- の右は、変数が無いときの値 |
<springProfile name="!prod"> |
prod プロファイルが有効でないときだけ使われる |
<springProfile name="prod"> |
prod プロファイルが有効なときだけ使われる |
<springProfile> の name には、公式リファレンスにある次の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>
<springProfile> は <configuration> の中ならどこにでも書けます。
テンプレートのうち Logback 標準の部分(appender・ローテーション・文字コード)は、Logback 1.2.11 単体に読ませてエラーが出ないことと、logs/app.log が作られることを確かめています。
最小の書き方(Bootの部品をincludeする)
appender を自分で書かず、Spring Boot が用意している部品を取り込む書き方です。公式 How-to の例をそのまま載せます。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
取り込める部品は次の6つです(org/springframework/boot/logging/logback/ の下)。
| ファイル | 内容 |
|---|---|
defaults.xml |
変換ルール、パターンの変数、よく使うロガーの設定 |
console-appender.xml |
CONSOLE_LOG_PATTERN を使う ConsoleAppender |
structured-console-appender.xml |
構造化ログ形式の ConsoleAppender |
file-appender.xml |
FILE_LOG_PATTERN を使う RollingFileAppender |
structured-file-appender.xml |
構造化ログ形式の RollingFileAppender |
base.xml |
以前の版との互換のために残されているもの |
同じ内容をapplication.ymlだけで書く
上のテンプレートと同じ「prod 以外はコンソール、prod はファイル+ローテーション」を、XML なしで書いた版です。--- で区切った2つ目のブロックは、prod プロファイルのときだけ有効になります。
# すべてのプロファイルに共通
spring:
application:
name: shop
logging:
level:
root: info
com.example.shop: debug
---
# prod プロファイルのときだけ有効
spring:
config:
activate:
on-profile: prod
logging:
level:
com.example.shop: info
console:
enabled: false
file:
name: logs/shop.log
logback:
rollingpolicy:
file-name-pattern: logs/shop.%d{yyyy-MM-dd}.%i.log.gz
max-file-size: 10MB
max-history: 30
total-size-cap: 1GB
| テンプレートの部分 | application.yml での書き方 |
|---|---|
<springProfile name="prod"> |
spring.config.activate.on-profile: prod |
<file> |
logging.file.name |
<fileNamePattern> |
logging.logback.rollingpolicy.file-name-pattern |
<maxFileSize> |
logging.logback.rollingpolicy.max-file-size |
<maxHistory> |
logging.logback.rollingpolicy.max-history |
<totalSizeCap> |
logging.logback.rollingpolicy.total-size-cap |
| prod で CONSOLE を付けない | logging.console.enabled: false |
<logger name="..." level="DEBUG"/> |
logging.level.<ロガー名>: debug |
この範囲であれば、application.yml だけで同じ構成になります。 application-prod.yml のようにプロファイルごとのファイルに分ける書き方もあり、その場合はプロファイル用のファイルの値が共通のファイルの値より優先されます。
logging.*プロパティの一覧とXMLとの対応
既定値は、公式リファレンスの Logging の章に書かれているものだけを載せ、記載のないものは「—」としています。「変数名」は、Spring Boot がプロパティの値を渡すときのシステムプロパティ名で、logback-spring.xml の中で ${変数名} として参照できます。
出力先とレベル
| プロパティ | 既定 | 意味 | XMLでの書き方 |
|---|---|---|---|
logging.file.name |
なし | ログファイル名(絶対・相対パス) | <file>、変数 LOG_FILE |
logging.file.path |
なし | ログの置き場所。spring.log に書く |
変数 LOG_PATH |
logging.level.<名前> |
INFO 以上 | ロガーごとのレベル | <logger level>/<root level> |
logging.group.<名前> |
web・sql |
ロガーをまとめて名前を付ける | —(Boot の機能) |
logging.console.enabled |
有効 | false でコンソール出力を止める |
<appender-ref> を付けない |
logging.threshold.console |
— | コンソールに出す最低レベル | ThresholdFilter、CONSOLE_LOG_THRESHOLD |
logging.threshold.file |
— | ファイルに出す最低レベル | ThresholdFilter、FILE_LOG_THRESHOLD |
logging.config |
— | ログ設定ファイルの場所 | — |
debug/trace |
false | 主要なロガーだけ詳しくする | — |
logging.file.name と logging.file.path の組み合わせは次のとおりです。
| file.name | file.path | 動き |
|---|---|---|
| なし | なし | コンソールのみ |
my.log など |
なし | 指定したファイルに書く |
| なし | /var/log など |
そのフォルダの spring.log に書く |
| あり | あり | file.name が使われ、file.path は使われない |
レベルに指定できる値は TRACE・DEBUG・INFO・WARN・ERROR・FATAL・OFF です。Logback には FATAL が無いため、ERROR として扱われます。環境変数でも LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG のように指定できますが、これはパッケージ単位の指定に限られます。
--debug(または debug=true)は、組み込みコンテナ・Hibernate・Spring Boot など主要なロガーを詳しくするもので、アプリ全体を DEBUG にする設定ではありません。
パターンと文字コード
| プロパティ | 既定 | 意味 | XMLでの書き方 |
|---|---|---|---|
logging.pattern.console |
Boot の既定 | コンソールの出力パターン | <pattern>、CONSOLE_LOG_PATTERN |
logging.pattern.file |
Boot の既定 | ファイルの出力パターン | <pattern>、FILE_LOG_PATTERN |
logging.pattern.level |
%5p |
レベル部分の書式 | LOG_LEVEL_PATTERN |
logging.pattern.dateformat |
ISO-8601 | 日時部分の書式 | LOG_DATEFORMAT_PATTERN |
logging.pattern.correlation |
— | 相関 ID の書式(トレーシング時) | — |
logging.charset.console |
上の表のとおり | コンソールの文字コード | <charset>、CONSOLE_LOG_CHARSET |
logging.charset.file |
UTF-8 | ファイルの文字コード | <charset>、FILE_LOG_CHARSET |
logging.exception-conversion-word |
— | 例外を出すときの変換指定子 | LOG_EXCEPTION_CONVERSION_WORD |
logging.include-application-name |
出す | false でアプリ名を出さない |
パターンから外す |
logging.include-application-group |
出す | false でグループ名を出さない |
パターンから外す |
spring.output.ansi.enabled |
自動判定 | 色付けの有無(ALWAYS など) |
%clr(...) |
ローテーション(Logback)
| プロパティ | 既定 | 意味 | XMLでの要素 |
|---|---|---|---|
...rollingpolicy.file-name-pattern |
${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
切り替え後のファイル名 | <fileNamePattern> |
...rollingpolicy.max-file-size |
10 MB | 切り替えるサイズ | <maxFileSize> |
...rollingpolicy.max-history |
7 | 残す世代の数 | <maxHistory> |
...rollingpolicy.total-size-cap |
— | 過去ログ全体の上限 | <totalSizeCap> |
...rollingpolicy.clean-history-on-start |
— | 起動時に過去ログを整理するか | <cleanHistoryOnStart> |
... は logging.logback の省略です。変数名は LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN のように、プロパティ名を大文字とアンダースコアにしたものです。Log4j2 を使う場合は logging.log4j2.rollingpolicy.*(strategy・cron・time-interval など)が別に用意されています。
構造化ログ
| プロパティ | 意味 |
|---|---|
logging.structured.format.console |
コンソールの形式(ecs・gelf・logstash、または自作クラス名) |
logging.structured.format.file |
ファイルの形式(同上) |
logging.structured.ecs.service.name |
サービス名。既定は spring.application.name |
logging.structured.ecs.service.version |
版。既定は spring.application.version |
logging.structured.ecs.service.environment |
環境名 |
logging.structured.ecs.service.node-name |
ノード名 |
logging.structured.gelf.host |
ホスト名。既定は spring.application.name |
logging.structured.gelf.service.version |
版。既定は spring.application.version |
logging.structured.json.include/exclude |
出す項目・出さない項目を選ぶ |
logging.structured.json.rename |
項目名を変える |
logging.structured.json.add |
固定の項目を足す |
logging.structured.json.customizer |
自作のカスタマイザを指定する |
logging.structured.json.stacktrace.root |
last(Java と同じ並び)か first |
logging.structured.json.stacktrace.max-length |
スタックトレースの最大長 |
logging.structured.json.stacktrace.max-throwable-depth |
1つのトレースで出すフレーム数の上限 |
logging.structured.json.stacktrace.include-common-frames |
共通のフレームを含めるか |
logging.structured.json.stacktrace.include-hashes |
トレースのハッシュを含めるか |
logging.structured.json.stacktrace.printer |
出力方法を自作クラスに任せる |
XML で構造化ログを書く場合は、encoder に Spring Boot の StructuredLogEncoder を指定します(公式リファレンスの例)。
<encoder class="org.springframework.boot.logging.logback.StructuredLogEncoder">
<format>${CONSOLE_LOG_STRUCTURED_FORMAT}</format>
<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>
自分で appender を書いた logback-spring.xml では、logging.file.name などの値は自動では反映されません。 ${LOG_FILE} のように対応する変数を XML の中で参照したときに、プロパティの値が使われます。
プロパティで足りる場合とXMLが要る場合
| やりたいこと | プロパティ | logback-spring.xml |
|---|---|---|
| レベルの変更、ロググループ | 足りる | — |
| ファイル出力とローテーション | 足りる | — |
| コンソールとファイルで違う最低レベル | 足りる(threshold) |
— |
| JSON(ecs・gelf・logstash)で出す | 足りる | — |
| プロファイルごとに値を変える | 足りる(on-profile) |
— |
| ファイルを2つ以上に分けて出す | — | 要る |
| 特定のロガーだけ別のファイルへ | — | 要る |
| 独自の appender・フィルタ・レイアウト | — | 要る |
| プロファイルごとに appender の構成を変える | — | 要る(<springProfile>) |
| ログの送信先を設定値から決める | — | 要る(<springProperty>) |
公式 How-to も、プロパティで足りない細かな調整(独自の appender など)にはログの仕組みそのものの設定ファイルが必要、と説明しています。まずプロパティで書き、足りなくなった時点で logback-spring.xml を足す順番が手間のかからない進め方です。
知っておくとよい点がもう1つあります。ログは ApplicationContext が作られる前に初期化されるため、@Configuration クラスの @PropertySource で読み込んだ値ではログを制御できません。ログの設定は application.yml、環境変数、起動時の引数に書きます。
logback.xmlに書いてspringProfileが効かない例
直す前
次の内容を logback.xml という名前で置いた場合です。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<springProfile name="prod">
<root level="WARN">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
</configuration>
公式リファレンスには「標準の logback.xml は読み込まれるのが早すぎるため、その中では拡張機能を使えない。logback-spring.xml を使うか、logging.config プロパティを指定する」とあります。Logback 自身は <springProfile> というタグを知らないためです。
このファイルを Logback 1.2.11 単体に読ませて、log.info(...) と log.debug(...) を1回ずつ呼んだときの出力です。
22:35:09,190 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
22:35:09,261 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@9:31 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
22:35:09,261 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@10:29 - no applicable action for [root], current ElementPath is [[configuration][springProfile][root]]
22:35:09,261 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@11:42 - no applicable action for [appender-ref], current ElementPath is [[configuration][springProfile][root][appender-ref]]
…(省略)…
22:35:09,262 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
<springProfile> とその中身がまるごと読み飛ばされ、root に appender が付かないので、アプリのログは1行も出ませんでした。 公式リファレンスにも、同じ形のメッセージが例として載っています。
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]]
直した後
| 直し方 | すること |
|---|---|
| ファイル名を変える | logback.xml を logback-spring.xml に変える(中身はそのまま) |
| 場所を指定する | 別の名前のまま使うなら logging.config でファイルの場所を指定する |
| scan を外す | <configuration scan="true"> を使っている場合は外す |
git mv src/main/resources/logback.xml src/main/resources/logback-spring.xml
3つ目は、公式リファレンスに「拡張機能は Logback の設定ファイルの自動再読み込み(configuration scanning)とは併用できない」とあるためです。
| 確認すること | 見るところ |
|---|---|
ファイル名が logback-spring.xml か |
src/main/resources の直下 |
no applicable action for [springProfile] が出ていないか |
起動直後のコンソール |
| プロファイル名が合っているか | spring.profiles.active と name 属性 |
source が kebab-case か |
my.property-name の形 |
構造化ログ3形式の設定と使い分け
構造化ログは、ログを決まった形(JSON)で出して機械で読みやすくする方法です。Spring Boot は ecs・gelf・logstash の3形式を標準で持ち、プロパティ1行で切り替えられます。
spring:
application:
name: shop
version: 1.0.0
logging:
structured:
format:
console: ecs # ecs / gelf / logstash のいずれか
ecs:
service:
environment: prod
node-name: shop-1
json:
add:
team: platform
stacktrace:
root: first
max-length: 2048
---
spring:
config:
activate:
on-profile: file-json
logging:
file:
name: logs/shop.json
structured:
format:
file: logstash
1つ目のブロックはコンソールを ecs 形式にし、環境名・ノード名・固定の項目 team を足して、スタックトレースを原因が先に来る並びにしています。2つ目のブロックは file-json プロファイルのときに、ファイルへ logstash 形式で出す例です。コンソールとファイルで別の形式を選べます。
公式リファレンスの出力例
ecs
{"@timestamp":"2024-01-01T10:15:00.067462556Z","log":{"level":"INFO","logger":"org.example.Application"},"process":{"pid":39599,"thread":{"name":"main"}},"service":{"name":"simple"},"message":"No active profile set, falling back to 1 default profile: \"default\"","ecs":{"version":"8.11"}}
gelf
{"version":"1.1","short_message":"No active profile set, falling back to 1 default profile: \"default\"","timestamp":1725958035.857,"level":6,"_level_name":"INFO","_process_pid":47649,"_process_thread_name":"main","_log_logger":"org.example.Application"}
logstash
{"@timestamp":"2024-01-01T10:15:00.111037681+02:00","@version":"1","message":"No active profile set, falling back to 1 default profile: \"default\"","logger_name":"org.example.Application","thread_name":"main","level":"INFO","level_value":20000}
同じ情報がどのキーに入るかを調べる
3つの出力例を読み込み、キーを一覧にするスクリプトです。ログを検索するときに、形式ごとのキー名を確かめる用途に使えます。
"""公式リファレンスに載っている3形式のログ1行を読み、同じ情報がどのキーに入るかを並べる。"""
import json
SAMPLES = {
"ecs": r'''{"@timestamp":"2024-01-01T10:15:00.067462556Z","log":{"level":"INFO","logger":"org.example.Application"},"process":{"pid":39599,"thread":{"name":"main"}},"service":{"name":"simple"},"message":"No active profile set, falling back to 1 default profile: \"default\"","ecs":{"version":"8.11"}}''',
"gelf": r'''{"version":"1.1","short_message":"No active profile set, falling back to 1 default profile: \"default\"","timestamp":1725958035.857,"level":6,"_level_name":"INFO","_process_pid":47649,"_process_thread_name":"main","_log_logger":"org.example.Application"}''',
"logstash": r'''{"@timestamp":"2024-01-01T10:15:00.111037681+02:00","@version":"1","message":"No active profile set, falling back to 1 default profile: \"default\"","logger_name":"org.example.Application","thread_name":"main","level":"INFO","level_value":20000}''',
}
def flatten(obj, prefix=""):
for key, value in obj.items():
path = f"{prefix}{key}"
if isinstance(value, dict):
yield from flatten(value, path + ".")
else:
yield path, value
for name, line in SAMPLES.items():
print(f"[{name}]")
for path, value in flatten(json.loads(line)):
text = str(value)
print(f" {path:<24} = {text if len(text) <= 40 else text[:37] + '...'}")
実行結果
[ecs]
@timestamp = 2024-01-01T10:15:00.067462556Z
log.level = INFO
log.logger = org.example.Application
process.pid = 39599
process.thread.name = main
service.name = simple
message = No active profile set, falling back t...
ecs.version = 8.11
[gelf]
version = 1.1
short_message = No active profile set, falling back t...
timestamp = 1725958035.857
level = 6
_level_name = INFO
_process_pid = 47649
_process_thread_name = main
_log_logger = org.example.Application
[logstash]
@timestamp = 2024-01-01T10:15:00.111037681+02:00
@version = 1
message = No active profile set, falling back t...
logger_name = org.example.Application
thread_name = main
level = INFO
level_value = 20000
| 情報 | ecs | gelf | logstash |
|---|---|---|---|
| 日時 | @timestamp |
timestamp(数値) |
@timestamp |
| レベル | log.level |
_level_name、level(数値) |
level、level_value |
| ロガー名 | log.logger |
_log_logger |
logger_name |
| スレッド名 | process.thread.name |
_process_thread_name |
thread_name |
| メッセージ | message |
short_message |
message |
| プロセス ID | process.pid |
_process_pid |
— |
| サービス名 | service.name |
— | — |
「—」は、公式の出力例の1行に含まれていなかった項目です。
使い分け
| 形式 | 正式な名前 | 合う場面 |
|---|---|---|
ecs |
Elastic Common Schema | Elastic 系の基盤に集める。サービス名・環境名も一緒に出したい |
gelf |
Graylog Extended Log Format | Graylog に集める |
logstash |
Logstash JSON | Logstash 形式を受け取る基盤に集める。マーカーを tags として出したい |
どの形式でも、MDC に入れたキーと値は JSON の項目として加わります。 ecs では SLF4J の fluent API の addKeyValue で足した値も出力され、logstash ではマーカーが tags という文字列の配列に入ります。
3形式で合わない場合は、StructuredLogFormatter を実装したクラスを作り、そのクラス名を logging.structured.format.console(または file)に指定します。公式リファレンスの例です。
import ch.qos.logback.classic.spi.ILoggingEvent;
import org.springframework.boot.logging.structured.StructuredLogFormatter;
class MyCustomFormat implements StructuredLogFormatter<ILoggingEvent> {
@Override
public String format(ILoggingEvent event) {
return "time=" + event.getInstant() + " level=" + event.getLevel() + " message=" + event.getMessage() + "\n";
}
}
ロググループ(web・sql)の使い方
ロググループは、関連するロガーに1つの名前を付けて、まとめてレベルを変える仕組みです。Spring Boot には最初から次の2つが定義されています。
| グループ | 含まれるロガー |
|---|---|
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 |
logging:
level:
web: debug # 定義済みグループ: リクエスト処理まわり
sql: debug # 定義済みグループ: 発行される SQL
batch: info
group:
batch: "com.example.shop.batch,org.springframework.batch"
| 調べたいこと | 設定 |
|---|---|
| リクエストがどう処理されたか | logging.level.web: debug |
| どんな SQL が出ているか | logging.level.sql: debug |
| 自分のアプリの一部だけ | logging.group.<名前> で定義して logging.level.<名前> |
パッケージ名を覚えていなくても web・sql の2語で切り替えられるのが便利なところです。調査が終わったら元のレベルに戻しておくと、ログの量を抑えられます。
版ごとの違い
公式のリリースノートと Migration Guide で確認できたものです。
| 版 | 変わったこと |
|---|---|
| 3.4 | 構造化ログ(ecs・gelf・logstash)が加わった |
| 4.0 | logging.console.enabled が加わった。false でコンソール出力を止められる |
| 4.0 | Logback の既定の文字コードが Log4j2 と同じ考え方にそろった。ファイルは UTF-8、コンソールは Console#charset() が使えればそれ、なければ UTF-8 |
Boot 3 から上げるときにログで見直すのは、文字コードを明示していなかった場合の出力と、logging.console.enabled を使ってファイル出力だけにできるようになった点の2つです。
よくある質問
Q. logback.xml と logback-spring.xml のどちらを置けばよいですか?
A. logback-spring.xml です。<springProfile> と <springProperty> はこちらでだけ使え、公式リファレンスも -spring の付いた名前を勧めています。
Q. logging.file.name と logging.file.path を両方書くとどうなりますか?
A. logging.file.name が使われ、logging.file.path は使われません。ファイル名まで決めたいなら name、フォルダだけ決めて spring.log という名前でよければ path を選びます。
Q. --debug を付ければ全部 DEBUG になりますか?
A. なりません。組み込みコンテナ・Hibernate・Spring Boot など主要なロガーが詳しくなるだけです。自分のアプリを DEBUG にするには logging.level.com.example.shop: debug のようにパッケージを指定します。
Q. JSON で出すのに logback-spring.xml は必要ですか?
A. 不要です。logging.structured.format.console: ecs のように1行足せば切り替わります。項目の追加や名前の変更も logging.structured.json.* で設定できます。
まとめ
- レベル・ファイル出力・ローテーション・JSON 出力は
logging.*プロパティだけで設定できる - XML が要るのは、appender の構成そのものを変えるとき。 ファイル名は
logback-spring.xml <springProfile>と<springProperty>はlogback.xmlでは使えない。no applicable actionが出たらファイル名を確かめる- プロパティは
LOG_FILEなどの変数として XML に渡る。 自作の appender では変数を参照して初めて反映される - 構造化ログは
ecs・gelf・logstashの3形式。 集める先に合わせて選び、MDC の値はどの形式でも出る web・sqlのロググループで、関連するロガーをまとめて切り替えられる- Boot 4 ではログファイルの既定の文字コードが UTF-8、コンソール出力は
logging.console.enabledで止められる
参考・出典
いずれも 2026年10月7日に確認しました。
- Spring Boot リファレンス 4.1.1「Logging」: https://docs.spring.io/spring-boot/reference/features/logging.html
- Spring Boot How-to「Logging」: https://docs.spring.io/spring-boot/how-to/logging.html
- Spring Boot リファレンス 4.1.1「Externalized Configuration」: https://docs.spring.io/spring-boot/reference/features/external-config.html
- Spring Boot 4.0 Migration Guide: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide
- Spring Boot 4.0 Release Notes: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Release-Notes
- Spring Boot 3.4 Release Notes: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.4-Release-Notes
- Spring Boot プロジェクトページ: https://spring.io/projects/spring-boot
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Spring Bootログ設定|logback-spring.xml全文と設定対応表」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。