为什么我的应用程序中的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
和FATAL
)的事件,这也是我想要的。为什么rootLogger显示所有事件?
答案 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
第二种方式更简单,但限制性更强,因为它会抑制控制台上低于INFO
(DEBUG
和TRACE
)的所有事件:
log4j.appender.stdout.Threshold=info
答案 1 :(得分:2)
要检索rootlogger,您使用的是Logger.getRootLogger()
吗?如果没有,您可能无法获得真正的根记录器。如果是,请确保stdout
的阈值不在调试中; appenders的阈值覆盖记录器级别的阈值。
答案 2 :(得分:1)
查看intro中描述的继承。如果在包级别指定级别,则不会继承根记录器的级别。您在指定的包中使用debug,而不是info。指定级别会覆盖已继承的内容。
如果要继承根记录器的级别,请删除记录器配置中的级别规范。