Spring Boot MDC继承行为是否已更改?

时间:2016-11-30 16:34:24

标签: spring-boot logback mdc

直到最近我才使用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属性?

由于

1 个答案:

答案 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>