log4j.rootLogger 属性在 log4j.properties 文件中的意义是什么?如果我不使用此属性,会发生什么情况?

文件中属性的意义是什么?如果我不使用此属性,会发生什么情况?log4j.rootLoggerlog4j.properties

示例

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

如果我将此属性设置为模式,会发生什么情况。ERROR


答案 1

Samudra Gupta在他的书1中解释说:

该对象是应用程序开发人员用来记录任何消息的主要对象。在应用程序的特定实例中运行的对象遵循父子层次结构LoggerLogger

如果您有以下配置:

log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.logger.com.me.proj2=INFO

这就是记录器层次结构最终可能的外观:2

Tree

Samudra Gupta继续解释道:

在层次结构的顶部存在一个根记录器。根记录器存在于我们可能提出的任何自定义记录器层次结构的范围之外。它始终作为所有可能的记录器层次结构的根记录器存在,并且没有命名空间。所有其他特定于应用程序的对象都是根记录器的子对象。记录器的父子关系表示在同一应用程序中操作的记录器的依赖关系。子记录器可以从其父记录器以递归方式沿树向上继承属性。通常,子记录器将从其父记录器继承以下属性:Logger

  • Level:如果子记录器未指定显式树级别,它将使用其最接近的父级的级别或它在层次结构中递归找到的第一个适当级别。
  • Appender:如果没有附加到记录器的追加器,则子记录器将使用其最近的父记录器的追加器或它在树上递归找到的第一个追加器。
  • ResourceBundle:是用于日志记录消息本地化的键值模式属性文件。子记录器继承与其父记录器关联的任何内容。ResourceBundlesResourceBundle

笔记

1 Samudra Gupta, Pro Apache Log4j, Second Edition (Berkeley, CA: Apress, 2005), 24-25, ISBN13: 978-1-59059-499-5

2 Dominic Mitchell, Log in Javahttp://happygiraffe.net/blog/2008/09/03/logging-in-java/, Retrieved 26 May 2014.


答案 2

回答

如果我不使用此属性,会发生什么情况?

如果未将 rootLogger 设置为级别和追加器,则会收到警告。

例如,如果您省略或注释掉了行,即说您的log4j.properties文件仅包含rootlogger,没有其他记录器,则此处根记录器被注释掉:log4j.rootLogger=DEBUG, stdout

#log4j.rootLogger=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

您将获得类似于以下输出的内容:

log4j:WARN No appenders could be found for logger (log4jtests.Log4jHelloWorld).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

推荐