8

如果我的 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.foocom.foo.Bar、、、rootorg.springframework。而不是已创建并继承级别的特定类(IE com.foo.bar.Baz
出于我的目的,我想创建一个管理页面来显示这些记录器及其级别,但不是所有记录器,只是那些通过属性直接配置的记录器。目前,我正在向上遍历父层次结构,直到遇到一个与其父级具有不同级别的记录器,但是如果它们在层次结构中并设置与更高级别相同的级别,则可以隐藏一些已配置的记录器。

4

1 回答 1

7

你可以做这样的事情。首先从日志管理器中获取所有记录器:

Enumeration<Category> loggers = LogManager.getCurrentLoggers();

然后您可以询问每个记录器的级别:

Level currentLevel = logger.getLevel();

currentLevelnull如果它从未被明确设置过。因此,如果记录器设置为 中的特定级别log4j.properties,您将获得一个非空值。否则你会得到一个null价值。根记录器总是报告一个级别,所以这是一种特殊情况。这样,您就不需要解析log4j.properties文件。

唯一的问题是,如果您在代码中的某处调用setLevel()记录器,它也会报告非空值并出现在您的列表中。那是因为 log4j 不知道一个级别是如何设置的,只有当它被设置时才知道。要区分这两种情况,您仍然需要解析log4j.properties.

另外,请记住,这仅适用于当前加载的记录器。因此,如果com.foo.Bar从未加载过,即使在log4j.properties. Log4J 不知道将来可能创建的不存在的记录器。同样,为此您需要解析log4j.properties.

于 2012-10-23T16:33:32.237 回答