gpt4 book ai didi

使用logback实现日志打印过滤

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章使用logback实现日志打印过滤由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

logback日志打印过滤

1.只打印sql语句以及参数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<? xml version = "1.0" encoding = "UTF-8" ?>
< configuration scan = "true" scanPeriod = "60 seconds" debug = "false" >
     <!-- 设置 logger context 名称,一旦设置不可改变,默认为default -->
     <!-- <contextName>myAppName</contextName> -->
     < timestamp key = "bySecond" datePattern = "yyyyMMdd'T'HHmmss" />
     <!-- 日志文件大小最大值 -->
     < property name = "maxFileSize" value = "1kb" />
     <!-- LoggerContextListener 接口的实例能监听 logger context 上发生的事件,比如说日志级别的变化 -->
     < contextListener class = "ch.qos.logback.classic.jul.LevelChangePropagator" >
         < resetJUL >true</ resetJUL >
     </ contextListener >
     < appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender" >
         <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder
             by default -->
         < filter class = "ch.qos.logback.core.filter.EvaluatorFilter" >
             < evaluator > <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                 < expression >return message.contains("mapper") || message.contains("component") || message.contains("MapperFactoryBean");</ expression >
             </ evaluator >
             < OnMismatch >NEUTRAL</ OnMismatch >
             < OnMatch >DENY</ OnMatch >
         </ filter >
         < filter class = "ch.qos.logback.core.filter.EvaluatorFilter" >
             < evaluator > <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                 < expression >return message.contains("Preparing") || message.contains("Parameters:") || message.contains("Total:");</ expression >
             </ evaluator >
             < OnMismatch >DENY</ OnMismatch >
             < OnMatch >ACCEPT</ OnMatch >
         </ filter >
         < encoder >
             < pattern >%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
             </ pattern >
         </ encoder >
     </ appender >
     < logger name = "java.sql.Statement" level = "DEBUG" />
     < logger name = "java.sql.PreparedStatement" level = "DEBUG" />
     < logger name = "com.xxx" level = "debug" additivity = "false" >
         < appender-ref ref = "STDOUT" />
     </ logger >
     < root >
         < appender-ref ref = "STDOUT" />
     </ root >
</ configuration >

上面有两个过滤器, 。

其中第一个过滤器是过滤掉所有包含字符串“mapper”,“component”,“MapperFactoryBean”的日志打印 。

第二个过滤器是只打印包含字符串”Preparing”,”Paramters:”,”Total:”的日志内容.

logback.xml日志文件过滤器配置简析

自定义过滤器

java代码,目的是在mdc中放值,然后在日志中打印 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.controller;
import com.pojo.JsonData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping (path = "/api/log/" )
public class LoggerController {
     Logger logger= LoggerFactory.getLogger(getClass());
     @RequestMapping (path = "test1" )
     public Object logTest1(){
         logger.trace( "-----trace级别日志-----" );
         logger.debug( "-----debug级别日志-----" );
         logger.info( "-----info级别日志-----" );
         logger.warn( "-----warn级别日志-----" );
         logger.error( "-----error级别日志-----" );
         return JsonData.buildSuccess();
     }
     @RequestMapping (path = "test2" )
     public Object logTest2(){
         MDC.put( "name" , "yangche" );
         MDC.put( "age" , "25" );
         MDC.put( "like" , "wujing" );
         logger.trace( "-----trace级别日志-----" );
         logger.debug( "-----debug级别日志-----" );
         logger.info( "-----info级别日志-----" );
         logger.warn( "-----warn级别日志-----" );
         logger.error( "-----error级别日志-----" );
         logger.info( "" );
         MDC.clear();
         return JsonData.buildSuccess();
     }
}

写一个过滤器 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.filter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import org.springframework.util.StringUtils;
public class SimpleLogFilter extends Filter<ILoggingEvent> {
     @Override
     public FilterReply decide(ILoggingEvent event) {
         System.err.println(event.getMDCPropertyMap().get( "name" ));
         if (StringUtils.isEmpty(event.getMdc().get( "name" ))){
             return FilterReply.DENY;
         } else {
             return FilterReply.NEUTRAL;
         }
     }
}

以上过滤器要继承Filter<ILoggingEvent>,在变量event中可以取到mdc的数据,msg,等等等等,可以用java对日志进行自定义的判断,过滤不需要的过滤器,对日志内容进行替换等等,随心所欲.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<? xml version = "1.0" encoding = "UTF-8" ?>
< configuration >
     <!--控制台日志-->
     < appender name = "consoleApp" class = "ch.qos.logback.core.ConsoleAppender" >
         < layout class = "ch.qos.logback.classic.PatternLayout" >
             < pattern >
                 %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
             </ pattern >
         </ layout >
     </ appender >
     <!--ERROR级别日志-->
     < appender name = "fileErrorApp" class = "ch.qos.logback.core.rolling.RollingFileAppender" >
         < filter class = "ch.qos.logback.classic.filter.ThresholdFilter" >
             < level >ERROR</ level >
         </ filter >
         < encoder >
             < pattern >
                 %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
             </ pattern >
         </ encoder >
         <!-- 设置滚动策略 -->
         < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
             <!-- 路径 -->
             < fileNamePattern >log/app.err.%d.log</ fileNamePattern >
             <!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
             且<maxHistory> 是1,则只保存最近1个月的文件,删除之前的旧文件 -->
             < MaxHistory >1</ MaxHistory >
         </ rollingPolicy >
     </ appender >
     <!--INFO级别日志-->
     < appender name = "fileInfoApp" class = "ch.qos.logback.core.rolling.RollingFileAppender" >
         <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>INFO</level>
             <!–
                 onMatch="ACCEPT" 表示匹配该级别及以上
                 onMatch="DENY" 表示不匹配该级别及以上
                 onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
                 onMismatch="ACCEPT" 表示匹配该级别以下
                 onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
                 onMismatch="DENY" 表示不匹配该级别以下的
             –>
             <onMatch>ACCEPT</onMatch>
             <!–<onMismatch>DENY</onMismatch>–>
         </filter>-->
         < filter class = "com.filter.SimpleLogFilter" />   <!--我写的过滤器,过滤的是mdc中name的值为空的日志内容,所以所有name为空值的不会被打印-->
         < encoder >
             < pattern >
                 %X{name} %X{age} %X{like}-----%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
             </ pattern >
         </ encoder >
         <!-- 滚动策略 -->
         < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" >
             <!-- 路径 -->
             < fileNamePattern >log/app.info.%d.log</ fileNamePattern >
         </ rollingPolicy >
     </ appender >
     <!--root level最低级别-->
     < root level = "INFO" >
         < appender-ref ref = "consoleApp" />
         < appender-ref ref = "fileInfoApp" />
         < appender-ref ref = "fileErrorApp" />
     </ root >
</ configuration >

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/qq_26917447/article/details/81011315 。

最后此篇关于使用logback实现日志打印过滤的文章就讲到这里了,如果你想了解更多关于使用logback实现日志打印过滤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com