前言
在使用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的设置级组合生效选取等级最高的设置生效.
当同时存在在指定包级别或指定类级别时,指定类级别的设置会最终生效.