如果您使用过 log4j,您会注意到有很多方法来记录消息。例如:
logger.trace("My Log message");
logger.debug("My Log message");
logger.info("My Log message");
实际上它们对应的是log4j 级别.
Log4j 提供了许多日志记录级别。以下是完整列表。
-
TRACE:TRACE 级别指定比 DEBUG 更细粒度的信息事件。
-
DEBUG:调试级别指定对调试应用程序最有用的细粒度信息事件。
-
INFO:INFO 级别指定在粗粒度级别突出显示应用程序进度的信息消息。
-
WARN: WARN 级别表示潜在的有害情况。
-
ERROR:错误级别指定可能仍允许应用程序继续运行的错误事件。
-
FATAL:FATAL 级别表示非常严重的错误事件,可能会导致应用程序中止。
-
ALL:ALL 具有尽可能低的等级,旨在打开所有日志记录。
-
OFF:OFF 具有最高可能的等级,旨在关闭日志记录。
ALL 和 OFF 是特殊的日志记录级别,应在极端情况下使用。我个人从未在任何时候使用过这些。
Trace 的优先级最低,Fatal 的优先级最高。以下是 log4j 日志记录级别顺序。跟踪
假设我们只想记录 INFO 和 FATAL 事件,而不记录 WARN 和 ERROR 事件。在这些场景中,我们可以借助 log4j 过滤器。我们可以延长org.apache.log4j.spi.Filter
类并实现它decide(LoggingEvent event)
方法提供自定义过滤功能。
package com.journaldev.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.journaldev.log4j.filters.MyLog4jFilter" />
</appender>
<logger name="com.journaldev.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.journaldev.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
and 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 级别 API
- Log4j 自定义过滤器 StackOverflow
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)