【Spring Boot】ログ出力(Logback)
Logback
Logback はロギングライブラリの 1 つで、Spring Boot にデフォルトで搭載されています。
正確には SLF4J + Logback のセットですが、ここではまとめて Logback としています。
Logger
ログの出力にはLogger
インターフェースを使用します。
Logger
インターフェースは、LoggerFactory
によって生成されます。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestController
public class SampleController {
Logger logger = LoggerFactory.getLogger(SampleController.class);
@GetMapping("sample")
public String get() {
logger.info("access GET sample");
//...
}
}
2021-04-23 10:00:00.235 INFO 28304 --- [nio-8080-exec-2] app.controller.SampleController : access GET sample
ログレベル
Logback には、TRACE
、DEBUG
、INFO
、WARN
、ERROR
の順でログレベルが存在します。
以下がそれぞれの出力例です。
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
Spring Boot では、デフォルトのログレベルにINFO
が設定されているため、TRACE
とDEBUG
は出力されません。
フォーマット
出力メッセージには、{}
を使用したフォーマットの指定ができます。
String name = "taro";
logger.info("name is {}", name); //name is taro
{}
には引数で指定したname
の値が設定されます。
複数ある場合はその数だけ{}
を使用し、対応する値の順に引数を指定します。
String name = "taro";
int age = 20;
logger.info("name is {}. age is {}.", name, age); //name is taro. age is 20.
スタックトレース
例外のスタックトレースを出力したい場合は、例外インスタンスを引数を指定します。
try {
//...
} catch (Exception e) {
logger.error("system error", e);
}
設定
application.yml
(application.properties
)には、以下のログに関するプロパティがあります。
プロパティ | デフォルト値 | 説明 |
---|---|---|
logging.level.root | info | ルートのログレベル |
logging.file.name | ログファイルのパス | |
logging.file.path | ログファイルの出力先フォルダパスlogging.file.name が優先される | |
logging.pattern.dateformat | yyyy-MM-dd HH:mm:ss.SSS | ログの日付フォーマット |
logging.pattern.console | 省略 | コンソール出力における出力パターン |
logging.pattern.file | 省略 | ファイル出力における出力パターン |
logging.logback.rollingpolicy.clean-history-on-start | false | アプリケーションの起動時にアーカイブを削除するかどうか |
logging.logback.rollingpolicy.file-name-pattern | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz | アーカイブファイル名のパターン |
logging.logback.rollingpolicy.max-file-size | 10MB | ログファイルの最大サイズ |
logging.logback.rollingpolicy.max-history | 7 | アーカイブ日数 |
logging.logback.rollingpolicy.total-size-cap | 0B | ログバックアップの合計サイズ |
logging.pattern.console
とlogging.pattern.file
については以下より説明するパターンレイアウトを使用します。
パターンレイアウト
ログの出力パターンは、以下のパターンレイアウトを使用して設定します。
デフォルトでは以下の値が設定されています。
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
変換指定子
日付などの特定の値を表す文字で、%
を先頭に付けます。
以下はよく使いそうなものをピックアップしています。
文字 | 例 | 説明 |
---|---|---|
c , lo , logger | %c , %c{0} | Logger 生成時に指定したクラスまたはロガーの名前 |
d , date | %d{yyyy-MM-dd HH:mm:ss.SS} | 日時 |
m , msg , message | %m | logger.info() などで指定したメッセージ |
n | %n | 改行 |
p , le , level | %p | ログレベル |
replace | %replace(%m){'\s', ''} | 文字の置換 |
%
を含めたい場合は、\%
のようにエスケープします。
書式修飾子
変換指定子の出力する文字数を制限するためのものです。
最小値.最大値
のように表現し、%
と文字の間に記述します。
例 | 説明 |
---|---|
%20msg | 20 文字未満の場合、20 文字になるように末尾をスペースで埋める |
%-20msg | 20 文字未満の場合、20 文字になるように先頭をスペースで埋める |
%.20msg | 20 文字を超える場合、20 文字になるように先頭の文字を削除する |
%.-20msg | 20 文字を超える場合、20 文字になるように末尾の文字を削除する |
%20.20msg | 20 文字未満の場合、20 文字になるように末尾をスペースで埋める 20 文字を超える場合、20 文字になるように先頭の文字を削除する |
また書式修飾子は、()
を使ってグループ化した文字に対して指定することもできます。
()
を使用したい場合は、\
でエスケープします。
%30(%d{yyyy-MM-dd HH:mm:ss.SSS} %m)
色指定
コンソールで出力する際に、()
でグループ化した文字に対して色付けをすることができます。
色 | 通常 | 濃い(太い) |
---|---|---|
黒 | %black | |
赤 | %red | %boldRed |
緑 | %green | %boldGreen |
黄 | %yellow | %boldYellow |
青 | %blue | %boldBlue |
マゼンタ | %magenta | %boldMagenta |
シアン | %cyan | %boldCyan |
白 | %white | %boldWhite |
灰 | %gray |
上記以外に%highlight
があります。これはログレベルによって色が変わります。
ログレベル | 色 |
---|---|
ERROR | %boldRed |
WARN | %red |
INFO | %blue |
その他 | デフォルト値 |
また以下のような%clr
による指定方法もあります。
%clr(%m){red}
logback.xml
Spring Boot のデフォルトのログ設定は、base.xml
に定義されています。
<?xml version="1.0" encoding="UTF-8"?>
<include>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</include>
base.xml
は、defaults.xml
、console-appender.xml
、file-appender.xml
を読み込みます。
これら 3 つのファイルには、コンソールとファイル出力に関する設定が記述されています。
それぞれの内容についてはこちらを参考にしてください。
base.xml
は、application.yml
の設定値を参照してログの設定をしています。
より詳細なログ設定を行いたい場合は、これを上書きするためのlogback.xml
を作成します。
logback.xml
は、src/main/resources
の直下に配置します。
例えば、エラーが発生した場合にメールを送信するといったことが設定できます。
Logback の設定方法についてはこの記事では割愛します。