Log4j 日志级别示例 – 排序,优先级,自定义过滤器

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

logger.trace("My Log message");
logger.debug("My Log message");
logger.info("My Log message");

实际上它们对应于log4j的级别。

Log4j 级别

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

    1. TRACE级别用于指定比DEBUG级别更精细的信息事件。

 

    1. DEBUG级别用于指定最有用于调试应用程序的精细信息事件。

 

    1. INFO级别用于指定突出显示应用程序进展的粗粒度信息消息。

 

    1. WARN级别用于指定潜在有害情况。

 

    1. ERROR级别用于指定可能仍然允许应用程序继续运行的错误事件。

 

    1. FATAL级别用于指定非常严重的错误事件,可能导致应用程序中止。

 

    1. ALL级别具有最低的排名,旨在开启所有日志记录。

 

    OFF级别具有最高的排名,旨在关闭日志记录。

所有和关闭是特殊的日志级别,应该在极端情况下使用。我个人在任何时间都没有使用过它们。

Log4j的级别顺序/优先级

跟踪(Trace)的优先级最低,而严重(Fatal)的优先级最高。以下是log4j的日志级别顺序。跟踪 < 调试(Debug) < 信息(Info) < 警告(Warn) < 错误(Error) < 严重。当我们定义日志器级别时,任何具有更高优先级的日志也会被打印出来。例如,如果日志器级别是信息(INFO),则调试日志将不会被打印出来,但警告日志会因为具有更高优先级而被打印出来。

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 {

	/**
	 * My custom filter to only log INFO and FATAL events
	 */
	@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">

<!-- console appender -->
<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("My Trace Log");
		logger.debug("My Debug Log");
		logger.info("My Info Log");
		logger.warn("My Warn Log");
		logger.error("My error log");
		logger.fatal("My fatal log");
	}

	/**
	 * method to init log4j configurations
	 */
	private static void init() {
		DOMConfigurator.configure("log4j.xml");
	}

}

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

INFO  Log4jExample - My Info Log
FATAL Log4jExample - My fatal log

我们可以通过创建自定义的过滤器类来进行更复杂的过滤。请注意,在这种情况下,我们可以使用以下附加器中显示的org.apache.log4j.varia.LevelMatchFilter和org.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 Level API
  • Log4j Custom Filter StackOverflow
发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds