Java 为什么Log4j rootLogger不根据事件级别过滤日志事件?

Java 为什么Log4j rootLogger不根据事件级别过滤日志事件?,java,logging,log4j,Java,Logging,Log4j,为什么我的应用程序中的rootLogger没有根据级别过滤日志事件?在我的log4j.properties中,我有几个记录器: log4j.rootLogger=info,stdout log4j.logger.com.name.myapp=debug,myapp log4j.logger.org.castor=debug,castor log4j.logger.org.exolab.castor=debug,castor log4j.logger.org.hibernate=debug,hib

为什么我的应用程序中的
rootLogger
没有根据级别过滤日志事件?在我的
log4j.properties
中,我有几个记录器:

log4j.rootLogger=info,stdout
log4j.logger.com.name.myapp=debug,myapp
log4j.logger.org.castor=debug,castor
log4j.logger.org.exolab.castor=debug,castor
log4j.logger.org.hibernate=debug,hibernate
log4j.logger.org.springframework=debug,spring

每个日志记录器都在
DEBUG
及以上级别接收并记录大量日志事件,这正是我所期望和期望的。然而,
rootLogger
,尽管设置为level
INFO
,也显示了所有这些事件,包括
DEBUG
事件,这不是我期望的,也不是我想要的。相反,我希望它过滤
DEBUG
事件,但只显示级别
INFO
和更高级别的事件(
WARN
ERROR
、和
FATAL
),这也是我想要的。为什么rootLogger显示所有事件?

检查中描述的继承。如果在包级别指定级别,它将不会继承根记录器的级别。您在指定的包中使用的是debug,而不是info。指定级别将覆盖继承的任何内容


如果要继承根记录器的级别,请删除记录器配置中的级别规范。

要检索根记录器,是否使用
logger.getRootLogger()
?否则,您可能无法获得真正的根记录器。如果是,请确保
stdout
的阈值未处于调试状态;Appender的阈值会覆盖记录器级别的阈值。

请参见Log4j中关于记录器链接的类似内容:

Log4j链接的工作方式有点复杂 违反直觉(至少对我来说)。如果 请求级别等于或高于 最具体的 匹配的记录器,它被接受。一旦 请求被接受,它将被 由完整的 祖先不分身份 门槛

这意味着,无论您将根记录器的阈值设置到什么级别,它都将始终接受并输出任何其他记录器接受的日志事件,除非您禁用该子记录器的链接或将其附加程序的阈值显式设置到更高的级别

因此,在本例中,有两种方法可以防止根记录器从其他记录器捕获事件。第一种是禁用日志事件链接的更具选择性的方法:

log4j.additivity.com.name.myapp=false
log4j.additivity.org.castor=false
log4j.additivity.org.exolab.castor=false
log4j.additivity.org.hibernate=false
log4j.additivity.org.springframework=false
第二种方法更简单,但限制性更强,因为它会抑制控制台上低于
INFO
DEBUG
TRACE
)的所有事件:


您已经为com.name.myapp、org.castor、org.hibernate、org.springframework提供了调试级别,因此对于这些pkg,它将打印调试信息,对吗?是的,这些级别打印调试事件。但是,rootLogger打印所有事件,但我希望它只打印info事件。然后将级别更改为info。root logger的阈值级别已设置为
info
。这是我的观点。根记录器也正在接受调试事件。为什么?正如我在下面的回答中所讨论的,解释了为什么根记录器捕获所有其他记录器的事件。我不希望包继承根记录器级别。我希望根记录器忽略调试事件,只在控制台上显示信息及以上内容。@Derek Mahar签出。使用%c查看您的关卡到底在做什么。您应该能够通过这种方式更好地跟踪正在发生的事情。appender的默认优先级是多少?是不是全部?对不起,我是说阈值。您在下面找到的答案是正确的。您的答案是正确的,但正如我在回答()中提到的,两种可能的解决方案之一是将appender
stdout
的阈值设置为
INFO
log4j.appender.stdout.Threshold=info