2016-11-30 30 views
0

直到最近我還在使用spring-boot 1.3.5.RELEASE和以下工作。 Spring引導MDC繼承行爲有改變嗎?

@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控制器。

我們現在在春天的版本1.4.1.RELEASE和MDC記錄的service_name只在現在的主線程,而不是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上下文是在控制器方法開始空調試器看到的。

有誰知道哪些變化影響了這種行爲?也許改變春天MVC線程創建?或者一個logback更改? 有沒有辦法設置並保持應用程序範圍內的MDC屬性仍然在spring-boot中?

感謝

回答

0

的MDC值保持在線程局部變量,因此只有啓動你的春天啓動的應用程序具有價值的主要線索。 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>