在Java应用中,Logback或Log4j的MDC可以帮我们实现在记录日志时携带当前上下文之外的信息。一个典型的应用场景是,当一个HTTP请求进入Spring应用后,在拦截器中向MDC写入为当前请求生成trace id / transaction id,后续业务类中打印的log都可以携带id,方便日志的定位。
MDC的实现方式
由于我们经常使用Slf4j之类的log facade,在使用时只需要关心类似org.slf4j.MDC
的类提供的接口就可以。但是在具体日志库实现时,通常会实现一个MDCAdapter
接口以便门面MDC类调用。不论是Logback还是Log4j,实现MDC的方式都是通过ThreadLocal
来存储我们写入MDC的数据。