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>
直到最近,我一直在使用 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>