我需要在每个日志行上记录一个常量值,但值的问题在于获取它的唯一方法是使用代码(我需要先调用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");
}
};
}
该代码生成此日志:
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
如您所见,该值在名为localhost-startStop-1
的线程中设置,因此在主线程中不再设置该值。我想要做的是在主要上下文中设置MDC,但是我没有找到一种方法来访问主线程,其中spring在servlet容器内运行。
我知道我可以用logback的%contextName变量实现相同的功能,但是我想继续使用slf4j的接口而不使用其中一个实现的东西。