首先,先学习下log4j级别的规则及定义。
在Apache log4j介绍中,我们了解到日志常用的级别为:debug、info、warn、error、fatal。
这些级别的顺序为:DEBUG < INFO < WARN < ERROR < FATAL。
下面我们通过一段示例代码来具体看下级别的顺序。
package com.zhuzhuodong.share.log4j.lesson1;
import com.zhuzhuodong.share.log4j.util.SystemUtil;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Lesson1 {
static Logger LOG = Logger.getLogger(Lesson1.class);
public static void main(String[] args) throws InterruptedException {
BasicConfigurator.configure();
Logger rootLogger = Logger.getRootLogger();
SystemUtil.systemErrPrintlnLogLevel(rootLogger);
allLevel();
rootLogger.setLevel(Level.INFO);
SystemUtil.systemErrPrintlnLogLevel(rootLogger);
allLevel();
rootLogger.setLevel(Level.ERROR);
SystemUtil.systemErrPrintlnLogLevel(rootLogger);
allLevel();
}
public static void allLevel() throws InterruptedException {
LOG.debug("FirstTest.debug");
LOG.info("FirstTest.info");
LOG.warn("FirstTest.warn");
LOG.error("FirstTest.error");
LOG.fatal("FirstTest.fatal");
}
}
我们可以看到,在以上示例代码中,主要包含以下几个步骤:
1.调用BasicConfigurator.configure()构建一个最简单的log4j配置,也就是直接输出到控制台
2.调用系统方法打印出log4j root logger级别信息
3.打印出所有级别的信息,然后再反复调高root logger日志级别,观察输出
以下是输出结果:
# SERR: logger:root level:DEBUG effectiveLevel:DEBUG # SERR: logger:com.zhuzhuodong.share.log4j.lesson1.Lesson1 level:null effectiveLevel:DEBUG 0 [main] DEBUG com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.debug 1 [main] INFO com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.info 1 [main] WARN com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.warn 1 [main] ERROR com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.error 1 [main] FATAL com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.fatal # SERR: logger:root level:INFO effectiveLevel:INFO # SERR: logger:com.zhuzhuodong.share.log4j.lesson1.Lesson1 level:null effectiveLevel:INFO 205 [main] INFO com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.info 205 [main] WARN com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.warn 205 [main] ERROR com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.error 205 [main] FATAL com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.fatal # SERR: logger:root level:ERROR effectiveLevel:ERROR # SERR: logger:com.zhuzhuodong.share.log4j.lesson1.Lesson1 level:null effectiveLevel:ERROR 416 [main] ERROR com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.error 416 [main] FATAL com.zhuzhuodong.share.log4j.lesson1.Lesson1 - FirstTest.fatal
可以看出,随着我们调高root logger级别,大于等于root logger日志级别的日志才会输出。
这个例子除了验证了日志级别以外,还有一个关于日志级别继承的知识点。因为我们没有对任何名字或者包名的logger分别级别,所以打印时的日志级别是直接继承了root logger的级别的,这个在下个例子中会着重学习。
最后,鉴于我们使用了BasicConfigurator.configure()来做最基本的控制台输出的日志配置,贴下相关源码来看下为什么root logger这样配置就可以输出内容到控制台。
static public void configure() {
Logger root = Logger.getRootLogger();
root.addAppender(new ConsoleAppender(
new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));
}
以上代码是源码,可以看出很简单,直接获取了root logger,然后添加了一个控制台输出的Appender,所以还是比较简单的。
