【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 の設定方法についてはこの記事では割愛します。