log4j rootLogger似乎继承了其他记录器的日志级别。为什么?

时间:2010-03-16 08:46:54

标签: java log4j

我有一个log4J设置,其中根记录器应该将ERROR级别消息和上面的消息记录到控制台,另一个记录器将所有内容记录到syslog。

log4j.properties是:

# Root logger option
log4j.rootLogger=ERROR,R

log4j.appender.R=org.apache.log4j.ConsoleAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n

log4j.logger.SGSearch=DEBUG,SGSearch
log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender
log4j.appender.SGSearch.SyslogHost=localhost
log4j.appender.SGSearch.Facility=LOCAL6
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n

在代码中我做

private static final Logger logger = Logger.getLogger("SGSearch");
.
.
.
logger.info("Commencing snapshot index [" + args[1] + " -> " + args[2] + "]");

发生的事情是我获得了所有日志记录级别的控制台日志记录。似乎正在发生的事情是,SGSearch的级别会以某种方式覆盖根记录器的级别设置。我无法理解。

我已经确认Log4J正在读取我认为的属性文件,而没有其他文件(通过-Dlog4j.debug选项)

3 个答案:

答案 0 :(得分:16)

Log4j链接的工作方式有点反直觉(至少对我来说)。见the log4j manual。如果请求级别等于或高于最具体匹配记录器的阈值,则接受该级别。一旦请求被接受,它将由完整的祖先链处理,无论其阈值如何!

要抑制链接行为,请添加:

log4j.additivity.SGSearch=false

这将导致记录器SGSearch处理的请求不再向链传递。

另一个建议:不要将您的记录器和追加器命名为相同,因为在将来的某个时刻,您或同事会混淆它们。记录器名称应指示处理哪种类型的日志记录,appender名称应指定日志记录的位置。所以在这种情况下,我认为'SGSearch'可能是记录器名称,而appender应该被称为'LocalSysLog'。

BTW:在我看来,你通过限制具有高阈值的根记录器并针对特定记录器降低它来做正确的事情。这避免了大声库的混乱(Apache有一些臭名昭着的库)。

答案 1 :(得分:6)

有关级别的快速信息

  

Log4J级别

     

可以为记录器分配级别。该   一套可能的等级,即DEBUG,   INFO,WARN,ERROR和FATAL是   在org.apache.log4j.Level中定义   类。

     

如果没有为给定的记录器分配a   等级,然后它从它继承一个   最近的祖先与指定的   水平。

     

根记录器位于顶部   记录器层次结构。它总是存在的   并且始终具有指定的级别。

我已将示例log4j配置更改为以这种方式工作:

# Root logger option
log4j.rootLogger=ALL,R

log4j.appender.R=org.apache.log4j.ConsoleAppender
log4j.appender.R.Target=System.out
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %p %t %c - %m%n
log4j.appender.R.Threshold=ERROR

log4j.appender.SGSearch=org.apache.log4j.net.SyslogAppender
log4j.appender.SGSearch.SyslogHost=localhost
log4j.appender.SGSearch.Facility=LOCAL6
log4j.appender.SGSearch.layout=org.apache.log4j.PatternLayout
log4j.appender.SGSearch.layout.ConversionPattern=[%-5p] %m%n
log4j.appender.SGSearch.Threshold=DEBUG

我希望这会对你有所帮助。

答案 2 :(得分:0)

在每个申请者基础上设置阈值是关键:

log4j.appender.SGSearch.Threshold=DEBUG

log4j.appender.R.Threshold=ERROR

与禁用“可加性”的建议相比,这是一种更好的解决方案-问题在于您想要 multiple 附加程序处理的任何内容都会被它击败-因此您无法这样做,如果您将ERROR ...

的可加性设置为false级别的消息,则同时向控制台和syslog两者发送消息