Spring Boot + logstash-logback-encoderで、ログにGitコミットハッシュを出力する
環境
- 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でそのバージョンをソースコードを簡単に見ることができます。
pom.xml
logstash-logback-encoderとgit-commit-id-maven-pluginを追加します。
<?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コミットハッシュ(短縮版)を表します。
#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システムプロパティなども指定できるっぽい)。
<?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.commit.id.abbrev=dummy
Discussion