使用logback实现日志打印过滤

logback日志打印过滤1.只打印sql语句以及参数

<?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中放值,然后在日志中打印

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();    }}

写一个过滤器

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对日志进行自定义的判断,过滤不需要的过滤器,对日志内容进行替换等等,随心所欲。

<?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>

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

“过去酒逢知已千杯少,现在酒逢千杯知已少”。

使用logback实现日志打印过滤

相关文章:

你感兴趣的文章:

标签云: