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日志框架源码分析》中的第四节-打印日志中有详细介绍,想了解的可转到那篇进行了解,这里不再重复介绍