当我使用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
据我所知,“故障转移”元素中不存在“故障转移”元素,对吧?为什么会这样?我没有看到错误,因为我有same configuration as the log4j2 manual.
我在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>
感谢您的帮助。
答案 0 :(得分:6)
我在调试时看到的是调用PluginBuilder#verifyNodeChildrenUsed()方法,您可以预期,验证Node的子元素是否正确。如下所述,此方法名称与行为不匹配。
对于故障转移追加器,插件类型为:(顺便说一句,额外&#34; ==&#34; at&#34; isDeferChildren&#34;只是在toString()实现中,并且不影响测试。)
vm.getTasks = function() {
LocationGraphService.getTasks()
.then(function (data) {
vm.tasks = data;
});
};
此方法的实施:
PluginType [pluginClass=class org.apache.logging.log4j.core.appender.FailoversPlugin, key=failovers, elementName=failovers, isObjectPrintable=false, isDeferChildren==false, category=core]
当nodeType是FailoversPlugin类(见上文)时,节点类型为&#34; appender&#34;但名字是&#34; Failovers&#34;。因此,相等的测试产生字符串&#34; appender Failovers&#34;。
我还没有完全挖掘的是为什么调用此方法,如果节点不为空并且延迟属性为false,则必须显示错误消息。在我看来,这里的逻辑依赖于堆栈上的东西,并且通过这种方式进行追踪是很麻烦的。
我真正想做的是问开发者负责的意图是什么,因为我不清楚行为是否正确。嗯,显然在这种情况下是正确的。 :S
答案 1 :(得分:1)
此是 log4j中的错误。我已经指出了由@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;
}
}
只需将其粘贴在编译和运行时类路径上,并确保启用注释处理。
答案 2 :(得分:0)
对于遇到此问题的任何人来说,这是log4j2中的一个错误。
我遇到this JIRA issue并在其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" - -->
没什么可做的。
答案 3 :(得分:0)
我有一个类似的问题,我在Log4j xml中评论了故障转移标签,现在我的所有日志都已创建
答案 4 :(得分:-1)
在我的情况下,您应该在主要和故障转移上添加ignoreExceptions
。
`<Console name="Console-Appender" target="SYSTEM_OUT" ignoreExceptions="false">
<PatternLayout>
<pattern>${log-pattern}</pattern>
</PatternLayout>
</Console>`