Featured image of post Logbackで環境ごとにログを出し分ける方法【SpringBoot2】

Logbackで環境ごとにログを出し分ける方法【SpringBoot2】

SpringBoot2のLogbackで、環境(プロファイル)ごとにログの出力先やフォーマットを切り替える方法。logback-spring.xmlで環境別のlayout.xmlをincludeする構成と、1ファイルにまとめる書き方も♪

756文字

ロギングを環境ごとに分けよう

org.springframework.boot:spring-boot-starter-webの依存関係を追加してSpringBootで開発を行う場合、デフォルトでLogbackというロギングライブラリを採用します。

Logbackとは、Log4jの開発者が作った新しめのJava製のロギングライブラリです。

SpringBootとの親和性がとても高く、ログのフォーマット指定やローテート、出力先や環境ごとの切り替えなどがとても簡単に設定をすることが出来ますので、今回はそちらをご紹介していきます。

手順

logback-spring.xmlの作成

まずはクラスパス配下にlogback-spring.xmlを配置しましょう。

[adsense-responsive]

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<property name="FORMAT" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %logger{36} - %msg%n" /> //共通のフォーマット定義
	<property name="LOG_DIR" value="logs" /> //共通の出力先ベース定義
	<property name="FILNE_NAME" value="account-service.log" /> //共通のファイル名定義

	<springProfile name="local"> //profileがlocalの場合
		<include resource="logback/local-layout.xml" />
	</springProfile>

	<springProfile name="staging"> //profileがstagingの場合
		<include resource="logback/staging-layout.xml" />
	</springProfile>

	<springProfile name="production"> //profileがproductionの場合
		<include resource="logback/production-layout.xml" />
	</springProfile>

</configuration>

layout.xmlの作成

次に、上記ファイルでincludeしている各環境ごとのログレイアウトファイルを用意します。

今回は各環境ごとのフォルダを生成してその中にログファイルを吐き出すようにしてみます。

local-layout.xml
<included>

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>[local]${FORMAT}</pattern>
		</encoder>
	</appender>

	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/local/${FILNE_NAME}</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_DIR}/local/${FILNE_NAME}.%d{yyyy-MM-dd}.log.tar.gz</fileNamePattern>
			<maxHistory>7</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>[local]${FORMAT}</pattern>
		</encoder>
	</appender>

	<root level="DEBUG">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
	</root>
</included>

staging-layout.xml
<included>

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>[staging]${FORMAT}</pattern>
		</encoder>
	</appender>

	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/local/${FILNE_NAME}</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_DIR}/local/${FILNE_NAME}.%d{yyyy-MM-dd}.log.tar.gz</fileNamePattern>
			<maxHistory>7</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>[staging]${FORMAT}</pattern>
		</encoder>
	</appender>

	<root level="DEBUG">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
	</root>
</included>

production-layout.xml
<included>

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>

	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/production/account-service.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_DIR}/production/account-service.%d{yyyy-MM-dd}.log.tar.gz</fileNamePattern>
			<maxHistory>7</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>

	<root level="DEBUG">
		<appender-ref ref="FILE" />
	</root>
</included>

確認

この状態で各プロファイルごとにアプリケーションを実行すると、以下のように設定ファイルに沿ってログが出力されるようになります。

tree
api/logs
├── local
│   └── account-service.log
├── production
│   └── account-service.log
└── staging
    └── account-service.log

フォーマットも指定通りになっていますね♪

[local][INFO ] 2019-04-28 12:15:26.777 o.a.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]

一つのファイルで環境分けする事も可能

今回はプロファイル単位でファイルを用意してincludeしていますが、一つのファイル内で完結させる事も可能です。

[adsense-responsive]

logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<property name="FORMAT" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %logger{36} - %msg%n" />
	<property name="LOG_DIR" value="logs" />
	<property name="FILNE_NAME" value="account-service.log" />

	<springProfile name="local">
		<property name="SPRING_PROFILE" value="local" />
	</springProfile>

	<springProfile name="staging">
		<property name="SPRING_PROFILE" value="staging" />
	</springProfile>

	<springProfile name="production">
		<property name="SPRING_PROFILE" value="production" />
	</springProfile>

	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>[${SPRING_PROFILE}]${FORMAT}</pattern>
		</encoder>
	</appender>

	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_DIR}/${SPRING_PROFILE}/${FILNE_NAME}</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_DIR}/${SPRING_PROFILE}/${FILNE_NAME}.%d{yyyy-MM-dd}.log.tar.gz</fileNamePattern>
			<maxHistory>7</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>[${SPRING_PROFILE}]${FORMAT}</pattern>
		</encoder>
	</appender>

	<root level="DEBUG">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
	</root>

</configuration>

終わりに

以上のように、簡単にログフォーマットの変更や環境ごとの設定を分けることが出来ました。

他にもローテートの設定や保存期間の設定なども細かく出来るのでぜひ試してみてください♪