java如何在log4j中获得不同的记录器?
如果我的log4j。属性看起来像这样
# General configuration
log4j.rootLogger = ERROR, ConsoleAppender
# Appender configuration
log4j.appender.ConsoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.ConsoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.ConsoleAppender.layout.ConversionPattern = %5p (%c) %m%n
#Other Loggers
log4j.logger.com.foo=INFO
log4j.logger.com.foo.Bar=DEBUG
log4j.logger.org.springframework=INFO
是否有一种简单的方法可以只获取记录器com.foo
、com.foo.Bar
、root
和org.springframework
。而不是已创建并继承级别的特定类(即com.foo.bar.Baz
?
出于我的目的,我想创建一个管理页面,显示这些记录器及其级别,但不是所有记录器,只是通过属性直接配置的记录器。目前,我正在向上遍历父层次结构,直到遇到一个与父层次结构具有不同级别的记录器,但如果它们位于层次结构中,则可以隐藏一些已配置的记录器,并将其设置为与更高级别的记录器相同的级别
# 1 楼答案
你可以这样做。首先从日志管理器获取所有记录器:
然后,您可以向每个记录器询问其级别:
如果从未显式设置过
currentLevel
,则它将是null
。因此,如果在log4j.properties
中将记录器设置为特定级别,您将得到一个非空值。否则您将得到一个null
值。根记录器总是报告一个级别,因此这是一种特殊情况。这样,您就不需要解析log4j.properties
文件唯一的问题是,如果在代码中的某个地方调用记录器上的
setLevel()
,它也会报告非null并显示在列表中。这是因为log4j不知道如何设置一个级别,只有当它被设置时才知道。要区分这两种情况,您仍然需要解析log4j.properties
另外,请记住,这只适用于当前加载的记录器。因此,如果
com.foo.Bar
从未加载过,即使在log4j.properties
中明确提到它,您也不会在列表中看到它。Log4J不知道将来可能创建的不存在的记录器。同样,为此您需要解析log4j.properties