Actuator info端点显示时间戳而非可读构建时间
解决Spring Boot Actuator Info端点构建时间可读性问题
问题原因
Spring Boot的BuildInfoProperties会将build.time解析为Instant类型,默认序列化时会转换为时间戳格式,而META-INF/build-info.properties中存储的原始ISO格式并不会直接在Actuator端点输出。
解决方案
方案1:自定义BuildInfoContributor(精准控制格式)
通过实现BuildInfoContributor接口,替换默认的构建信息贡献者,将时间格式化为可读的ISO字符串:
import org.springframework.boot.actuate.info.BuildInfoContributor; import org.springframework.boot.actuate.info.Info; import org.springframework.boot.buildinfo.BuildInfo; import org.springframework.stereotype.Component; import java.time.format.DateTimeFormatter; import java.util.LinkedHashMap; import java.util.Map; @Component public class FormattedBuildInfoContributor implements BuildInfoContributor { private final BuildInfo buildInfo; public FormattedBuildInfoContributor(BuildInfo buildInfo) { this.buildInfo = buildInfo; } @Override public void contribute(Info.Builder builder) { Map<String, Object> buildInfoMap = new LinkedHashMap<>(); buildInfoMap.put("group", buildInfo.getGroup()); buildInfoMap.put("artifact", buildInfo.getArtifact()); buildInfoMap.put("name", buildInfo.getName()); buildInfoMap.put("version", buildInfo.getVersion()); if (buildInfo.getTime() != null) { // 格式化为ISO-8601标准字符串 buildInfoMap.put("time", DateTimeFormatter.ISO_INSTANT.format(buildInfo.getTime())); } builder.withDetail("build", buildInfoMap); } }
启动应用后,Info端点的build.time会直接输出类似2023-10-25T14:54:05.717Z的可读格式。
方案2:全局配置Jackson序列化规则(简单高效)
通过配置Jackson,让所有Instant类型字段序列化为字符串而非时间戳,全局生效:
在application.yml中添加:
spring: jackson: serialization: write-dates-as-timestamps: false
或在application.properties中添加:
spring.jackson.serialization.write-dates-as-timestamps=false
此方法无需编写额外代码,所有日期类型都会以ISO格式字符串输出,包括build.time。
方案3:修改Maven插件生成格式化时间(构建时固化)
通过Spring Boot Maven插件的additionalProperties配置,在构建时直接生成格式化后的时间字段:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>build-info</goal> </goals> <configuration> <additionalProperties> <!-- 添加自定义格式化时间字段 --> <build.time.formatted>${maven.build.timestamp}</build.time.formatted> </additionalProperties> </configuration> </execution> </executions> </plugin> </plugins> <!-- 定义Maven时间戳格式 --> <properties> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ssXXX</maven.build.timestamp.format> </properties> </build>
此方案会在build-info.properties中新增build.time.formatted字段,Info端点会自动展示该字段,原始time字段仍保留时间戳格式,适合需要同时保留两种格式的场景。
内容的提问来源于stack exchange,提问作者Leos Literak
相关产品推荐
相关产品推荐

