logback之自定义过滤器

logback有两种过滤器,一种是context中的过滤器叫TurboFilter,是一个全局的过滤器,会影响所有的日志记录。另一种是Appender中的过滤器,只对所在的append有效。两者大同小异,这里我们以Appender的过滤器为例。

(一)自定义一个过滤器

我们先实现一个LevelRangeFilter,目的是对日志区间进行过滤,只有在[minLevel,maxLevel)中的日志事件才允许输出到日志文件中,如下:

package com.mall.common.log;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.AbstractMatcherFilter;
import ch.qos.logback.core.spi.FilterReply;

/**
 * @author Lft
 * @since 2024/12/30 21:49
 */
public class LevelRangeFilter extends AbstractMatcherFilter<ILoggingEvent> {
    Level minLevel;
    Level maxLevel;

    @Override
    public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
            return FilterReply.NEUTRAL;
        }
        if (minLevel == null) {
            if (!event.getLevel().isGreaterOrEqual(maxLevel)) {
                return onMatch;
            } else {
                return onMismatch;
            }
        } else if (maxLevel == null) {
            if (event.getLevel().isGreaterOrEqual(minLevel)) {
                return onMatch;
            } else {
                return onMismatch;
            }
        }

        if (event.getLevel().isGreaterOrEqual(minLevel) && !event.getLevel().isGreaterOrEqual(maxLevel)) {
            return onMatch;
        } else {
            return onMismatch;
        }
    }

    public void setMinLevel(Level minLevel) {
        this.minLevel = minLevel;
    }

    public void setMaxLevel(Level maxLevel) {
        this.maxLevel = maxLevel;
    }

    public void start() {
        if (this.minLevel != null || this.maxLevel != null) {
            super.start();
        }
    }
}

过滤器的过滤方法decide很简单,只是对日志事件的级别进行判断,是否在[minLevel,maxLevel)进行判断,支持[,maxLevel)以及[minLevel,)。

几个注意事项:

(1)过滤器必须实现Filter接口,这里建议继承AbstractMatcherFilter

(2)minLevel和maxLevel这两个属性是自定义的,需要在xml配置文件中配置,那么需要提供set方法,以便xml解析时能够通过隐式规则进行设置。

(3)提供start方法,更符合它的设计理念。

(二)xml配置文件配置过滤器

<configuration scan="true" scanPeriod="1 minute" debug="true">
    <!--<turboFilter class=""/>-->
    <!-- Appenders -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/logback.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory> <!-- 保留最近30天的日志文件 -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="impossible" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/impossible.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>impossible.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>

        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} %msg%n</pattern>
        </encoder>
        <filter class="com.mall.common.log.LevelRangeFilter">
            <minLevel>WARN</minLevel>
            <maxLevel>ERROR</maxLevel>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <logger name="impossible" additivity="false">
        <appender-ref ref="impossible"/>
    </logger>

    <!-- Root Logger -->
    <root level="Info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="ROLLING"/>
    </root>
</configuration>

过滤器配置日志级别是[WARN,ERROR),所以只会输出WARN级别日志。

使用如上测试程序,运行如下:

ps:日志过滤器如何生效的源码,在上一篇《logback日志框架源码分析》中的第四节-打印日志中有详细介绍,想了解的可转到那篇进行了解,这里不再重复介绍

相关推荐
Mr_sun.13 天前
Logback日志文件详细配置
java·spring boot·logback
m0_7482350715 天前
springboot中配置logback-spring.xml
spring boot·spring·logback
m0_5127446415 天前
springboot使用logback自定义日志
java·spring boot·logback
m0_7482340816 天前
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
java·spring boot·logback
林犀居士17 天前
logback日志自定义占位符
java·logback·链路追踪
uncleqiao18 天前
4.JoranConfigurator解析logbak.xml
logback·slf4j
m0_7482356119 天前
【SpringBoot】【log】 自定义logback日志配置
java·spring boot·logback
青灯文案119 天前
SpringBoot 项目中配置日志系统文件 logback-spring.xml 原理和用法介绍
spring boot·spring·logback
Mr_sun.19 天前
Day09-后端Web实战——部门管理开发&Logback日志技术
前端·logback
七禾页话23 天前
Spring Boot 3.x 整合 Logback 日志框架(支持异步写入)
spring boot·logback