我在尝试使用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,结果完全相同。我试过更换记录器'附加器-ref的:
{
"name": "fileLogger",
"level": "info",
"appender-ref": { "ref": "consoleAppender" }
},
"root": {
"level": "info",
"appender-ref": { "ref": "fileAppender" }
}
在这种情况下,没有任何内容记录到控制台,但日志文件将收到日志消息。
我的配置有问题或者这是关于什么的?
答案 0 :(得分:2)
您的问题在这里:
"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
应该实现什么,但我认为您需要阅读hierarchical logging and additive logging上的文档,因为您似乎误解了logger
配置元素的作用。
为了将两个appender分配给根记录器,只需在appender-ref
声明中使用一个appender数组,如下所示:
"loggers": {
"root": {
"level":"info",
"appender-ref": [{ "ref":"fileAppender" }, { "ref":"consoleAppender" }]
}
}