gpt4 book ai didi

java - Log4J2 中的可加性 (2.5)

转载 作者:行者123 更新时间:2023-11-30 10:51:52 25 4
gpt4 key购买 nike

根据 http://logging.apache.org/log4j/2.x/manual/configuration.html 处的 Log4J2 手册使用

配置记录器
...
<Loggers>
<Logger name="com.foo.Bar" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
...

并记录如下语句

Logger barLogger = LogManager.getLogger(Bar.class);
barLogger.info("A simple info message");

应该产生输出

"A simple info message"

但是,我收到了两次消息,即

"A simple info message"

"A simple info message"

想知道为什么?我知道不为 Bar 记录器指定 additivity="false" 也会将消息传播到根记录器。但是在这种情况下,根记录器的日志级别设置为错误,因此在我阅读手册时不应再次记录消息(仅记录为“信息”)。

有什么提示吗?

更新:我看到了@rgoers 的第一个答案,这似乎是合理的。但是,对我来说似乎是 http://logging.apache.org/log4j/2.x/manual/configuration.html 上的文档仍然过时或不正确。根据文档,程序

public class MyApp {

// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static final Logger logger = LogManager.getLogger(MyApp.class);

public static void main(final String... args) {

// Set up a simple configuration that logs on the console.

logger.trace("Entering application.");
Bar bar = new Bar();
if (!bar.doIt()) {
logger.error("Didn't do it.");
}
logger.trace("Exiting application.");
}
}

public class Bar {
static final Logger logger = LogManager.getLogger(Bar.class.getName());

public boolean doIt() {
logger.entry();
logger.error("Did it again!");
return logger.exit(false);
}
}

使用 log4J2 配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.foo.Bar" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

应该产生以下输出

17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] TRACE com.foo.Bar - exit (false)
17:13:01.540 [main] TRACE com.foo.Bar - exit (false)
17:13:01.540 [main] ERROR MyApp - Didn't do it.

但是,运行这个我得到了

00:45:49.951 [main] TRACE com.foo.Bar - entry
00:45:49.951 [main] TRACE com.foo.Bar - entry
00:45:49.951 [main] ERROR com.foo.Bar - Did it again!
00:45:49.951 [main] ERROR com.foo.Bar - Did it again!
00:45:49.951 [main] TRACE com.foo.Bar - exit with(false)
00:45:49.951 [main] TRACE com.foo.Bar - exit with(false)
00:45:49.951 [main] ERROR com.foo.MyApp - Didn't do it.

即“又那么做了!”被记录两次而不是像文档中提到的那样只记录一次....

最佳答案

只有第一个匹配的记录器的日志级别用于接受或拒绝日志事件。一旦被接受,它将被传递给所有父记录器,无论它们指定什么级别。我认为文档对此非常清楚,但也许不是。

关于java - Log4J2 中的可加性 (2.5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34559717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com