在主线程中设置MDC变量

ejo*_*cas 6 java spring tomcat slf4j spring-boot

我需要在每个日志行上记录一个常量值,但值的问题在于获取它的唯一方法是使用代码(我需要首先调用api来获取值).所以我想在应用程序的开头找出该值,然后在主线程中设置它,然后每个新线程继承该MDC上下文并且已经设置了该值.

目前我正在使用spring-boot,所以我尝试使用ApplicationListener进行设置:

@Bean
public ApplicationListener<ContextRefreshedEvent> setLoggingContext() {
    return new ApplicationListener<ContextRefreshedEvent>() {

        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            MDC.put("instanceId", "THE-VALUE");
            LOGGER.debug("Instance id set");
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

该代码生成此日志:

12:18:59.096 [localhost-startStop-1] default  INFO  o.s.j.e.a.AnnotationMBeanExporter -  Registering beans for JMX exposure on startup
12:18:59.171 [localhost-startStop-1] default THE-VALUE DEBUG c.m.config.CommonWebConfiguration - Instance id set
12:18:59.181 [localhost-startStop-1] default THE-VALUE INFO  o.s.boot.SpringApplication - Started application in 5.917 seconds (JVM running for 15.429)
12:18:59.193 [main] default  INFO  o.a.coyote.http11.Http11Protocol - Starting ProtocolHandler ["http-bio-8081"]
12:18:59.205 [main] default  INFO  org.apache.coyote.ajp.AjpProtocol - Starting ProtocolHandler ["ajp-bio-8009"]
12:18:59.207 [main] default  INFO  org.apache.catalina.startup.Catalina - Server startup in 14291 ms
Run Code Online (Sandbox Code Playgroud)

如您所见,该值在被调用的线程中设置,localhost-startStop-1因此在主线程中不再设置.我想要做的是在主上下文中设置MDC,但是我找不到一种方法来访问主线程,其中spring在servlet容器内运行.

我知道我可以使用logback的%contextName变量实现相同的功能但是我想继续使用slf4j的接口而不使用其中一个实现的东西.