0

直到最近我还在使用 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 put。然后使用 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 更改?有没有办法在 spring-boot 中设置和保持应用程序范围的 MDC 属性?

谢谢

4

1 回答 1

0

MDC 值保存在线程本地,因此只有启动 spring boot 应用程序的主线程具有该值。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> 
于 2017-02-28T10:02:18.083 回答