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

2023-12-24

我有一个 log4J 设置,其中根记录器应该将错误级别及以上级别的消息记录到控制台,另一个记录器将所有内容记录到系统日志。

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 option)


Log4j 链接的工作方式有点违反直觉(至少对我来说)。看log4j 手册 http://logging.apache.org/log4j/1.2/manual.html#additivity。如果请求级别等于或高于最具体匹配记录器的阈值,则接受。一旦请求被接受,它就会由完整的祖先链处理,无论其阈值如何!

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

log4j.additivity.SGSearch=false

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

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

顺便说一句:在我看来,您通过使用高阈值限制根记录器并降低特定记录器的阈值来做正确的事情。这可以避免吵闹的库造成的混乱(Apache 有一些臭名昭著的库)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐