MDC实现traceId日志追踪


分布式系统中,最棘手的问题往往是日志跟踪, 多台机器多个server,调用链的关系、连续性显得格外重要。我们需要一个唯一标识来记录每条日志的输出,并希望其传递下去。
一个很简单的方式就是集中在日志中。

package com.log;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.MDC;

/**
 * 统一日志追踪
 */

@Slf4j
@Component
@Aspect
public class TraceIdHandler {

    private static final String TRACE_ID = "traceId";

    @Before(value = "execution(* com..*.*(..))")
    public void excuteBefore() {
        if (StringUtils.isBlank(MDC.get(TRACE_ID))) {
            String traceId = IdGenerator.get() + "-" + ((int) ((Math.random() * 9 + 1) * 100000));
            MDC.put(TRACE_ID, traceId);
        }
    }
}

关键是--> [%X{traceId}]
                         fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line][%X{traceId} %X{uid} %X{fundAccount}] - %msg%n" />





需要添加依赖slf4j【slf4j的作用参考:】:


            org.apache.logging.log4j
            log4j-slf4j-impl
            2.6.2
            true