程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> slf4j中的MDC,slf4jMDC

slf4j中的MDC,slf4jMDC

編輯:JAVA綜合教程

slf4j中的MDC,slf4jMDC


slf4j中MDC是什麼鬼

  slf4j除了trace、debug、info、warn、error這幾個日志接口外,還可以配合MDC將數據寫入日志。換句話說MDC也是用來記錄日志的,但它的使用方式與使用日志接口不同。

  在使用日志接口時我們一般這麼做

Logger LOG = LoggerFactory.getLogger("LOGNAME_OR_CLASS");
if(LOG.isDebugEnabled()) {
  LOG.debug("log debug");
}

  MDC從使用方式上有些不同,我對它的理解是MDC可以將一個處理線程中你想體現在日志文件中的數據統一管理起來,根據你的日志文件配置決定是否輸出。

  比如以下但不限於以下場景可以考慮使用MDC來達到目的

MDC的使用

  org.slf4j.MDC我個人會用AOP或Filter或Interceptor這類工具配合使用,獲得你希望輸出到日志的變量並調用MDC.put(String key, String val),比如下面代碼片段第5行:

  @Around(value = "execution(* com.xx.xx.facade.impl.*.*(..))", argNames="pjp")
    public Object validator(ProceedingJoinPoint pjp) throws Throwable {
        try {
            String traceId = TraceUtils.begin();
            MDC.put("mdc_trace_id", traceId);
            Object obj = pjp.proceed(args);
            return obj;
        } catch(Throwable e) {
            //TODO
            處理錯誤
        } finally {
            TraceUtils.endTrace();
        }
    }    

   代碼通過AOP記錄了每次請求的traceIdm並使用變量"mdc_trace_id"記錄,在日志配置文件裡需要設置變量才能將"mdc_trace_id"輸出到日志文件中。我以logback配置文件為例,看日志第10行%X{mdc_trace_id}:

  <appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${CATALINA_BASE}/logs/all.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${CATALINA_BASE}/logs/all.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- keep 30 days' worth of history -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - traceId:[%X{mdc_trace_id}] - %msg%n</pattern>
        </encoder>
    </appender>

MDC帶來的好處

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved