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>
            &lt;!&ndash;
                onMatch="ACCEPT" 表示匹配该级别及以上
                onMatch="DENY" 表示不匹配该级别及以上
                onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
                onMismatch="ACCEPT" 表示匹配该级别以下
                onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
                onMismatch="DENY" 表示不匹配该级别以下的
            &ndash;&gt;
            <onMatch>ACCEPT</onMatch>
            &lt;!&ndash;<onMismatch>DENY</onMismatch>&ndash;&gt;
        </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>

猜你喜欢

转载自www.cnblogs.com/yangche/p/10338707.html