如果你使用了log4j,你会注意到有许多方法来记录消息,例如:
1logger.trace("My Log message");
2logger.debug("My Log message");
3logger.info("My Log message");
实际上,它们相当于 log4j 级别。
Log4j 级别
Log4j提供了许多日志级别. 下面是完整列表。
- TRACE: TRACE 级别指定比 DEBUG 更精细的信息事件
- DEBUG: DEBUG 级别指定用于调试应用程序最有用的精细的信息事件
- INFO:INFO 级别指定信息消息,突出应用程序在粗糙的层面 的进展
- WARN: WARN 级别指定潜在的有害情况
- ERROR: ERROR 级别指定错误事件,可能仍然允许应用程序继续运行
- 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.LevelMatchFilter
和org.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
,可以用来拒绝在特定范围之外优先级的消息。