如何在log4j中获取不同的记录器?

Kod*_*odi 6 java log4j

如果我的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
Run Code Online (Sandbox Code Playgroud)

有一个简单的方法得到公正的伐木工人com.foo,com.foo.Bar,root,和org.springframework.而不是已经创建并继承级别的特定类(IE com.foo.bar.Baz
为了我的目的,我想创建一个管理页面,显示这些记录器及其级别,但不是所有记录器,只是通过属性直接配置的那些.目前,我正在遍历父层次结构,直到我遇到一个与其父级具有不同级别的记录器,但如果它们位于层次结构中并且设置与更高级别相同的级别,则可以隐藏一些已配置的记录器.

bar*_*uin 6

你可以这样做.首先从日志管理器获取所有记录器:

Enumeration<Category> loggers = LogManager.getCurrentLoggers();
Run Code Online (Sandbox Code Playgroud)

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

Level currentLevel = logger.getLevel();
Run Code Online (Sandbox Code Playgroud)

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

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

另外,请记住,这仅适用于当前加载的记录器.因此,如果com.foo.Bar从未加载过,即使明确提到,也不会在列表中看到它log4j.properties.Log4J不知道将来可能创建的不存在的记录器.同样,为此你需要解析log4j.properties.

  • LogManager中没有getCurrentLoggers().Log4j 2.2. (4认同)