我在调试时看到的是,您可能会调用 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