Json形式で見やすくしよう
Logbackをそのまま利用していると、基本的には一行のテキストで、Formatパターンに沿ったログが出力されると思います。
こんな感じ。
[INFO ] [2019-05-04 12:41:26.322] [o.a.catalina.core.StandardService] - Starting service [Tomcat]
しかし、一行の中に全ての情報が含まれていると、ログ解析時にちょっと見にくかったりとやや問題があります。
そこで、logback-json-classicというライブラリを使う事で、logbackの出力ログをJson形式にする事が可能になりますので、設定方法をご紹介します。
手順
依存関係の追加
build.gradleに以下の2つのライブラリの依存関係を追加します。
buildscript {
...
implementation "ch.qos.logback.contrib:logback-json-classic:${accountService.logbackJsonVersion}"
implementation "ch.qos.logback.contrib:logback-jackson:${accountService.logbackJsonVersion}"
...
}
ext {
...
accountService.logbackJsonVersion = '0.1.5'
...
}
logback-spring.xmlの修正
次に、logback-spring.xmlを修正していきましょう。
標準出力の場合
標準出力の場合は以下のように修正してください。
<?xml version="1.0" encoding="UTF-8"?>
...
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSXXX</timestampFormat>
<includeContextName>false</includeContextName>
<appendLineSeparator>true</appendLineSeparator>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
...
</configuration>
確認
では、サーバーを起動してログを確認してみましょう。
{
"timestamp":"2019-05-04T19:47:51.347+09:00",
"level":"WARN",
"thread":"http-nio-8080-exec-1",
"mdc":{
"x-request-id":"c3a80300-0953-4635-802f-72abceb67b35"
},
"logger":"org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver",
"message":"Resolved [ResourceNotFoundException(errorType=RESOURCE_NOT_FOUND_COMMON)]"
}
正常にJson形式で出力されています。
見やすいですし、MDCに設定したx-request-idも出力されていますね♪
関連記事
【SpringBoot2】レスポンスヘッダーに独自の項目を追加する方法【X-Request-ID】
AWS CloudWatchLogsの場合
以前紹介したCloudWatchへの転送時にもJson形式にする事が出来ます。
関連記事
【運用改善への近道】LogbackでAWSのCloudWatchに転送する方法【com.j256.cloudwatchlogbackappender】
<?xml version="1.0" encoding="UTF-8"?>
...
<appender name="CLOUDWATCH" class="com.j256.cloudwatchlogbackappender.CloudWatchAppender">
<region>ap-northeast-1</region>
<accessKeyId>XXX</accessKeyId>
<secretKey>YYY</secretKey>
<logGroup>blogenist-loggroup</logGroup>
<logStream>${SPRING_PROFILE}.${RUN_TIME}</logStream>
<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
<jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
<prettyPrint>true</prettyPrint>
</jsonFormatter>
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSXXX</timestampFormat>
<includeContextName>false</includeContextName>
<appendLineSeparator>true</appendLineSeparator>
</layout>
<maxBatchSize>32</maxBatchSize>
</appender>
...
</configuration>
確認
こちらもサーバーを起動してリクエストを投げてみましょう。

こちらも正常にCloudWatchLogs上でJson形式でまとめて見やすくなりました♪
終わりに
以上のように、簡単にJson形式でログを出力出来るようになりました。
Json形式にする事でログ解析作業の効率化に繋がるので、皆さんも参考にしてみてはいかがでしょうか♪
