Featured image of post 【SpingBoot2】LogbackのログをJson形式にする方法【CloudWatch】

【SpingBoot2】LogbackのログをJson形式にする方法【CloudWatch】

790文字

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つのライブラリの依存関係を追加します。

devtools/build.gradle
buildscript {
...
        implementation "ch.qos.logback.contrib:logback-json-classic:${accountService.logbackJsonVersion}"
        implementation "ch.qos.logback.contrib:logback-jackson:${accountService.logbackJsonVersion}"
...
}

devtools/property.gradle
ext {
...
    accountService.logbackJsonVersion = '0.1.5'
...
}

logback-spring.xmlの修正

次に、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】 2019/05/01 893文字 約2分で読めます

AWS CloudWatchLogsの場合

以前紹介したCloudWatchへの転送時にもJson形式にする事が出来ます。

関連記事 【運用改善への近道】LogbackでAWSのCloudWatchに転送する方法【com.j256.cloudwatchlogbackappender】 2019/05/04 616文字 約2分で読めます

logback-spring.xml
<?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形式にする事でログ解析作業の効率化に繋がるので、皆さんも参考にしてみてはいかがでしょうか♪