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的設置級組合生效選取等級最高的設置生效.

當同時存在在指定包級別指定類級別時,指定類級別的設置會最終生效.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章