log4j| log4j-日志输出级别生效规则(rootLogger , Threshold ,指定包级别 和 指定类级别)

前言

在使用log4j中,经常需要配置不同的日志Appender的输出级别,比如希望在控制台打印info级别的日志,而在文件中打印error级别的日志等等.本文将细说 rootLogger , Threshold ,指定包级别指定类级别 的情况下日志级别的生效规则.

对于标准日志级别,我们有 ALL < TRACE < DEBUG <INFO <WARN <ERROR <FATAL <OFF的级别顺序.

本文使用的测试类如下:

package com.yveshe;

import org.apache.log4j.Logger;

/**
 * Hello world!
 */
public class Test {
    static Logger log = Logger.getLogger(Test.class.getName());

    public static void main(String[] args) {
        log.trace("This is trace record!");
        log.debug("This is debug record!");
        log.info("This is info record!");
        log.warn("This is warn record!");
        log.error("This is error record!");
        log.fatal("This is fatal record!");
    }
}

情景一:

# Define the root logger with appender file
log4j.rootLogger = DEBUG, STDOUT

# Define the stdout appender
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.conversionPattern=%d %-5p [%t] - %c -%m%n

# 指定Appender的日志等级阈值
log4j.appender.STDOUT.Threshold=warn

测试结果:

2019-10-10 14:05:41,915 WARN  [main] - com.yveshe.Test -This is warn record!
2019-10-10 14:05:41,916 ERROR [main] - com.yveshe.Test -This is error record!
2019-10-10 14:05:41,916 FATAL [main] - com.yveshe.Test -This is fatal record!

# Define the root logger with appender file
log4j.rootLogger = WARN, STDOUT

# Define the stdout appender
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.conversionPattern=%d %-5p [%t] - %c -%m%n

# 指定Appender的日志等级阈值
log4j.appender.STDOUT.Threshold=debug

测试结果:

2019-10-10 14:07:01,434 WARN  [main] - com.yveshe.Test -This is warn record!
2019-10-10 14:07:01,435 ERROR [main] - com.yveshe.Test -This is error record!
2019-10-10 14:07:01,435 FATAL [main] - com.yveshe.Test -This is fatal record!

情景二:

# Define the root logger with appender file
log4j.rootLogger = OFF, STDOUT

# Define the stdout appender
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.conversionPattern=%d %-5p [%t] - %c -%m%n

# 指定Appender的日志等级阈值
log4j.appender.STDOUT.Threshold=warn

# 限制指定包的日志级别
log4j.logger.com.yveshe=error

在没有配置指定包级别限制时,由于rootLogger=OFF,Threshold=warn,最终的结果是不会打印日志,但是由于配置了限制指定包的日志级别,最终会打印该包下的error级别的日志:

2019-10-10 14:09:47,370 ERROR [main] - com.yveshe.Test -This is error record!
2019-10-10 14:09:47,370 FATAL [main] - com.yveshe.Test -This is fatal record!

情景三:

# Define the root logger with appender file
log4j.rootLogger = OFF, STDOUT

# Define the stdout appender
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.conversionPattern=%d %-5p [%t] - %c -%m%n

# 指定Appender的日志等级阈值
log4j.appender.STDOUT.Threshold=warn

# 限制指定包的日志级别
log4j.logger.com.yveshe=error

# 限制指定类的日志级别
log4j.logger.com.yveshe.Test=debug

测试结果:

2019-10-10 14:16:36,940 WARN  [main] - com.yveshe.Test -This is warn record!
2019-10-10 14:16:36,941 ERROR [main] - com.yveshe.Test -This is error record!
2019-10-10 14:16:36,941 FATAL [main] - com.yveshe.Test -This is fatal record!

总结

1.在没有 指定包级别 也么有 指定类级别 的情况:

配置情况一:

# 省略其他设置

log4j.rootLogger = DEBUG, STDOUT
log4j.appender.STDOUT.Threshold=warn

由于debug <warn,所以Threshold阈值设置会生效.

配置情况一:

# 省略其他设置

log4j.rootLogger = OFF, STDOUT
log4j.appender.STDOUT.Threshold=warn

由于warn < OFF,所以Threshold阈值设置会无效
总结起来就是: 当只有 rootLogger 和 Threshold 设置了日志级别时,会将级别高设置生效.

2.在有 指定包级别指定类级别 的情况:

# Define the root logger with appender file
log4j.rootLogger = OFF, STDOUT

# Define the stdout appender
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.conversionPattern=%d %-5p [%t] - %c -%m%n

# 指定Appender的日志等级阈值
log4j.appender.STDOUT.Threshold=warn

# 限制指定包的日志级别 (比如: com.info.*)
log4j.logger.com.yveshe=error

总结:
当存在指定包级别指定类级别时,在指定受影响范围的日志中rootLogger 的设置将失效,最终以指定级别设置的日志级别和Threshold的设置级组合生效选取等级最高的设置生效.

当同时存在在指定包级别指定类级别时,指定类级别的设置会最终生效.

发布了457 篇原创文章 · 获赞 147 · 访问量 43万+

猜你喜欢

转载自blog.csdn.net/u011479200/article/details/102481495