文章目录
SpringBoot 集成 Logback+ MDC请求追踪 + EvaluatorFilter编写Java代码过滤条件
引入依赖
用于支持EvaluatorFilter编写Java代码
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.1.9</version>
</dependency>
logback-dev.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<!--定义日志文件的存储地址(绝对路径) -->
<property name="log_home" value="D:/LOG/" />
<!--生成日志的名称-->
<property name="project_name" value="test-demo" />
<!-- 日志输出到控制台 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 彩色日志 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%X{requestId}] [%X{token}] [%thread] %magenta(%-5level) %green([%-50.50class]) >>> %cyan(%msg) %n
</pattern>
</layout>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
<!-- 日志过滤某些包或某些类不打印 -->
<expression>
if (logger.startsWith("com.test.demo.controller.api") || logger.contains("TestController")) {
return true;
}
return false;
</expression>
</evaluator>
<!-- 匹配直接用DENY抛弃不打印 -->
<OnMatch>DENY</OnMatch>
<OnMismatch>ACCEPT</OnMismatch>
</filter>
</appender>
<!-- 日志输出到文件(每天生成) -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log_home}/${project_name}.%d{yyyy-MM-dd}.%i.log </FileNamePattern>
<MaxHistory>30</MaxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>400MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%X{token}] [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
<logger name="org.hibernate.validator" level="INFO"/>
<!-- 设置项目的 Mybatis Mapper的sql能打印 -->
<logger name="com.test.demo.mapper" level="DEBUG" />
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</configuration>
application.yml 配置
logging:
config: classpath:logback-dev.xml
配置MDC过滤器
import cn.hutool.core.util.IdUtil;
import org.slf4j.MDC;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 日志MDC Filter
*/
public class LogMdcFilter implements Filter {
public static final String REQUEST_ID = "requestId";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//这里用了Hutool的id工具生成,如果没这个依赖,用默认的UUID工具生成即可
MDC.put(REQUEST_ID, IdUtil.simpleUUID());
String userCode = null;
if ( servletRequest instanceof HttpServletRequest) {
var httpRequest = ((HttpServletRequest) servletRequest);
var s = httpRequest.getHeaderNames();
userCode = httpRequest.getHeader("x-demo-token");
}
//对应logback-dev.xml配置的参数Key名称
MDC.put("token", userCode);
filterChain.doFilter(servletRequest, servletResponse);
MDC.remove(REQUEST_ID);
MDC.remove("token");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
配置过滤器顺序(在Filter使用注解设置顺序有时会失效)
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import javax.servlet.Filter;
@Configuration
public class FilterConfig {
@Bean
public Filter logMdcFilter() {
return new LogMdcFilter();
}
@Bean
public FilterRegistrationBean registrLogMdcFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter( logMdcFilter() );
registration.addUrlPatterns("/*");
registration.setName("logMdcFilter");
registration.setAsyncSupported(true);
//顺序越小,优先级越高(后续加入的Filter设置比这个值大即可)
registration.setOrder(0);
return registration;
}
}
运行项目显示日志结果
23-03-25 15:30:04 [e97f247deec544bbba26cdcbe0db5f29] [testToken123] [http-nio-9800-exec-2] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger ] >>> ==> Preparing: SELECT * FROM USER WHERE USER_CODE = ?
23-03-25 15:30:04 [e97f247deec544bbba26cdcbe0db5f29] [testToken123] [http-nio-9800-exec-2] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger ] >>> ==> Parameters: testUser(String)