spring.svg

【Spring Boot】ログ出力(Logback)

SpringBoot

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 には、TRACEDEBUGINFOWARNERRORの順でログレベルが存在します。

以下がそれぞれの出力例です。

logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");

Spring Boot では、デフォルトのログレベルにINFOが設定されているため、TRACEDEBUGは出力されません。

フォーマット

出力メッセージには、{}を使用したフォーマットの指定ができます。

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.ymlapplication.properties)には、以下のログに関するプロパティがあります。

プロパティデフォルト値説明
logging.level.rootinfoルートのログレベル
logging.file.nameログファイルのパス
logging.file.pathログファイルの出力先フォルダパス
logging.file.nameが優先される
logging.pattern.dateformatyyyy-MM-dd HH:mm:ss.SSSログの日付フォーマット
logging.pattern.console省略コンソール出力における出力パターン
logging.pattern.file省略ファイル出力における出力パターン
logging.logback.rollingpolicy.clean-history-on-startfalseアプリケーションの起動時にアーカイブを削除するかどうか
logging.logback.rollingpolicy.file-name-pattern${LOG_FILE}.%d{yyyy-MM-dd}.%i.gzアーカイブファイル名のパターン
logging.logback.rollingpolicy.max-file-size10MBログファイルの最大サイズ
logging.logback.rollingpolicy.max-history7アーカイブ日数
logging.logback.rollingpolicy.total-size-cap0Bログバックアップの合計サイズ

logging.pattern.consolelogging.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%mlogger.info()などで指定したメッセージ
n%n改行
p, le, level%pログレベル
replace%replace(%m){'\s', ''}文字の置換

%を含めたい場合は、\%のようにエスケープします。

書式修飾子

変換指定子の出力する文字数を制限するためのものです。 最小値.最大値のように表現し、%と文字の間に記述します。

説明
%20msg20 文字未満の場合、20 文字になるように末尾をスペースで埋める
%-20msg20 文字未満の場合、20 文字になるように先頭をスペースで埋める
%.20msg20 文字を超える場合、20 文字になるように先頭の文字を削除する
%.-20msg20 文字を超える場合、20 文字になるように末尾の文字を削除する
%20.20msg20 文字未満の場合、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に定義されています。

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.xmlconsole-appender.xmlfile-appender.xmlを読み込みます。 これら 3 つのファイルには、コンソールとファイル出力に関する設定が記述されています。

それぞれの内容についてはこちらを参考にしてください。

base.xmlは、application.ymlの設定値を参照してログの設定をしています。

より詳細なログ設定を行いたい場合は、これを上書きするためのlogback.xmlを作成します。 logback.xmlは、src/main/resourcesの直下に配置します。

例えば、エラーが発生した場合にメールを送信するといったことが設定できます。

Logback の設定方法についてはこの記事では割愛します。