Log4j日志级别完全指南:排序、优先级与自定义过滤器详解

这是文章《Log4j 日志级别示例 – 排序,优先级,自定义过滤器》的第1部分(共1部分)。

内容片段: 如果你使用过Log4j,你会注意到有许多方法来记录消息。例如:

logger.trace("我的日志消息");
logger.debug("我的日志消息");
logger.info("我的日志消息");

实际上它们对应于Log4j的日志级别。

Log4j 日志级别

Log4j提供了多种日志级别。以下是完整的列表:

  • TRACE级别:用于指定比DEBUG级别更精细的信息事件。
  • DEBUG级别:用于指定对调试应用程序最有用的精细信息事件。
  • INFO级别:用于指定突出显示应用程序进展的粗粒度信息消息。
  • WARN级别:用于指定潜在的有害情况。
  • ERROR级别:用于指定可能仍然允许应用程序继续运行的错误事件。
  • FATAL级别:用于指定非常严重的错误事件,可能导致应用程序中止。
  • ALL级别:具有最低的优先级,旨在开启所有日志记录。
  • OFF级别:具有最高的优先级,旨在关闭日志记录。

ALL和OFF是特殊的日志级别,应该在极端情况下使用。我个人从未在任何项目中使用过它们。

Log4j的级别顺序/优先级

Trace(跟踪)的优先级最低,而Fatal(致命)的优先级最高。以下是Log4j的日志级别顺序:

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

当我们定义日志器级别时,任何具有更高优先级的日志也会被打印出来。例如,如果日志器级别设置为INFO,则DEBUG日志将不会被打印出来,但WARN日志会因为具有更高优先级而被打印出来。

Log4j 过滤器

假设我们只想记录INFO(信息)和FATAL(致命)级别的事件,而不记录WARN(警告)和ERROR(错误)级别的事件。在这种情况下,我们可以利用Log4j的过滤器(Filter)来实现。我们可以扩展org.apache.log4j.spi.Filter类,并实现它的decide(LoggingEvent event)方法来提供自定义的过滤能力。

package com.Olivia.log4j.filters;

import org.apache.log4j.Level;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class MyLog4jFilter extends Filter {

    /**
     * 我自定义的过滤器,仅记录INFO和FATAL级别的事件
     */
    @Override
    public int decide(LoggingEvent event) {
        if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL)
            return ACCEPT;
        else return DENY;
    }

}

以上自定义过滤器仅记录INFO和FATAL级别的事件,下面是相应的Log4j XML配置。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/"
    debug="false">

    <!-- 控制台附加器 -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
        </layout>
        <filter class="com.Olivia.log4j.filters.MyLog4jFilter" />
    </appender>

    <logger name="com.Olivia.log4j" additivity="false">
        <level value="TRACE" />
        <appender-ref ref="console" />
    </logger>

    <root>
        <priority value="DEBUG" />
        <appender-ref ref="console" />
    </root>

</log4j:configuration>

请注意控制台附加器(appender)中Filter类的使用。以下是一个简单的类,用于进行基本的日志记录。

package com.Olivia.log4j.main;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

public class Log4jExample {

    static {
        init();
    }

    private final static Logger logger = Logger.getLogger(Log4jExample.class);

    public static void main(String[] args) {
        logger.trace("我的跟踪日志");
        logger.debug("我的调试日志");
        logger.info("我的信息日志");
        logger.warn("我的警告日志");
        logger.error("我的错误日志");
        logger.fatal("我的致命日志");
    }

    /**
     * 初始化Log4j配置的方法
     */
    private static void init() {
        DOMConfigurator.configure("log4j.xml");
    }

}

运行此程序时,会在控制台生成以下日志:

INFO  Log4jExample - 我的信息日志
FATAL Log4jExample - 我的致命日志

我们可以通过创建自定义的过滤器类来进行更复杂的过滤。请注意,在这种情况下,我们可以使用以下附加器中显示的org.apache.log4j.varia.LevelMatchFilterorg.apache.log4j.varia.DenyAllFilter类。

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="INFO" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="FATAL" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>

我们还有一个可以用来拒绝优先级超出特定范围的消息的org.apache.log4j.varia.LevelRangeFilter类。以上就是关于Log4j日志级别和过滤器的简要介绍。

参考资料:

  • Log4j级别API文档
  • Log4j自定义过滤器 – StackOverflow
bannerAds