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

时间:2010-06-11 14:39:28

标签: java logging log4j

为什么我的应用程序中的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,hibernate
log4j.logger.org.springframework=debug,spring

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

3 个答案:

答案 0 :(得分:5)

请参阅此answer,了解关于Log4j中记录器链的类似question

  

Log4j链接的工作方式有点   反直觉(至少对我而言)。如果   请求级别等于或大于   最具体的门槛   匹配记录器,它被接受。一旦   请求被接受,它得到   由完整的链条处理   祖先不管他们是谁   阈值!

这意味着无论您设置根记录器的阈值到什么级别,它都将始终接受并输出任何其他记录器接受的日志事件,除非您禁用该子记录器的链接或明确设置其阈值提升到更高的水平。

因此,在这种情况下,有两种方法可以阻止root logger从其他记录器捕获事件。第一种是禁用日志事件链的更具选择性的方法:

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

第二种方式更简单,但限制性更强,因为它会抑制控制台上低于INFODEBUGTRACE)的所有事件:

log4j.appender.stdout.Threshold=info

答案 1 :(得分:2)

要检索rootlogger,您使用的是Logger.getRootLogger()吗?如果没有,您可能无法获得真正的根记录器。如果是,请确保stdout的阈值不在调试中; appenders的阈值覆盖记录器级别的阈值。

答案 2 :(得分:1)

查看intro中描述的继承。如果在包级别指定级别,则不会继承根记录器的级别。您在指定的包中使用debug,而不是info。指定级别会覆盖已继承的内容。

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