log4j rootLogger似乎inheritance了其他logger的日志级别。 为什么?

我有一个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选项)

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

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

 log4j.additivity.SGSearch=false 

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

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

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

有关级别的快速信息

Log4J级别

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

如果给定的记录器没有分配级别,那么它将从具有指定级别的最近祖先inheritance一个级别。

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

我已经将示例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 

我希望这可以帮助你。