gpt4 book ai didi

java - 为什么只有根记录器在具有 JSON 配置的 Log4j 2 中工作?

转载 作者:行者123 更新时间:2023-11-30 09:02:53 24 4
gpt4 key购买 nike

我在尝试使用 Log4j 2 登录日志文件和控制台时遇到了问题。

我正在使用 JSON 配置,它加载得很好。我的完整配置(log4j2.json)如下:

{
"configuration": {
"appenders": {
"Console": {
"name": "consoleAppender",
"PatternLayout": {
"pattern": "%d{DEFAULT} %-5p [%t]: %m%n"
}
},
"File": {
"name": "fileAppender",
"fileName": "log.txt",
"PatternLayout": {
"pattern": "%d{DEFAULT} %-5p [%t]: %m%n"
}
}
},
"loggers": {
"logger":
{
"name": "fileLogger",
"level": "info",
"appender-ref": { "ref": "fileAppender" }
},
"root": {
"level": "info",
"appender-ref": { "ref": "consoleAppender" }
}
}
}
}

我已经使用以下类测试了日志记录:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LoggingTest {
static final Logger log = LogManager.getLogger(LoggingTest.class.getName());

public static void main(String[] args) {
log.trace("A trace log from " + LoggingTest.class.getName() + ".main(String[])");
log.debug("A debug log from " + LoggingTest.class.getName() + ".main(String[])");
log.info("An info log from " + LoggingTest.class.getName() + ".main(String[])");
log.warn("A warn log from " + LoggingTest.class.getName() + ".main(String[])");
log.error("An error log from " + LoggingTest.class.getName() + ".main(String[])");
log.fatal("A fatal error log from " + LoggingTest.class.getName() + ".main(String[])");
}
}

当执行控制台时,如预期的那样,包含以下消息:

2014-09-15 14:40:42,411 INFO  [main]: An info log from LoggingTest.main(String[])
2014-09-15 14:40:42,412 WARN [main]: A warn log from LoggingTest.main(String[])
2014-09-15 14:40:42,412 ERROR [main]: An error log from LoggingTest.main(String[])
2014-09-15 14:40:42,412 FATAL [main]: A fatal error log from LoggingTest.main(String[])

日志文件 log.txt 已创建,但仍为空。我也尝试过使用 RollingFileAppender 得到完全相同的结果。我尝试更改记录器的 appender-refs:

{
"name": "fileLogger",
"level": "info",
"appender-ref": { "ref": "consoleAppender" }
},
"root": {
"level": "info",
"appender-ref": { "ref": "fileAppender" }
}

在这种情况下,控制台不会记录任何内容,但日志文件会收到日志消息。

我的配置有问题吗?这是怎么回事?

最佳答案

您的问题在这里:

    "loggers": {
"logger":
{
"name": "fileLogger",
"level": "info",
"appender-ref": { "ref": "fileAppender" }
},
"root": {
"level": "info",
"appender-ref": { "ref": "consoleAppender" }
}
}

您有一个连接到 consoleAppenderroot 记录器 - 即所有(附加的)日志记录都进入控制台。您还有一个名为 fileLogger 的记录器,它的日志记录到 fileAppender。这意味着除非您这样做:

LogManager.getLogger("fileLogger")

要获取名为 fileLogger 的记录器,您永远不会在文件中看到任何输出。我不确定 fileLogger 应该实现什么,但我认为您需要阅读关于 hierarchical logging and additive logging 的文档因为您似乎误解了 logger 配置元素的作用。

为了将两个附加程序分配给根记录器,只需在 appender-ref 声明中使用一组附加程序,如下所示:

  "loggers": {
"root": {
"level":"info",
"appender-ref": [{ "ref":"fileAppender" }, { "ref":"consoleAppender" }]
}
}

关于java - 为什么只有根记录器在具有 JSON 配置的 Log4j 2 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25847508/

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