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>