Graalvm aot中logback的處理和自動重載

官方說明: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已經提前編譯並匹配好了,可以直接使用,但會發現不會再接受外部指定的logging.config了,即使修改了logback-spring.xml中的內容,也不會生效。

爲了再次更新配置,並使用scan功能,需要使用代碼重新配置一次(配置可從application.yml中直接取,也可以使用-Dlogging.config=file:../config/logback-spring.xml重新指定位置,

 

@@@code

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
//AOT
不支持scan autoload ,並且在編譯時確定了日誌等級,也不支持外部文件覆蓋配置,需要手工判斷文件並重新載入
if (!reloaded.get()) {
loggerContext.reset();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
configurator.doConfigure(new URL(env.getProperty("logging.config")));
log.warn("
重新加載日誌配置{}", env.getProperty("logging.config"));
reloaded.set(true);
}
ch.qos.logback.classic.Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
if (rootLogger != null)
System.out.println("root level=" + rootLogger.getLevel());

   

@@#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章