为什么只有根记录器在Log4j 2中使用JSON配置?

时间:2014-09-15 11:54:55

标签: java json log4j2

我在尝试使用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" }
}

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

我的配置有问题或者这是关于什么的?

1 个答案:

答案 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" }]
     }
  }