springboot 使用filter 增加全局 traceId,方便日志查找

发布时间 2023-07-10 10:48:49作者: 蜗牛无敌

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_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>${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>