当我使用log4j 2.1编译Spring3.2.9web应用程序时,这个错误出现在控制台中:
2015-02-02 12:08:25,213 ERROR appender Failover has no parameter that matches element Failovers我的理解是,元素"Failover“不存在于元素”故障转移“中,对吗?为什么会发生这种事?我不认为有什么问题,因为我有配置与log4j2手册相同。
在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>谢谢你的帮助。
发布于 2015-07-02 20:44:09
我在调试时看到的是调用PluginBuilder#verifyNodeChildrenUsed()方法,您可以预期,验证Node的子元素是正确的。正如我在下面描述的,此方法名与行为不匹配。
对于故障转移器,插件类型是:(顺便说一句,"isDeferChildren“处的额外”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“,但名称是”Failover“。所以,等式的测试会产生字符串"appender“。
我还没有完全了解为什么调用此方法时,如果节点不是空的,而延迟属性为false,则必须显示错误消息。在我看来,这里的逻辑依赖于堆栈上的一些东西,通过它进行跟踪是很麻烦的。
我真正想做的是问负责的开发人员是什么意图,因为我不清楚这种行为是否正确。显然在这个案子里是这样的。:S
发布于 2016-11-02 18:01:30
这是log4j中的一个bug。我已经指出了@Deses链接到的问题中的错误。就目前而言,这里有一个解决办法:
/**
* 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>
* <Failover name="MyAppender" primary="xxx">
* <Failovers>
* <AppenderRef ref="fallback1"/>
* <AppenderRef ref="fallback2"/>
* </Failovers>
* </Failover>
* </pre>
* do this:
* <pre>
* <Failover name="MyAppender" primary="xxx">
* <Fallback ref="fallback1"/>
* <Fallback ref="fallback2"/>
* </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;
}
}只需将其放在编译和运行时类路径上,并确保已启用注释处理。
发布于 2015-02-04 15:09:32
对于任何遇到这个问题的人来说,这都是log4j2中的一个bug。
我遇到了JIRA问题,并在它的xml文件中找到了这个注释:
<!-- 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" - -->没什么可做的了。
https://stackoverflow.com/questions/28276619
复制相似问题