使用logback實(shí)現(xiàn)日志打印過(guò)濾
logback日志打印過(guò)濾
1.只打印sql語(yǔ)句以及參數(shù)
<?xml version="1.0" encoding="UTF-8" ?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 設(shè)置 logger context 名稱(chēng),一旦設(shè)置不可改變,默認(rèn)為default --> <!-- <contextName>myAppName</contextName> --> <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" /> <!-- 日志文件大小最大值 --> <property name="maxFileSize" value="1kb" /> <!-- LoggerContextListener 接口的實(shí)例能監(jiān)聽(tīng) logger context 上發(fā)生的事件,比如說(shuō)日志級(jí)別的變化 --> <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>
上面有兩個(gè)過(guò)濾器,
其中第一個(gè)過(guò)濾器是過(guò)濾掉所有包含字符串“mapper”,“component”,“MapperFactoryBean”的日志打印
第二個(gè)過(guò)濾器是只打印包含字符串”P(pán)reparing”,”P(pán)aramters:”,”Total:”的日志內(nèi)容。
logback.xml日志文件過(guò)濾器配置簡(jiǎn)析
自定義過(guò)濾器
java代碼,目的是在mdc中放值,然后在日志中打印
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級(jí)別日志-----"); logger.debug("-----debug級(jí)別日志-----"); logger.info("-----info級(jí)別日志-----"); logger.warn("-----warn級(jí)別日志-----"); logger.error("-----error級(jí)別日志-----"); return JsonData.buildSuccess(); } @RequestMapping(path = "test2") public Object logTest2(){ MDC.put("name","yangche"); MDC.put("age","25"); MDC.put("like","wujing"); logger.trace("-----trace級(jí)別日志-----"); logger.debug("-----debug級(jí)別日志-----"); logger.info("-----info級(jí)別日志-----"); logger.warn("-----warn級(jí)別日志-----"); logger.error("-----error級(jí)別日志-----"); logger.info(""); MDC.clear(); return JsonData.buildSuccess(); } }
寫(xiě)一個(gè)過(guò)濾器
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; } } }
以上過(guò)濾器要繼承Filter<ILoggingEvent>,在變量event中可以取到mdc的數(shù)據(jù),msg,等等等等,可以用java對(duì)日志進(jìn)行自定義的判斷,過(guò)濾不需要的過(guò)濾器,對(duì)日志內(nèi)容進(jìn)行替換等等,隨心所欲。
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!--控制臺(tái)日志--> <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級(jí)別日志--> <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> <!-- 設(shè)置滾動(dòng)策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 路徑 --> <fileNamePattern>log/app.err.%d.log</fileNamePattern> <!-- 控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件,假設(shè)設(shè)置每個(gè)月滾動(dòng), 且<maxHistory> 是1,則只保存最近1個(gè)月的文件,刪除之前的舊文件 --> <MaxHistory>1</MaxHistory> </rollingPolicy> </appender> <!--INFO級(jí)別日志--> <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <!– onMatch="ACCEPT" 表示匹配該級(jí)別及以上 onMatch="DENY" 表示不匹配該級(jí)別及以上 onMatch="NEUTRAL" 表示該級(jí)別及以上的,由下一個(gè)filter處理,如果當(dāng)前是最后一個(gè),則表示匹配該級(jí)別及以上 onMismatch="ACCEPT" 表示匹配該級(jí)別以下 onMismatch="NEUTRAL" 表示該級(jí)別及以下的,由下一個(gè)filter處理,如果當(dāng)前是最后一個(gè),則不匹配該級(jí)別以下的 onMismatch="DENY" 表示不匹配該級(jí)別以下的 –> <onMatch>ACCEPT</onMatch> <!–<onMismatch>DENY</onMismatch>–> </filter>--> <filter class="com.filter.SimpleLogFilter"/> <!--我寫(xiě)的過(guò)濾器,過(guò)濾的是mdc中name的值為空的日志內(nèi)容,所以所有name為空值的不會(huì)被打印--> <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> <!-- 滾動(dòng)策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 路徑 --> <fileNamePattern>log/app.info.%d.log</fileNamePattern> </rollingPolicy> </appender> <!--root level最低級(jí)別--> <root level="INFO"> <appender-ref ref="consoleApp"/> <appender-ref ref="fileInfoApp"/> <appender-ref ref="fileErrorApp"/> </root> </configuration>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
六個(gè)Java集合使用時(shí)需要注意的事項(xiàng)
這篇文章主要為大家詳細(xì)介紹了六個(gè)Java集合使用時(shí)需要注意的事項(xiàng),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java有一定的幫助,需要的可以參考一下2023-01-01SpringBoot集成Redis的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot集成Redis的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11IDEA創(chuàng)建方法時(shí)如何快速添加注釋
這篇文章主要介紹了IDEA創(chuàng)建方法時(shí)如何快速添加注釋問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02IDEA2020.1使用LeetCode插件運(yùn)行并調(diào)試本地樣例的方法詳解
這篇文章主要介紹了IDEA2020.1使用LeetCode插件運(yùn)行并調(diào)試本地樣例的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09