当前位置: 首页 > 知识库问答 >
问题:

如果定义了5个以上的记录器,Log4j 1.2将无法找到关联的追加器

鱼意远
2023-03-14

我在类路径上有一个log4j.properties文件。我有2个学徒。一个是基根附属物。另一个是文件附加程序,只有一个相关的记录器。一旦log4j.properties文件中定义的记录器数量超过5个,log4j就无法将文件附录与相应的记录器关联起来。

例如:

log4j.rootLogger=DEBUG, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p %-60c %x - %m%n

log4j.logger.logger.1=WARN
log4j.logger.logger.2=FATAL
log4j.logger.logger.3=INFO
log4j.logger.logger.4=INFO
log4j.logger.logger.5=TRACE
log4j.logger.logger.6=FATAL

log4j.appender.audit=org.apache.log4j.RollingFileAppender
log4j.appender.audit.File=/tmp/audit/audit.log
log4j.appender.audit.MaxBackupIndex=99999
log4j.appender.audit.layout=org.apache.log4j.PatternLayout
log4j.appender.audit.layout.ConversionPattern=%d :: %m%n

log4j.category.face.audit=TRACE, audit
log4j.additivity.face.audit=false
log4j.logger.face.audit=TRACE

对于通过slf4j使用此配置的简单测试:

public class TestMe {
    public static final Logger LOGGER = LoggerFactory.getLogger(TestMe.class);
    public static final Logger AUDIT = LoggerFactory.getLogger("face.audit");
    static {
        AUDIT.trace("AUDIT!");
    }

    @Test
    public void testConfig() throws Exception {}
}

这导致:

log4j:WARN No appenders could be found for logger (face.audit).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

如果我注释掉任何单个记录器(或多个记录器),它就会工作。一旦日志记录者的数量(不包括分配给face.audit类别的日志记录者)超过5,则此操作将失败。

如有任何建议,将不胜感激。

共有1个答案

邢弘业
2023-03-14

事实证明,问题是为同一个名称定义一个类别和一个记录器

log4j.category.face.audit=TRACE, audit
...
log4j.logger.face.audit=TRACE

这似乎取决于属性的解析顺序。更改属性中的条目会更改它们最终被解析的顺序,因为它们只是存储在properties对象HashMap)上,因此它们最终被遍历的顺序是任意的,但取决于键散列值。

编辑:类别已被弃用(并且已被弃用很长时间)。正确的答案是只有:

log4j.logger.face.audit=TRACE, audit

...没有类别条目。

 类似资料:
  • 我想创建三个追加器:文件、控制台和数据库。此外,我还在数据库中存储了三个变量:info、error和warn,它们的值对应于上面的一个追加器。 带有登录: 1.我需要创建一个完整的DBAppender类(如下所示),因为我不想将信息存储在三个不同的表中(只存储在一个表中)。 2.由于有了过滤器,捕获数据库的值以获取信息似乎很简单。因此,我可以在每个appender中包含过滤器,并且根据信息的值,我

  • 我有麻烦配置我的log4j2.xml文件包括Hibernate日志记录。 这是我的xml文件: 在启动我的罐子时,我会将以下内容打印到控制台: 我似乎从我的应用程序中获取日志到我的滚动文件中,但我不明白为什么这个hibernate记录器没有使用相同的appender。 非常感谢您的帮助!

  • 我有一个情况,我有两个追加器,一个写到控制台,另一个写到文件。我想记录除一个类以外的所有调试级别的东西。对于这个类,我想要记录调试到控制台,错误到文件。 我发现这种过滤是通过类别标记完成的,但是我还没有设法将不同的级别拆分给特定类上的不同追加器。

  • 下面的日志返回配置中,一个记录器显式定义了它的appender,另一个不定义: 如果有的话,没有显式appender规范的记录器将使用什么appender?

  • 我定义了多个记录器,如下所示(com.xyz和org.xyz)。Log4j2忽略了第一个记录器定义,只加载第二个。在示例中,org.xyz未加载。 在log4j2调试消息下方查找。 我的配置正确吗?

  • 我知道:- 但是,createAppender和createLogger是V2.11中不推荐使用的方法。 此外,我还知道ConfigurationBuilder。我已经试用了它,它似乎是为了以编程方式构建配置。我需要从log4j2.xml文件中获得默认配置。并追加新的追加器(带有新的文件名和记录器)。