如何在Spring Boot的日志中尽早打印应用程序版本?

时间:2019-01-08 01:03:55

标签: java spring-boot

我试图在我的任何其他代码都没有执行之前,先在日志中打印我的应用程序版本,以便在发生错误时将该版本包含在日志文件中。

@SpringBootApplication
public class Application {
    public static void main( String... args ) {
        var ctx = SpringApplication.run( Application.class, args );
        ctx.getBeanProvider( BuildProperties.class ).ifAvailable( bp -> {
            LogManager.getLogger( Application.class ).info( bp.getArtifact() );
        } );
    }
}

但是ifAvailable中的块没有执行,我想特别打印该版本。

注意:这是在build.gradle.kts

springBoot {
    buildInfo() // generates BOOT-INF/classes/META-INF/build-info.properties
}

更新失败,没有这样的bean ...

@SpringBootApplication
public class Application {
    public static void main( String... args ) {
        SpringApplication.run( Application.class, args );
    }

    @Bean
    CommandLineRunner runner( BuildProperties bp ) {
        return args -> LogManager.getLogger( Application.class ).info( bp.getArtifact() );
    }
}

更新2:不必在横幅后面,但必须足够早,这样它才能在来自自定义代码的任何验证/错误之前打印出来。

3 个答案:

答案 0 :(得分:1)

假设您正在装满一个罐子(否则需要进行一些修改)

tasks.withType<BootJar>().configureEach {
    enabled = true
    manifest {
        attributes(
            "Implementation-Title" to project.description,
            "Implementation-Version" to project.version
        )
    }
}

然后customize your banner.txt;例如

${application.title} ${application.version}

答案 1 :(得分:0)

您可以使用具有banner.txt属性的自定义spring.banner.location并使用带有resource filtering的Gradle processResources task将文件中的占位符替换为{{1 }}。

答案 2 :(得分:0)

此答案包含有关技术的一些意见, 但可能会有用。

先假设:

  1. 您正在构建可执行文件,胖子。
  2. 您正在使用spring-boot-maven-plugin构建jar。

答案:

  1. 配置spring-boot-maven-plugin以在构件中包含构建信息。有关说明,请参见91.1 Generate Build Information部分(在spring-boot参考中)。
  2. 确保启用构建信息提供者。默认情况下应启用此功能(在Spring Boot参考中搜索“ management.info.build.enabled”,以查找启用其信息贡献者的属性。
  3. 从应用程序上下文中获取InfoContributor bean的列表。我通过在组件中自动装配List来做到这一点,如下所示:
      

    @Autowired
      私有列表 infoContributorList;

  4. 运行InfoContributor对象的列表(在您的情况下,应该只有一个,即构建信息)并显示该信息。

这是一些代码(我的配置很差)

  

最终信息信息;
     最终的Info.Builder infoBuilder =新的Info.Builder();
     最终地图信息地图;

     

用于(最终InfoContributor当前:infoContributorList)
     {
       current.contribute(infoBuilder);
     }

     

info = infoBuilder.build();

     

infoMap = info.getDetails();