SLF4J(六) - MDC/MDCAdapter是什么?

x33g5p2x  于2021-12-28 转载在 其他  
字(1.4k)|赞(0)|评价(0)|浏览(922)

是什么?

MDC(Mapped Diagnostic Context,映射调试上下文)是日志系统提供的一种方便在多线程条件下记录日志的功能

有什么用?

一个常用的场景就是Web服务器中给每个请求都给一个独特的请求id,在合理配置日志的layout之后,所有的日志都会打印这个请求id,这样一个请求下的所有日志信息都可以很方便的找到。

一个简单的理解可以认为是全局的marker信息,调用的时候不用类似下面的代码就可以实现所有的日志中都有marker标记

  1. log.info(MARKER, "marker info");
  2. log.info(MARKER, "marker info1");

SLF4J怎么绑定到依赖中的MDC实现呢?

这还是要从SLF4JServiceProvider中获取,如果没有,则采用默认的MDC即NOPMDCAdapter,这个类就表示什么都不会做。

MDC的部分代码

  1. static MDCAdapter mdcAdapter;
  2. static {
  3. SLF4JServiceProvider provider = LoggerFactory.getProvider();
  4. if (provider != null) {
  5. mdcAdapter = provider.getMDCAdapter();
  6. } else {
  7. Util.report("Failed to find provider.");
  8. Util.report("Defaulting to no-operation MDCAdapter implementation.");
  9. mdcAdapter = new NOPMDCAdapter();
  10. }
  11. }
  1. public class NOPMDCAdapter implements MDCAdapter {
  2. public void clear() {
  3. }
  4. public String get(String key) {
  5. return null;
  6. }
  7. public void put(String key, String val) {
  8. }
  9. public void remove(String key) {
  10. }
  11. public Map<String, String> getCopyOfContextMap() {
  12. return null;
  13. }
  14. public void setContextMap(Map<String, String> contextMap) {
  15. // NOP
  16. }
  17. }

MDCAdapter

从MDC的代码可以看到,其实他是对MDCAdapter的一层包装。

  1. public interface MDCAdapter {
  2. public void put(String key, String val);
  3. public String get(String key);
  4. public void remove(String key);
  5. public void clear();
  6. public Map<String, String> getCopyOfContextMap();
  7. public void setContextMap(Map<String, String> contextMap);
  8. }

以上,我们看到MDCAdapter其实就只是一些简单的kv常见操作,也不难推测出他的功能其实也就是相当于一个缓存。

相关文章