如何使用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>
上面有两个过滤器,
其中第一个过滤器是过滤掉所有包含字符串“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实现日志打印过滤”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!
目录
推荐阅读
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~