1、在拦截器中 设置MDC 的变量

package com.sleep.demo.intercepter;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

@Slf4j
public class TraceInterceptor implements HandlerInterceptor {
    public static final String TRACE = "_trace";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String traceId = request.getHeader(TRACE);
        if (StringUtils.isBlank(traceId)) {
            traceId = UUID.randomUUID().toString().toUpperCase();
        }
        MDC.put("TRACE_ID", traceId);
        return true;
    }
}

2、在slf4j2.xml中配置

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <properties>

        <!-- 文件输出格式 -->
        <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread][%X{TRACE_ID}] - [%X{requestId}] %c [%L] -| %msg%n</property>

        <!-- 日志根目录 -->
        <property name="BASEDIR">D://mylog</property>
        <Property name="rollingLogSize">1000 MB</Property>
        <Property name="rollingLogMaxNum">10</Property>
    </properties>

    <appenders>
        <Console name="CONSOLE" target="system_out">
            <PatternLayout pattern="${PATTERN}" />
        </Console>
        <!-- 所有日志 -->
        <RollingRandomAccessFile fileName="${BASEDIR}/all.log" filePattern="${BASEDIR}/%d{yyyyMMdd}/all.%d{yyyyMMdd}-%i.log"
                                 immediateFlush="true" name="ALL_FILE">
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${rollingLogSize}"/>
            </Policies>
            <DefaultRolloverStrategy max="${rollingLogMaxNum}">
                <Delete basePath="${BASEDIR}" maxDepth="2">
                    <IfFileName glob="all.*.log"/>
                    <IfLastModified age="5D"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
        <!-- ERROR级别日志 -->
        <RollingRandomAccessFile fileName="${BASEDIR}/error.log" filePattern="${BASEDIR}/%d{yyyyMMdd}/error.%d{yyyyMMdd}-%i.log"
                                 immediateFlush="true" name="ERROR_FILE">
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${rollingLogSize}"/>
            </Policies>
            <DefaultRolloverStrategy max="${rollingLogMaxNum}">
                <Delete basePath="${BASEDIR}" maxDepth="2">
                    <IfFileName glob="error.*.log"/>
                    <IfLastModified age="5D"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>

        <RollingRandomAccessFile fileName="${BASEDIR}/warning.log" filePattern="${BASEDIR}/%d{yyyyMMdd}/warning.%d{yyyyMMdd}-%i.log"
                                 immediateFlush="true" name="WARN_FILE">
            <Filters>
                <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="${rollingLogSize}"/>
            </Policies>
            <DefaultRolloverStrategy max="${rollingLogMaxNum}">
                <Delete basePath="${BASEDIR}" maxDepth="2">
                    <IfFileName glob="error.*.log"/>
                    <IfLastModified age="5D"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
    </appenders>

    <loggers>
        <logger name="org.springframework" level="WARN" />
        <logger name="org.apache" level="WARN" />
        <logger name="io.netty" level="WARN" />

        <root level="DEBUG">
            <!-- 若不注释该打印,将可能会出现两次打印的情况,调试时使用 -->
            <appenderref ref="CONSOLE" />
            <appenderref ref="ALL_FILE" />
            <appenderref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE"/>
        </root>
    </loggers>

</configuration>