夕辞

Apache log4j学习之一:日志级别顺序 | 夕辞夕辞

Apache log4j学习之一:日志级别顺序

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

回到顶部