首先,先学习下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,所以还是比较简单的。