spring 引导 MDC 继承行为是否已更改?

Has spring boot MDC inheritance behaviour changed?

直到最近,我一直在使用 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 线程创建的更改?还是 logback 更改? 有没有办法设置并保持应用程序范围的 MDC 属性 仍在 spring-boot 中?

谢谢

MDC 值保存在本地线程中,因此只有启动 spring 启动应用程序的主线程才具有该值。 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>