💨

Spring Boot + logstash-logback-encoderで、ログにGitコミットハッシュを出力する

2024/09/23に公開

環境

  • Spring Boot 3.3
  • JDK 21
  • logback-logstash-encoder 8.0
  • git-commit-id-maven-plugin

やりたいこと

本番環境のアプリがどのバージョンなのかを知るために、全ログにGitコミットハッシュを追加したいです。

ログの例
{"@timestamp":"2024-09-23T16:07:51.484848+09:00","@version":"1","message":"アクセスがありました。","logger_name":"com.example.HelloController","thread_name":"http-exec-01","level":"INFO","level_value":20000,"git_hash":"1a2b3c4"}

ログでコミットハッシュを確認したら、IntelliJでそのバージョンをソースコードを簡単に見ることができます。

https://zenn.dev/masatoshi_tada/articles/ea4462b48b44b5

pom.xml

logstash-logback-encoderとgit-commit-id-maven-pluginを追加します。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>hello</artifactId>
	<version>1.0.0</version>
	<properties>
		<java.version>21</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
        <!-- コレと -->
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>8.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
           <!-- コレ! -->
			<plugin>
				<groupId>io.github.git-commit-id</groupId>
				<artifactId>git-commit-id-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

git-commit-id-maven-pluginの効果

これを追加すると、ビルド時(Mavenだとmvn clean package)にクラスパス直下(Mavenだとtarget/classes直下)にgit.propertiesというファイルが作られます。

このファイルには、その時点でのコミットハッシュなど、Gitに関する様々な情報が含まれています。今回は、その中のgit.commit.id.abbrevを利用します。これはGitコミットハッシュ(短縮版)を表します。

git.properties
#Generated by Git-Commit-Id-Plugin
...
git.commit.id.abbrev=1a2b3c4
...

logback.xmlの設定

src/main/resources直下にlogback.xmlを作成します。この中には

  • クラスパス直下のgit.propertiesを読み込む
  • git.propertiesのgit.commit.id.abbrevを全ログに埋め込む

という設定を記述します。

logback-logstash-encoderのcustomFieldsで全ログに埋め込む値を設定できます。

加えて、Logbackでは${名前}でプロパティファイルなどの値を指定できます(JVMシステムプロパティなども指定できるっぽい)。

logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
    <!--
        クラスパス直下のgit.propertiesファイルを読み込む
        https://logback.qos.ch/manual/configuration.html#definingProps
    -->
    <variable resource="git.properties"/>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- git.propertiesのgit.commit.id.abbrevを全ログに埋め込む -->
            <customFields>{"git_hash":"${git.commit.id.abbrev}"}</customFields>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

ダミーのgit.propertiesの作成

git.propertiesはMavenでのビルド時に作成されますので、IDEでアプリケーションを実行する場合は作成されません。そうなるとLogbackがgit.propertiesを見つけられずに起動時例外になってしまいます。

これを避けるために、src/main/resources直下にダミーのgit.propertiesを作成してきます。IDEでの実行ではこれが使われます。Mavenでビルドした場合は、git-commit-id-maven-pluginがダミーのgit.propertiesを上書きします。

git.properties
# このファイルはビルド時に上書きされます
git.commit.id.abbrev=dummy

参考資料

Discussion