如何使用logback实现日志打印过滤

这篇文章主要为大家展示了“如何使用logback实现日志打印过滤”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用logback实现日志打印过滤”这篇文章吧。

logback日志打印过滤

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

<?xmlversion="1.0"encoding="UTF-8"?>
<configurationscan="true"scanPeriod="60seconds"debug="false">
<!--设置loggercontext名称,一旦设置不可改变,默认为default-->
<!--<contextName>myAppName</contextName>-->
<timestampkey="bySecond"datePattern="yyyyMMdd'T'HHmmss"/>
<!--日志文件大小最大值-->
<propertyname="maxFileSize"value="1kb"/>
<!--LoggerContextListener接口的实例能监听loggercontext上发生的事件,比如说日志级别的变化-->
<contextListenerclass="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
<!--encodersareassignedthetypech.qos.logback.classic.encoder.PatternLayoutEncoder
bydefault-->
<filterclass="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator><!--defaultstotypech.qos.logback.classic.boolex.JaninoEventEvaluator-->
<expression>returnmessage.contains("mapper")||message.contains("component")||message.contains("MapperFactoryBean");</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
<filterclass="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator><!--defaultstotypech.qos.logback.classic.boolex.JaninoEventEvaluator-->
<expression>returnmessage.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>
<loggername="java.sql.Statement"level="DEBUG"/>
<loggername="java.sql.PreparedStatement"level="DEBUG"/>
<loggername="com.xxx"level="debug"additivity="false">
<appender-refref="STDOUT"/>
</logger>
<root>
<appender-refref="STDOUT"/>
</root>
</configuration>

上面有两个过滤器,

如何使用logback实现日志打印过滤

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

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

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

自定义过滤器

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

packagecom.controller;
importcom.pojo.JsonData;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.slf4j.MDC;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(path="/api/log/")
publicclassLoggerController{
Loggerlogger=LoggerFactory.getLogger(getClass());
@RequestMapping(path="test1")
publicObjectlogTest1(){
logger.trace("-----trace级别日志-----");
logger.debug("-----debug级别日志-----");
logger.info("-----info级别日志-----");
logger.warn("-----warn级别日志-----");
logger.error("-----error级别日志-----");
returnJsonData.buildSuccess();
}
@RequestMapping(path="test2")
publicObjectlogTest2(){
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();
returnJsonData.buildSuccess();
}
}

写一个过滤器

packagecom.filter;
importch.qos.logback.classic.spi.ILoggingEvent;
importch.qos.logback.core.filter.Filter;
importch.qos.logback.core.spi.FilterReply;
importorg.springframework.util.StringUtils;
publicclassSimpleLogFilterextendsFilter<ILoggingEvent>{
@Override
publicFilterReplydecide(ILoggingEventevent){
System.err.println(event.getMDCPropertyMap().get("name"));
if(StringUtils.isEmpty(event.getMdc().get("name"))){
returnFilterReply.DENY;
}else{
returnFilterReply.NEUTRAL;
}
}
}

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

<?xmlversion="1.0"encoding="UTF-8"?>
<configuration>
<!--控制台日志-->
<appendername="consoleApp"class="ch.qos.logback.core.ConsoleAppender">
<layoutclass="ch.qos.logback.classic.PatternLayout">
<pattern>
%date{yyyy-MM-ddHH:mm:ss.SSS}%-5level[%thread]%logger{56}.%method:%L-%msg%n
</pattern>
</layout>
</appender>
<!--ERROR级别日志-->
<appendername="fileErrorApp"class="ch.qos.logback.core.rolling.RollingFileAppender">
<filterclass="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%date{yyyy-MM-ddHH:mm:ss.SSS}%-5level[%thread]%logger{56}.%method:%L-%msg%n
</pattern>
</encoder>
<!--设置滚动策略-->
<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>log/app.err.%d.log</fileNamePattern>
<!--控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
且<maxHistory>是1,则只保存最近1个月的文件,删除之前的旧文件-->
<MaxHistory>1</MaxHistory>
</rollingPolicy>
</appender>
<!--INFO级别日志-->
<appendername="fileInfoApp"class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--<filterclass="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>-->
<filterclass="com.filter.SimpleLogFilter"/>  <!--我写的过滤器,过滤的是mdc中name的值为空的日志内容,所以所有name为空值的不会被打印-->
<encoder>
<pattern>
%X{name}%X{age}%X{like}-----%date{yyyy-MM-ddHH:mm:ss.SSS}%-5level[%thread]%logger{56}.%method:%L-%msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>log/app.info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--rootlevel最低级别-->
<rootlevel="INFO">
<appender-refref="consoleApp"/>
<appender-refref="fileInfoApp"/>
<appender-refref="fileErrorApp"/>
</root>
</configuration>

以上是“如何使用logback实现日志打印过滤”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-07-29 21:58:25
收藏
分享
海报
0 条评论
179
上一篇:css外部文件的引用方式有哪些 下一篇:Go语言使用指针的示例分析
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码