log4j.properties文件中的log4j.rootLogger重要性

时间:2020-02-23 14:37:19  来源:igfitidea点击:

log4j.rootLogger位于所有记录器层次结构的顶部,就像Java类中有Object一样。
因此,无论何时登录,都与记录器配置不匹配,都将使用根记录器配置。

log4j.rootLogger示例

让我们用一个简单的例子来理解这一点。
假设我们有一个log4j.properties文件,如下所示。

#Define root logger options
log4j.rootLogger=DEBUG, console

#Define console appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
logrj.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p %c{1} - (%F:%L) %m%n

#Define loggers
log4j.logger.com.theitroad.log4j.main=ERROR, console

#setting additivity
log4j.additivity.com.theitroad.log4j.main=false

这是包com.theitroad.log4j.main中的一个简单Java程序,对应于上面定义的logger。

package com.theitroad.log4j.main;

import org.apache.log4j.Logger;

public class Log4jExample {

	private final static Logger logger = Logger.getLogger(Log4jExample.class);

	public static void main(String[] args) {
		logger.trace("My Trace Log");
		logger.debug("My Debug Log");
		logger.info("My Info Log");
		logger.warn("My Warn Log");
		logger.error("My error log");
		logger.fatal("My fatal log");
	}

}

下图显示了运行时的输出。

现在,下面是将包声明更改为" com.theitroad.log4j.main1"时的输出,以使其与任何已定义的记录器都不匹配。

这里使用的是根记录器配置,即记录级别为DEBUG和单个附加程序"控制台"。

那么是否需要始终定义log4j.rootLogger?

不,log4j不会给您任何警告或者任何异常(如果您未定义的话)。
除非Logger实例正在尝试使用它。

因此,如果我注释了上面的根记录器配置,并且我的java程序在com.theitroad.log4j.main包中,则为此定义了一个记录器,并且一切正常。

但是,如果我从" com.theitroad.log4j.main1"包运行我的Java程序,但未为其定义记录器,则它会尝试查找根记录器配置,但找不到它。
因此它将在警告消息下方打印到控制台。

log4j:WARN No appenders could be found for logger (com.theitroad.log4j.main1.Log4jExample).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See https://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

最后,我们如何在log4j.xml文件中定义相同的内容?

以下是基于XML的配置,与上述log4j.properties文件相同。

<root>
	<priority value="DEBUG" 
	<appender-ref ref="console" 
</root>