logbackとLogstashを活用したログ可視化の実装

Logstashのセットアップ

まずはLogstashをダウンロードします。公式ページから適切なバージョンを入手してください。

ダウンロードURL: Logstash 5.5.1

JDK環境のインストール作業は完了しているものとして進めます。

logstash.confの設定

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 5045
    codec => json_lines
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "%{application}-%{environment}"
  }
}

logstash.ymlの設定

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: "http://elasticsearch:9200"

Logstashの起動

nohup ./bin/logstash -f config/logstash.conf &

logback.xmlの設定

Spring Bootアプリケーション用のlogback設定ファイルは以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<springProperty scope="context" name="application" source="spring.application.name"/>
	<springProperty scope="context" name="environment" source="spring.profiles.active"/>

	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} # %t # [%X{TraceID}] # %-5p # %c:%L - %m%n</pattern>
		</encoder>
	</appender>

	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${user.home}/logs/${application}/${application}-debug.log</file>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} # %t # [%X{TraceID}] # %-5p # %c:%L - %m%n</pattern>
		</encoder>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${user.home}/logs/${application}/${application}-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<maxHistory>30</maxHistory>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>100MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>
	</appender>

	<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
		<destination>${logstash:-172.16.63.85:30808}</destination>
		<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
			<providers>
				<timestamp>
					<timeZone>UTC</timeZone>
				</timestamp>
				<pattern>
					<pattern>
						{
						"timestamp": "%date{"yyyy-MM-dd'T'HH:mm:ss,SSSZ"}",
						"level": "%level",
						"application": "${application:-}",
						"environment": "${environment:-}",
						"thread": "%thread",
						"class": "%logger{40}",
						"message": "%message",
						"processId": "${PID:-}",
						"traceId": "%X{TraceID}",
						"exception": "%exception{full}"
						}
					</pattern>
				</pattern>
			</providers>
		</encoder>
	</appender>

	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="LOGSTASH" />
		<appender-ref ref="FILE"/>
	</root>
</configuration>

Maven依存関係

logstash-logback-encoderライブラリをpom.xmlに追加してください。

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.0</version>
</dependency>

設定のポイント

本設定では、LogstashTcpSocketAppenderを使用してアプリケーションログをTCP経由でLogstashに送信します。JSON形式にエンコードされたログデータは、Elasticsearchに格納され、Kibanaなどの可視化ツールから参照可能になります。

ログエントリにはトレースID(TraceID)を含めることで、分散システムにおけるリクエスト追跡が可能です。

タグ: logback Logstash Elasticsearch logging Java

5月15日 12:39 投稿