in log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java [378:441]
private Appender buildAppender(final String className, final Element appenderElement) {
try {
final Appender appender = LoaderUtil.newInstanceOf(className);
final PropertySetter propSetter = new PropertySetter(appender);
appender.setName(subst(appenderElement.getAttribute(NAME_ATTR)));
final AtomicReference<Filter> filterChain = new AtomicReference<>();
forEachElement(appenderElement.getChildNodes(), currentElement -> {
// Parse appender parameters
switch (currentElement.getTagName()) {
case PARAM_TAG:
setParameter(currentElement, propSetter);
break;
case LAYOUT_TAG:
appender.setLayout(parseLayout(currentElement));
break;
case FILTER_TAG:
addFilter(filterChain, currentElement);
break;
case ERROR_HANDLER_TAG:
parseErrorHandler(currentElement, appender);
break;
case APPENDER_REF_TAG:
final String refName = subst(currentElement.getAttribute(REF_ATTR));
if (appender instanceof AppenderAttachable) {
final AppenderAttachable aa = (AppenderAttachable) appender;
final Appender child = findAppenderByReference(currentElement);
LOGGER.debug("Attaching appender named [{}] to appender named [{}].", refName,
appender.getName());
aa.addAppender(child);
} else {
LOGGER.error("Requesting attachment of appender named [{}] to appender named [{}]"
+ "which does not implement org.apache.log4j.spi.AppenderAttachable.",
refName, appender.getName());
}
break;
default:
try {
parseUnrecognizedElement(appender, currentElement, props);
} catch (Exception ex) {
throw new ConsumerException(ex);
}
}
});
final Filter head = filterChain.get();
if (head != null) {
appender.addFilter(head);
}
propSetter.activate();
return appender;
} catch (ConsumerException ex) {
final Throwable t = ex.getCause();
if (t instanceof InterruptedException || t instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
LOGGER.error("Could not create an Appender. Reported error follows.", t);
} catch (Exception oops) {
if (oops instanceof InterruptedException || oops instanceof InterruptedIOException) {
Thread.currentThread().interrupt();
}
LOGGER.error("Could not create an Appender. Reported error follows.", oops);
}
return null;
}