Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么只有根日志记录器使用JSON配置在log4j2中工作?_Java_Json_Log4j2 - Fatal编程技术网

Java 为什么只有根日志记录器使用JSON配置在log4j2中工作?

Java 为什么只有根日志记录器使用JSON配置在log4j2中工作?,java,json,log4j2,Java,Json,Log4j2,我在尝试使用Log4j 2登录日志文件和控制台时遇到了一个问题 我使用的是JSON配置,加载得很好。我的整个配置(log4j2.json)如下所示: { "configuration": { "appenders": { "Console": { "name": "consoleAppender", "PatternLayout": { "pat

我在尝试使用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,得到完全相同的结果。我尝试更改伐木工人的附录参考:

{
    "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-应该运行一个测试来确定。