Log4j2的FailoverAppender错误:appender Failover没有与元素Failovers匹配的参数

2024-03-03

当我使用 log4j 2.1 编译 spring 3.2.9 Web 应用程序时,控制台中出现以下错误:

2015-02-02 12:08:25,213 ERROR appender Failover has no parameter that matches element Failovers

我的理解是元素“故障转移”不存在于元素“故障转移”内,对吧?为什么会出现这种情况呢?我不明白有什么问题,因为我有与log4j2手册相同的配置。 http://logging.apache.org/log4j/2.x/manual/appenders.html#FailoverAppender

我的 log4j2.xml 中有此配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="vcr-log4j2-config" status="debug">
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>[%d{ISO8601}] %c [%C{1}] - %p: %m%n</Pattern>
            </PatternLayout>
        </Console>

        <Syslog name="SYS_LOG" host="test_server.com" port="514" 
                protocol="UDP" facility="LOCAL7">
        </Syslog>

        <RollingFile name="backupApp"
            fileName="C:/backup.log"
            filePattern="C:/backup-%d{yyyy-MM-dd_HH-mm}.log.gz">
            <PatternLayout>
                <Pattern>[%d{ISO8601}] [%c] - %p: %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />
            </Policies>
        </RollingFile>

        <Failover name="FAILOVER" primary="SYS_LOG">
            <Failovers>
                <AppenderRef ref="backupApp"/>
            </Failovers>
        </Failover>     
    </Appenders>

    <Loggers>
        <Logger name="com.test.util.CustomLogger" level="info" additivity="false">
            <AppenderRef ref="SYS_LOG" />
            <AppenderRef ref="STDOUT" />
        </Logger>

        <Logger name="STDOUT" level="info" additivity="false">
            <AppenderRef ref="STDOUT" />
        </Logger>

        <Root level="info">
            <AppenderRef ref="STDOUT" />
            <AppenderRef ref="LOG" />
        </Root>

        <Root level="error">
            <AppenderRef ref="FAILOVER"/>
        </Root>
    </Loggers>
</Configuration>

谢谢您的帮助。


我在调试时看到的是,您可能会调用 PluginBuilder#verifyNodeChildrenUsed() 方法来验证 Node 的子元素是否正确。正如我在下面描述的,该方法名称与行为不匹配。

对于故障转移附加程序,插件类型为:(顺便说一句,“isDeferChildren”处的额外“==”仅在 toString() 实现中,不会影响测试。)

PluginType [pluginClass=class org.apache.logging.log4j.core.appender.FailoversPlugin, key=failovers, elementName=failovers, isObjectPrintable=false, isDeferChildren==false, category=core]

该方法的实现:

private void verifyNodeChildrenUsed() {
    final List<Node> children = node.getChildren();
    if (!(pluginType.isDeferChildren() || children.isEmpty())) {
        for (final Node child : children) {
            final String nodeType = node.getType().getElementName();
            final String start = nodeType.equals(node.getName()) ? node.getName() : nodeType + ' ' + node.getName();
            LOGGER.error("{} has no parameter that matches element {}", start, child.getName());
        }
   }
}

当nodeType为FailoversPlugin类时(见上文),节点类型为“appender”,但名称为“Failovers”。因此,相等性测试会生成字符串“appender Failovers”。

我还没有完全深入研究的是为什么调用这个方法,如果节点不为空并且 deferring 属性为 false,则必须显示错误消息。在我看来,这里的逻辑依赖于堆栈上的东西,并且跟踪它是很麻烦的。

我真正想做的是询问负责的开发人员的意图是什么,因为我不清楚这种行为是否正确。嗯,显然在本例中确实如此。 :S

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Log4j2的FailoverAppender错误:appender Failover没有与元素Failovers匹配的参数 的相关文章

随机推荐