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中配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?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>