Spring Boot Native环境中Logback logging.config属性无法被环境变量覆盖
问题:Spring Boot Native环境下环境变量无法覆盖
logging.config配置 环境与代码示例
1. Gradle构建配置
plugins { java id("org.springframework.boot") version "3.1.5" id("io.spring.dependency-management") version "1.1.3" id("org.graalvm.buildtools.native") version "0.9.27" } group = "com.example" version = "0.0.7" java { sourceCompatibility = JavaVersion.VERSION_17 } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter") } tasks { bootBuildImage { builder.set("paketobuildpacks/builder-jammy-tiny:latest") } }
2. application.properties配置
logging.config=classpath:logback-aaa.xml
3. 主程序Java代码
package com.example.springlogbacknative; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringLogbackNativeApplication { public static Logger log = LoggerFactory.getLogger(SpringLogbackNativeApplication.class); public static void main(String[] args) { System.out.println("System.getenv(\"LOGGING_CONFIG\") = " + System.getenv("LOGGING_CONFIG")); System.out.println("System.getenv(\"logging.config\") = " + System.getenv("logging.config")); SpringApplication.run(SpringLogbackNativeApplication.class, args); } }
4. Docker Compose运行配置
services: sln: image: spring-logback-native:0.0.7 environment: LOGGING_CONFIG: "classpath:logback-replace.xml" logging.config: "classpath:logback-replace.xml"
运行现象与问题
执行./gradlew bootBuildImage构建Native镜像后,通过Docker Compose启动应用,日志输出显示环境变量已被正确读取,但日志系统仍使用logback-aaa.xml的配置:
System.getenv("LOGGING_CONFIG") = classpath:logback-replace.xml System.getenv("logging.config") = classpath:logback-replace.xml 14:21:46,499 |-INFO in ch.qos.logback.classic.LoggerContext[default] - This is logback-classic version 1.4.11 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Here is a list of configurators discovered as a service, by rank: 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - org.springframework.boot.logging.logback.RootLogLevelConfigurator 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - They will be invoked in order until ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY is returned. 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Constructed configurator of type class org.springframework.boot.logging.logback.RootLogLevelConfigurator 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - org.springframework.boot.logging.logback.RootLogLevelConfigurator.configure() call lasted 0 milliseconds. ExecutionStatus=INVOKE_NEXT_IF_ANY 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Trying to configure with ch.qos.logback.classic.joran.SerializedModelConfigurator 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Instantiation failure: java.lang.ClassNotFoundException: ch.qos.logback.classic.joran.SerializedModelConfigurator 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Trying to configure with ch.qos.logback.classic.util.DefaultJoranConfigurator 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Instantiation failure: java.lang.ClassNotFoundException: ch.qos.logback.classic.util.DefaultJoranConfigurator 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Trying to configure with ch.qos.logback.classic.BasicConfigurator 14:21:46,500 |-INFO in ch.qos.logback.classic.util.ContextInitializer@132da9ab - Instantiation failure: java.lang.ClassNotFoundException: ch.qos.logback.classic.BasicConfigurator 14:21:46,531 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - Processing appender named [console_aaa] 14:21:46,531 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 14:21:46,532 |-INFO in ch.qos.logback.core.model.processor.ImplicitModelHandler - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property 14:21:46,532 |-INFO in ch.qos.logback.classic.model.processor.RootLoggerModelHandler - Setting level of ROOT logger to INFO 14:21:46,532 |-INFO in ch.qos.logback.classic.jul.LevelChangePropagator@ba501d9 - Propagating INFO level on Logger[ROOT] onto the JUL framework 14:21:46,532 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [console_aaa] to Logger[ROOT] 14:21:46,532 |-INFO in ch.qos.logback.core.model.processor.DefaultProcessor@5e495062 - End of configuration. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.1.5) 14:21:46.534 AAA INFO c.e.s.SpringLogbackNativeApplication - Starting AOT-processed SpringLogbackNativeApplication using Java 17.0.8.1 with PID 1 (/workspace/com.example.springlogbacknative.SpringLogbackNativeApplication started by cnb in /workspace) 14:21:46.534 AAA INFO c.e.s.SpringLogbackNativeApplication - No active profile set, falling back to 1 default profile: "default" 14:21:46.542 AAA INFO c.e.s.SpringLogbackNativeApplication - Started SpringLogbackNativeApplication in 0.033 seconds (process running for 0.046)
预期Docker Compose中设置的LOGGING_CONFIG环境变量能够覆盖application.properties里的logging.config配置,但实际未生效。排查发现,在org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem方法中,environment.getProperty(CONFIG_PROPERTY)并未返回环境变量设置的路径,而该逻辑在非Native环境下工作正常。
内容的提问来源于stack exchange,提问作者Dmitrij Irikov
相关产品推荐
相关产品推荐

