如果我的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?
为了我的目的,我想创建一个管理页面,显示这些记录器及其级别,但不是所有记录器,只是通过属性直接配置的那些.目前,我正在遍历父层次结构,直到我遇到一个与其父级具有不同级别的记录器,但如果它们位于层次结构中并且设置与更高级别相同的级别,则可以隐藏一些已配置的记录器.
你可以这样做.首先从日志管理器获取所有记录器:
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.
| 归档时间: |
|
| 查看次数: |
4493 次 |
| 最近记录: |