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

是什麼?

MDC(Mapped Diagnostic Context,映射調試上下文)是日誌系統提供的一種方便在多線程條件下記錄日誌的功能

有什麼用?

一個常用的場景就是Web服務器中給每個請求都給一個獨特的請求id,在合理配置日誌的layout之後,所有的日誌都會打印這個請求id,這樣一個請求下的所有日誌信息都可以很方便的找到。

一個簡單的理解可以認爲是全局的marker信息,調用的時候不用類似下面的代碼就可以實現所有的日誌中都有marker標記

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

SLF4J怎麼綁定到依賴中的MDC實現呢?

這還是要從SLF4JServiceProvider中獲取,如果沒有,則採用默認的MDC即NOPMDCAdapter,這個類就表示什麼都不會做。

MDC的部分代碼

	static MDCAdapter mdcAdapter;

	static {
        SLF4JServiceProvider provider = LoggerFactory.getProvider();
        if (provider != null) {
            mdcAdapter = provider.getMDCAdapter();
        } else {
            Util.report("Failed to find provider.");
            Util.report("Defaulting to no-operation MDCAdapter implementation.");
            mdcAdapter = new NOPMDCAdapter();
        }
    } 
public class NOPMDCAdapter implements MDCAdapter {

    public void clear() {
    }

    public String get(String key) {
        return null;
    }

    public void put(String key, String val) {
    }

    public void remove(String key) {
    }
    public Map<String, String> getCopyOfContextMap() {
        return null;
    }
    public void setContextMap(Map<String, String> contextMap) {
        // NOP
    }
}

MDCAdapter

從MDC的代碼可以看到,其實他是對MDCAdapter的一層包裝。

public interface MDCAdapter {
    public void put(String key, String val);
    public String get(String key);
    public void remove(String key);
    public void clear();
    public Map<String, String> getCopyOfContextMap();
    public void setContextMap(Map<String, String> contextMap);
}

以上,我們看到MDCAdapter其實就只是一些簡單的kv常見操作,也不難推測出他的功能其實也就是相當於一個緩存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章