美文网首页
聊聊logback的ThresholdFilter

聊聊logback的ThresholdFilter

作者: go4it | 来源:发表于2023-11-20 08:53 被阅读0次

    本文主要研究一下logback的ThresholdFilter

    ThresholdFilter

    ch/qos/logback/classic/filter/ThresholdFilter.java

    public class ThresholdFilter extends Filter<ILoggingEvent> {
    
        Level level;
    
        @Override
        public FilterReply decide(ILoggingEvent event) {
            if (!isStarted()) {
                return FilterReply.NEUTRAL;
            }
    
            if (event.getLevel().isGreaterOrEqual(level)) {
                return FilterReply.NEUTRAL;
            } else {
                return FilterReply.DENY;
            }
        }
    
        public void setLevel(String level) {
            this.level = Level.toLevel(level);
        }
    
        public void start() {
            if (this.level != null) {
                super.start();
            }
        }
    }
    

    ThresholdFilter继承了Filter,其decide方法从ILoggingEvent获取level,若该level大于等于指定的level则返回NEUTRAL,否则返回DENY

    isGreaterOrEqual

    ch/qos/logback/classic/Level.java

    public final class Level implements java.io.Serializable {
    
        private static final long serialVersionUID = -814092767334282137L;
    
        public static final int OFF_INT = Integer.MAX_VALUE;
        public static final int ERROR_INT = 40000;
        public static final int WARN_INT = 30000;
        public static final int INFO_INT = 20000;
        public static final int DEBUG_INT = 10000;
        public static final int TRACE_INT = 5000;
        public static final int ALL_INT = Integer.MIN_VALUE;
    
        /**
         * The <code>OFF</code> is used to turn off logging.
         */
        public static final Level OFF = new Level(OFF_INT, "OFF");
    
        /**
         * The <code>ERROR</code> level designates error events which may or not be
         * fatal to the application.
         */
        public static final Level ERROR = new Level(ERROR_INT, "ERROR");
    
        /**
         * The <code>WARN</code> level designates potentially harmful situations.
         */
        public static final Level WARN = new Level(WARN_INT, "WARN");
    
        /**
         * The <code>INFO</code> level designates informational messages highlighting
         * overall progress of the application.
         */
        public static final Level INFO = new Level(INFO_INT, "INFO");
    
        /**
         * The <code>DEBUG</code> level designates informational events of lower
         * importance.
         */
        public static final Level DEBUG = new Level(DEBUG_INT, "DEBUG");
    
        /**
         * The <code>TRACE</code> level designates informational events of very low
         * importance.
         */
        public static final Level TRACE = new Level(TRACE_INT, "TRACE");
    
        /**
         * The <code>ALL</code> is used to turn on all logging.
         */
        public static final Level ALL = new Level(ALL_INT, "ALL");
    
        public final int levelInt;
        public final String levelStr;
    
        /**
         * Instantiate a Level object.
         */
        private Level(int levelInt, String levelStr) {
            this.levelInt = levelInt;
            this.levelStr = levelStr;
        }
    
        /**
         * Returns <code>true</code> if this Level has a higher or equal Level than the
         * Level passed as argument, <code>false</code> otherwise.
         */
        public boolean isGreaterOrEqual(Level r) {
            return levelInt >= r.levelInt;
        }
    
        //......
    }    
    

    Level定义了OFF(Integer.MAX_VALUE)、ERROR(40000)、WARN(30000)、INFO(20000)、DEBUG(10000)、TRACE(5000)、ALL(Integer.MIN_VALUE)这几个level,其int值依次减小。isGreaterOrEqual方法则是根据levelInt值来判断。

    示例

        <appender name="FILE_INFO"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>infoLog.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>infoLogs.%d{yyyy-MM-dd}.log</fileNamePattern>
    
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
    
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
    
            <encoder>
                <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n
                </pattern>
            </encoder>
        </appender>
    

    这里对FILE_INFO添加了ThresholdFilter,只有级别大于等于INFO的才打印

    小结

    logback的ThresholdFilter继承了Filter,其decide方法从ILoggingEvent获取level,若该level大于等于指定的level则返回NEUTRAL,否则返回DENY。Level定义了OFF(Integer.MAX_VALUE)、ERROR(40000)、WARN(30000)、INFO(20000)、DEBUG(10000)、TRACE(5000)、ALL(Integer.MIN_VALUE)这几个level,其int值依次减小。isGreaterOrEqual方法则是根据levelInt值来判断。

    相关文章

      网友评论

          本文标题:聊聊logback的ThresholdFilter

          本文链接:https://www.haomeiwen.com/subject/ikcvwdtx.html