Graalvm aot中logback的处理和自动重载

发布时间 2024-01-12 10:08:16作者: 秦秋随

官方说明:Logging in Native Image (graalvm.org)

我使用graalvm-community-jdk-21.0.1_windows-x64_bin.zip,解压后配置好JAVA_HOME和PATH,安装 C++,就可以直接使用,不需要复杂的匹配过程

日志这一块卡了很长时间,最后的方法是在application.yml中启用日志

然后编译时,会自动根据XML中的内容去判断反射的类,生成相关的引用信息,不需要自己在编译参数中增加内容

@@@code

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

 

<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
<buildArgs>
--no-fallback
<!-- &#45;&#45;initialize-at-build-time=io.netty-->
<!-- &#45;&#45;initialize-at-run-time=org.apache.logging.log4j.spi.Provider-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback-->
<!-- &#45;&#45;initialize-at-build-time=org.springframework.util.unit.DataSize-->
<!-- &#45;&#45;initialize-at-build-time=org.slf4j.MDC-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.classic.Level-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.classic.Logger-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.core.util.StatusPrinter-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.core.status.StatusBase-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.core.status.InfoStatus-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.core.spi.AppenderAttachableImpl-->
<!-- &#45;&#45;initialize-at-build-time=org.slf4j.LoggerFactory-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.core.util.Loader-->
<!-- &#45;&#45;initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.classic.spi.ThrowableProxy-->
<!-- &#45;&#45;initialize-at-build-time=ch.qos.logback.core.CoreConstants-->
--report-unsupported-elements-at-runtime
--allow-incomplete-classpath
-H:+ReportExceptionStackTraces
</buildArgs>
</configuration>
</plugin>

 

@@#

这种方法得到的EXE,logback已经提前编译并匹配好了,可以直接使用,如果还想在启动时指定新的XML,或者修改其中的内容,以及定时scan,可以增加代码,为logback配置一个绝对地址,在spring启动后强行重新配置LOGBACK

@@@code

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
if (!reloaded.get()) {
loggerContext.reset();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);

String workPath = nettyProperties.workPath; //AOT下使用绝对路径,使autoload可用
configurator.doConfigure(Paths.get(workPath, "config/logback-spring.xml").toFile());
log.warn("
重新加载日志配置{}", nettyProperties.workPath);
reloaded.set(true);
}

 

@@#