SpringBoot 集成 Logback+ MDC请求追踪 + EvaluatorFilter 编写Java代码过滤

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) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,非常感谢您的提问。以下是一个使用SpringBoot集成MongoDB和Logback实现日志存储的示例: 1. 添加依赖 在pom.xml中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> ``` 2. 配置MongoDB 在application.yml中添加以下内容: ```yaml spring: data: mongodb: uri: mongodb://localhost:27017/mydb ``` 其中,uri是MongoDB的连接URI,mydb是数据库的名称。 3. 配置Logbacklogback.xml中配置MongoDB的Appender: ```xml <appender name="MONGO" class="de.flapdoodle.embed.log.LogCollectorAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> ``` 其中,LogstashEncoder用于将日志信息转换为JSON格式,方便存储。 4. 配置Logger 在logback.xml中添加Logger: ```xml <logger name="com.example" additivity="false" level="INFO"> <!-- ConsoleAppender --> <appender-ref ref="STDOUT" /> <!-- MongoDBAppender --> <appender-ref ref="MONGO" /> </logger> ``` 其中,name为包名,level为日志记录的最低级别,可以根据实际情况设置。 5. 测试 使用Logging接口记录日志: ```java @Autowired private Logger logger; @Test public void testLogger() { logger.info("This is a test message."); } ``` 记录的日志信息将同时输出到控制台和MongoDB中。 希望以上内容能够对您有所帮助。如果您有其他问题,可以随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值