直到最近我才使用spring-boot 1.3.5.RELEASE,以下工作。
@SpringBootApplication
public class MyApplication {
static {
MDC.put("service_name", "myapp");
}
public static void main(String[] args) {
SpringApplication.run(new Object[]{MyConfiguration.class}, args);
}
}
请注意MDC。然后使用logback记录器在整个应用程序的每个日志行中记录service_name。 甚至在子线程中也是如此。 MVC控制器。
我们现在使用的是Spring版本1.4.1.RELEASE,而service_name的MDC日志记录现在只在主线程中工作,而不是MVC控制器线程。
" MyApp的"仍然记录在主线程中:
2016-11-30 14:22:08,147 [main] INFO co.uk.me.MyApplication - myapp [,,] - Started MyApplication in 14.276 seconds (JVM running for 308.404)
但是在控制器日志行" myapp"现在不见了。
2016-11-30 15:17:50,329 [http-nio-9007-exec-2] INFO co.uk.me.controller.MyController - [,,] - Received get <snip>
在改变之前它看起来像:
2016-11-30 15:17:50,329 [http-nio-9007-exec-2] INFO co.uk.me.controller.MyController - myapp [,,] - Received get <snip>
我可以在调试器中看到MDC上下文在控制器方法的开头是空的。
有谁知道哪些变化影响了这种行为?也许是对Spring MVC线程创建的改变?还是改变了回归? 有没有办法在spring-boot中设置和保持应用程序范围的MDC属性?
由于
答案 0 :(得分:0)
MDC值保留在线程本地,因此只有启动spring boot app的主线程才有值。 MDC通常用于动态内容而不用于静态(应用程序名称不会改变)。您可以添加一个过滤器,该过滤器将在每个传入请求上填充MDC值。
我建议你在logback-spring.xml文件中使用这样的东西:
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%date [myapp] [%thread] %-5level %logger{36} - %msg%xEx%n</Pattern>
</encoder>