Java 为什么只有根日志记录器使用JSON配置在log4j2中工作?
我在尝试使用Log4j 2登录日志文件和控制台时遇到了一个问题 我使用的是JSON配置,加载得很好。我的整个配置(log4j2.json)如下所示:Java 为什么只有根日志记录器使用JSON配置在log4j2中工作?,java,json,log4j2,Java,Json,Log4j2,我在尝试使用Log4j 2登录日志文件和控制台时遇到了一个问题 我使用的是JSON配置,加载得很好。我的整个配置(log4j2.json)如下所示: { "configuration": { "appenders": { "Console": { "name": "consoleAppender", "PatternLayout": { "pat
{
"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,得到完全相同的结果。我尝试更改伐木工人的附录参考:
{
"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" }
}
}
您有一个root
记录器,它连接到consoleAppender
——即所有(附加)日志记录都会进入控制台。您还有一个名为fileLogger
的记录器,其日志记录将转到fileAppender
。这意味着除非您这样做:
LogManager.getLogger("fileLogger")
要获取名为fileLogger
的记录器,您永远不会在文件中看到任何输出。我不确定fileLogger
应该实现什么,但我认为您需要阅读上的文档,因为您似乎误解了logger
config元素的功能
为了给根记录器分配两个appender,只需在appender ref
声明中使用一个appender数组,如下所示:
"loggers": {
"root": {
"level":"info",
"appender-ref": [{ "ref":"fileAppender" }, { "ref":"consoleAppender" }]
}
}
您已将
fileAppender
分配给名为fileLogger
的Logger
。除非您执行LogManager.getLogger(“fileLogger”)
否则您尚未创建此记录器,并且不会将任何内容记录到该文件中。啊,我明白了。我需要如何更改配置才能使日志条目在两个appender中结束?配置还提供了控制台的日志,如果您认为这是合乎逻辑的;有两个值与同一个键关联。但是,我找到了解决方案:一个appender ref,它包含一个包含两个ref对象的数组:“appender ref”:[{“ref”:“consoleAppender”},{“ref”:“fileAppender”}]}。把你的答案改成那样,我会接受的抱歉,我正在尝试将XML配置转换为JSON-应该运行一个测试来确定。