首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Log4j2的FailoverAppender错误: appender没有匹配元素Failover的参数

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

Stack Overflow用户
提问于 2015-02-02 11:21:50
回答 5查看 20.6K关注 0票数 8

当我使用log4j 2.1编译Spring3.2.9web应用程序时,这个错误出现在控制台中:

代码语言:javascript
复制
2015-02-02 12:08:25,213 ERROR appender Failover has no parameter that matches element Failovers

我的理解是,元素"Failover“不存在于元素”故障转移“中,对吗?为什么会发生这种事?我不认为有什么问题,因为我有配置与log4j2手册相同。

在log4j2.xml中有这样的配置:

代码语言:javascript
复制
<?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>

谢谢你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-07-02 20:44:09

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

对于故障转移器,插件类型是:(顺便说一句,"isDeferChildren“处的额外”isDeferChildren“仅在toString()实现中,不影响测试。)

代码语言:javascript
复制
PluginType [pluginClass=class org.apache.logging.log4j.core.appender.FailoversPlugin, key=failovers, elementName=failovers, isObjectPrintable=false, isDeferChildren==false, category=core]

这一方法的实施:

代码语言:javascript
复制
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“,但名称是”Failover“。所以,等式的测试会产生字符串"appender“。

我还没有完全了解为什么调用此方法时,如果节点不是空的,而延迟属性为false,则必须显示错误消息。在我看来,这里的逻辑依赖于堆栈上的一些东西,通过它进行跟踪是很麻烦的。

我真正想做的是问负责的开发人员是什么意图,因为我不清楚这种行为是否正确。显然在这个案子里是这样的。:S

票数 7
EN

Stack Overflow用户

发布于 2016-11-02 18:01:30

这是log4j中的一个bug。我已经指出了@Deses链接到的问题中的错误。就目前而言,这里有一个解决办法:

代码语言:javascript
复制
/**
 * Avoids a bug in log4j, whereby plugins that produce an array (e.g. {@linkplain FailoversPlugin})
 * cause an error to be logged.
 * <p>
 * To use, instead of this:
 * <pre>
 * &lt;Failover name="MyAppender" primary="xxx">
 *   &lt;Failovers>
 *     &lt;AppenderRef ref="fallback1"/>
 *     &lt;AppenderRef ref="fallback2"/>
 *   &lt;/Failovers>
 * &lt;/Failover>
 * </pre>
 * do this:
 * <pre>
 * &lt;Failover name="MyAppender" primary="xxx">
 *   &lt;Fallback ref="fallback1"/>
 *   &lt;Fallback ref="fallback2"/>
 * &lt;/Failover>
 * </pre>
 */
@Plugin(name="Fallback", category=Node.CATEGORY, elementType="Failovers")
public class Fallback {

    private Fallback(){}

    @PluginFactory
    public static String createFallbackRef(@PluginAttribute("ref") @Required String ref) {
        return ref;
    }

}

只需将其放在编译和运行时类路径上,并确保已启用注释处理。

票数 1
EN

Stack Overflow用户

发布于 2015-02-04 15:09:32

对于任何遇到这个问题的人来说,这都是log4j2中的一个bug。

我遇到了JIRA问题,并在它的xml文件中找到了这个注释:

代码语言:javascript
复制
<!-- set status below to FATAL to suppress a bug in log4j2: "ERROR appender Failover has no parameter that matches element Failovers" -->
<!--  other working value for status is "warn" -  -->

没什么可做的了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28276619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档