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

2023-11-21

为什么是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和更高(WARN, ERROR, and FATAL),这也是我想要的。为什么 rootLogger 显示所有事件?


看到这个answer到类似的question关于 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 and TRACE):

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

为什么 Log4j rootLogger 不根据事件级别过滤日志事件? 的相关文章

随机推荐