Log4j 级别示例 - 顺序、优先级、自定义过滤器

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

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

实际上,它们相当于 log4j 级别

Log4j 级别

Log4j提供了许多日志级别. 下面是完整列表。

  1. TRACE: TRACE 级别指定比 DEBUG 更精细的信息事件
  2. DEBUG: DEBUG 级别指定用于调试应用程序最有用的精细的信息事件
  3. INFO:INFO 级别指定信息消息,突出应用程序在粗糙的层面 的进展
  4. WARN: WARN 级别指定潜在的有害情况
  5. ERROR: ERROR 级别指定错误事件,可能仍然允许应用程序继续运行
  6. FATAL: FATAL 级别设计非常严重的错误事件

ALL和OFF是特殊的记录级别,应该在极端情况下使用,我从来没有亲自使用过这些。

Log4j 级别顺序/优先级

Trace 是最低优先级的,而 Fatal 是最高优先级的。下方是 log4j 日志级的顺序。 Trace < Debug < Info < Warn < Error < Fatal. 当我们定义日志级时,任何具有较高优先级的日志都也会被打印。

Log4j 过滤器

假设我们只想记录 INFO 和 FATAL 事件,而不是 WARN 和 ERROR 事件. 在这些场景中,我们可以使用 log4j 过滤器。

 1package com.journaldev.log4j.filters;
 2
 3import org.apache.log4j.Level;
 4import org.apache.log4j.spi.Filter;
 5import org.apache.log4j.spi.LoggingEvent;
 6
 7public class MyLog4jFilter extends Filter {
 8
 9    /**
10     * My custom filter to only log INFO and FATAL events
11     */
12    @Override
13    public int decide(LoggingEvent event) {
14    	if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL)
15    	return ACCEPT;
16    	else return DENY;
17    }
18
19}

上方的自定义过滤器只会记录 INFO 和 FATAL 事件,下方为此提供 XML log4j 配置。

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 3
 4<log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/"
 5    debug="false">
 6
 7<!-- console appender -->
 8<appender name="console" class="org.apache.log4j.ConsoleAppender">
 9    <param name="Target" value="System.out" />
10    <layout class="org.apache.log4j.PatternLayout">
11    	<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
12    </layout>
13    <filter class="com.journaldev.log4j.filters.MyLog4jFilter" />
14</appender>
15
16<logger name="com.journaldev.log4j" additivity="false">
17    <level value="TRACE" />
18    <appender-ref ref="console" />
19</logger>
20
21<root>
22    <priority value="DEBUG" />
23    <appender-ref ref="console" />
24</root>
25
26</log4j:configuration>

请注意在控制台附件中使用过滤器类别. 下面是一个简单的类进行基本日志。

 1package com.journaldev.log4j.main;
 2
 3import org.apache.log4j.Logger;
 4import org.apache.log4j.PropertyConfigurator;
 5import org.apache.log4j.xml.DOMConfigurator;
 6
 7public class Log4jExample {
 8
 9    static {
10    	init();
11    }
12
13    private final static Logger logger = Logger.getLogger(Log4jExample.class);
14
15    public static void main(String[] args) {
16    	logger.trace("My Trace Log");
17    	logger.debug("My Debug Log");
18    	logger.info("My Info Log");
19    	logger.warn("My Warn Log");
20    	logger.error("My error log");
21    	logger.fatal("My fatal log");
22    }
23
24    /**
25     * method to init log4j configurations
26     */
27    private static void init() {
28    	DOMConfigurator.configure("log4j.xml");
29    }
30
31}

在运行此程序时,它将下面的日志生成到控制台中。

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

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

 1<appender name="console" class="org.apache.log4j.ConsoleAppender">
 2    <param name="Target" value="System.out" />
 3    <layout class="org.apache.log4j.PatternLayout">
 4    	<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
 5    </layout>
 6    <filter class="org.apache.log4j.varia.LevelMatchFilter">
 7    	<param name="LevelToMatch" value="INFO" />
 8        	<param name="AcceptOnMatch" value="true" />
 9    </filter>
10    <filter class="org.apache.log4j.varia.LevelMatchFilter">
11    	<param name="LevelToMatch" value="FATAL" />
12        	<param name="AcceptOnMatch" value="true" />
13    </filter>
14    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
15</appender>

我们还有一类org.apache.log4j.varia.LevelRangeFilter,可以用来拒绝在特定范围之外优先级的消息。

Published At
Categories with 技术
Tagged with
comments powered by Disqus