Log4j级别示例–订单,优先级,自定义过滤器

时间:2020-02-23 14:37:19  来源:igfitidea点击:

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

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

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

Log4j级别

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

  • 跟踪:"跟踪级别"比"调试"指定更详细的信息事件。

  • 调试:调试级别指定对调试应用程序最有用的细粒度信息事件。

  • INFO:INFO级别指定信息性消息,以粗粒度级别突出显示应用程序的进度。

  • 警告:警告级别表示潜在的有害情况。

  • 错误:错误级别指定可能仍允许应用程序继续运行的错误事件。

  • 严重:致命级别指示非常严重的错误事件,可能会导致应用程序中止。

  • ALL:ALL具有最低的等级,旨在打开所有日志记录。

  • OFF:OFF具有最高级别,旨在关闭日志记录。

ALL和OFF是特殊的日志记录级别,应在极端情况下使用。
我从未在任何时间亲自使用过这些。

Log4j级别顺序/优先级

跟踪的优先级最低,而致命的优先级最高。
下面是log4j日志记录级别的顺序。

跟踪<调试<信息<警告<错误<致命。

当我们定义记录器级别时,具有更高优先级日志的任何内容也会被打印出来。
例如,如果记录器级别为INFO,则不会打印调试日志,但是会打印警告日志,因为优先级更高。

Log4j过滤器

假设我们只想记录INFO和FATAL事件,而不要记录WARN和ERROR事件。
在这些情况下,我们可以利用log4j过滤器。
我们可以扩展org.apache.log4j.spi.Filter类,并实现其Decide(LoggingEvent event)方法来提供自定义过滤功能。

package com.theitroad.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事件,下面是此事件的XML log4j配置。

<?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.theitroad.log4j.filters.MyLog4jFilter" 
</appender>

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

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

</log4j:configuration>

注意控制台附加程序中Filter类的用法。
下面是执行基本日志记录的简单类。

package com.theitroad.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"类,可用于拒绝优先级超出特定范围的消息。