有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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


共 (1) 个答案

  1. # 1 楼答案

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

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

    然后,您可以向每个记录器询问其级别:

    Level currentLevel = logger.getLevel();
    

    如果从未显式设置过currentLevel,则它将是null。因此,如果在log4j.properties中将记录器设置为特定级别,您将得到一个非空值。否则您将得到一个null值。根记录器总是报告一个级别,因此这是一种特殊情况。这样,您就不需要解析log4j.properties文件

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

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