如果我的log4j.properties看起来这个
# 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
。而不是已创建的特定类并继承级别(I.E. com.foo.bar.Baz
?
出于我的目的,我想创建一个管理页面,显示这些记录器及其级别,但不是所有记录器,只是通过属性直接配置的记录器。目前,我正在遍历父层次结构,直到我遇到一个与其父级具有不同级别的记录器,但如果它们位于层次结构中并且设置与更高级别相同的级别,则可以隐藏一些已配置的记录器。
答案 0 :(得分:6)
你可以这样做。首先从日志管理器中获取所有记录器:
Enumeration<Category> loggers = LogManager.getCurrentLoggers();
然后您可以询问每个记录器的级别:
Level currentLevel = logger.getLevel();
如果从未明确设置,则 currentLevel
将为null
。因此,如果记录器设置为log4j.properties
中的特定级别,您将获得非空值。否则,您将获得null
值。根记录器总是报告一个级别,因此这是一个特殊情况。这样,您就不需要解析log4j.properties
文件。
唯一的问题是,如果代码中的某个位置在记录器上调用setLevel()
,它也会报告非空并显示在列表中。这是因为log4j不知道如何设置一个级别,只有它完全被设置。要区分这两种情况,您仍需要解析log4j.properties
。
另外,请记住,这仅适用于当前加载的记录器。因此,如果永远不会加载com.foo.Bar
,即使在log4j.properties
中明确提到,也不会在列表中看到它。 Log4J不知道将来可能创建的不存在的记录器。同样,为此,您需要解析log4j.properties
。