1、编写过滤器

复制代码
package com.example.demo.filter;

import org.slf4j.MDC;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;

public class FilterGobalTraceId implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化操作
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            String oldTraceId = httpRequest.getHeader("traceId");

            if(!StringUtils.isEmpty(oldTraceId)){
                MDC.put("traceId",oldTraceId);
            }else {
                // 生成唯一的traceId
                MDC.put("traceId", generateTraceId());
            }
            chain.doFilter(request, response);
        } finally {
            // 清除MDC的traceId值,确保在请求结束后不会影响其他请求的日志
            MDC.remove("traceId");
        }
    }

    @Override
    public void destroy() {
        // 清理操作
    }

    private String generateTraceId() {
        // 在此处生成唯一的traceId,并返回
        return UUID.randomUUID().toString();
    }
}
复制代码

 

 

2、配置过滤器注册ben,并把过滤器注册

复制代码
package com.example.demo.filter;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GobalWebTraceIdConfig {
    @Bean
    public FilterRegistrationBean<FilterGobalTraceId> loggingFilter() {
        FilterRegistrationBean<FilterGobalTraceId> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new FilterGobalTraceId());
        registrationBean.addUrlPatterns("/*"); // 设置过滤的URL模式
        return registrationBean;
    }
}
复制代码

 

 

3、配置logback.xml配置文件

 

复制代码

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATTERN"
value="%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} [%highlight(%-5level)] [%boldYellow(%X{traceId})] [%boldYellow(%thread)] %boldGreen(%logger{36} %F.%L) %msg%n">
</property>

<property name="FILE_LOG_PATTERN"
value="%d{yyyy-MM-dd} %d{HH:mm:ss.SSS} [%-5level] [%X{traceId}] [%thread] %logger{36} %F.%L %msg%n">
</property>
<property name="FILE_PATH" value="D:/logs/demo.%d{yyyy-MM-dd}.%i.log" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>

</appender>

<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${FILE_PATH}</fileNamePattern>
<!-- keep 15 days' worth of history -->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 日志文件的最大大小 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>

<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>

<logger name="com.example.demo.controller" level="debug"></logger>
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
 
复制代码