Log4j2:如何定义多个记录器

Log4j2:如何定义多个记录器,log4j,log4j2,Log4j,Log4j2,我定义了多个记录器,如下所示(com.xyz和org.xyz)。Log4j2忽略第一个记录器定义,只加载第二个记录器定义。在本例中,未加载org.xyz { "configuration": { "name": "Default", "appenders": { "Console": { "name": "Console-Appender", "target": "SYSTEM_OUT", "PatternLayou

我定义了多个记录器,如下所示(com.xyz和org.xyz)。Log4j2忽略第一个记录器定义,只加载第二个记录器定义。在本例中,未加载org.xyz

{
  "configuration": {
    "name": "Default",
    "appenders": {
      "Console": {
        "name": "Console-Appender",
        "target": "SYSTEM_OUT",
        "PatternLayout": {"pattern": "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"}
      }
    },
    "loggers": {
      "logger": {
        "name": "org.xyz",
        "level": "info",
        "appender-ref": [{"ref": "Console-Appender","level": "info"}]
      },
      "logger": {
        "name": "com.xyz",
        "level": "debug",
        "appender-ref": [{"ref": "Console-Appender", "level": "debug"}]
      },
      "root": {
        "level": "warn",
        "appender-ref": {"ref": "Console-Appender","level": "warn"}
      }
    }
  }
}
在下面找到log4j2调试消息

DEBUG StatusLogger Processing node for object loggers
DEBUG StatusLogger Processing node for object logger
DEBUG StatusLogger Node name is of type STRING
DEBUG StatusLogger Node level is of type STRING
DEBUG StatusLogger Node additivity is of type STRING
DEBUG StatusLogger Processing node for array appender-ref
DEBUG StatusLogger Processing appender-ref[0]
DEBUG StatusLogger Returning logger with parent loggers of type logger:class     org.apache.logging.log4j.core.config.LoggerConfig
DEBUG StatusLogger Processing node for object root
DEBUG StatusLogger Node level is of type STRING
DEBUG StatusLogger Processing node for object appender-ref
DEBUG StatusLogger Node ref is of type STRING
DEBUG StatusLogger Node level is of type STRING
DEBUG StatusLogger Returning appender-ref with parent root of type appender-ref:class org.apache.logging.log4j.core.config.AppenderRef
DEBUG StatusLogger Returning root with parent loggers of type root:class org.apache.logging.log4j.core.config.LoggerConfig$RootLogger
DEBUG StatusLogger Returning loggers with parent root of type loggers:class org.apache.logging.log4j.core.config.LoggersPlugin
DEBUG StatusLogger Completed parsing configuration
DEBUG StatusLogger Building Plugin[name=logger, class=org.apache.logging.log4j.core.config.LoggerConfig].
DEBUG StatusLogger createLogger(additivity="false", level="DEBUG", name="com.xyz", includeLocation="null", ={Console-Appender}, ={}, Configuration(Default), Filter=null)
DEBUG StatusLogger Building Plugin[name=appender-ref, class=org.apache.logging.log4j.core.config.AppenderRef].
DEBUG StatusLogger createAppenderRef(ref="Console-Appender", level="WARN", Filter=null)
DEBUG StatusLogger Building Plugin[name=root, class=org.apache.logging.log4j.core.config.LoggerConfig$RootLogger].
DEBUG StatusLogger createLogger(additivity="null", level="WARN", includeLocation="null", ={Console-Appender}, ={}, Configuration(Default), Filter=null)
DEBUG StatusLogger Building Plugin[name=loggers, class=org.apache.logging.log4j.core.config.LoggersPlugin].
DEBUG StatusLogger createLoggers(={com.xyz, root})

我的配置正确吗?

要在
log4j2
JSON
配置文件中定义多个记录器,您应该将
logger
声明为
array

使用
记录器阵列
,您的配置文件将更改为-

{
  "configuration": {
    "name": "Default",
    "appenders": {
      "Console": {
        "name": "Console-Appender",
        "target": "SYSTEM_OUT",
        "PatternLayout": {"pattern": "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"}
      }
    },
    "loggers": {
      "logger": [
                {
                   "name": "org.xyz",
                   "level": "info",
                   "appender-ref": [{"ref": "Console-Appender","level": "info"}]
                },
                {
                   "name": "com.xyz",
                   "level": "debug",
                   "appender-ref": [{"ref": "Console-Appender", "level": "debug"}] 
                }
                ],
      "root": {
        "level": "warn",
        "appender-ref": {"ref": "Console-Appender","level": "warn"}
      }
    }
  }
}

当我切换org.xyz和com.xyz的顺序时,org.xyz被加载,com.xyz被忽略。这是不是因为两个记录器使用相同的
JSON
键名
logger
?只创建最后一个,并覆盖上一个。是否可以将它们更改为唯一的名称?只是一些解析器覆盖DUP时JSON行为的一个想法。谢谢Aniket。看来问题出在json配置中。我将配置文件转换为xml格式。两个伐木工人现在都被认出来了。