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>