使用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 名稱,一旦設(shè)置不可改變,默認(rèn)為default -->
<!-- <contextName>myAppName</contextName> -->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" />
<!-- 日志文件大小最大值 -->
<property name="maxFileSize" value="1kb" />
<!-- LoggerContextListener 接口的實(shí)例能監(jiān)聽 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ò)濾器是只打印包含字符串”Preparing”,”Paramters:”,”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();
}
}
寫一個(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"/> <!--我寫的過(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)文章
Java的JSON轉(zhuǎn)換庫(kù)GSON的基本使用方法示例
GSON是Google制作的一個(gè)可以讓Java對(duì)象與JSON互相轉(zhuǎn)換的類庫(kù),下面我們就來(lái)看一下Java的JSON轉(zhuǎn)換庫(kù)GSON的基本使用方法示例:2016-06-06
Spring boot使用spring retry重試機(jī)制的方法示例
這篇文章主要介紹了Spring boot使用spring retry重試機(jī)制的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Spring MVC入門_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Spring MVC入門,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
MyBatis-Plus自動(dòng)填充功能失效導(dǎo)致的原因及解決
這篇文章主要介紹了MyBatis-Plus自動(dòng)填充功能失效導(dǎo)致的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Java Swing JLabel標(biāo)簽的使用方法
這篇文章主要介紹了Java Swing JLabel標(biāo)簽的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
SpringBoot整合Ehcache3的實(shí)現(xiàn)步驟
本文主要介紹了SpringBoot整合Ehcache3的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

