前言
在使用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的設置級組合生效選取等級最高的設置生效.
當同時存在在指定包級別或指定類級別時,指定類級別的設置會最終生效.