Index: core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java (revision 1514953) +++ core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java (working copy) @@ -32,6 +32,7 @@ import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.ConfigurationException; import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAliases; import org.apache.logging.log4j.core.config.plugins.PluginAttr; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginElement; @@ -166,7 +167,7 @@ @PluginFactory public static AsyncAppender createAppender( @PluginElement("AppenderRef") final AppenderRef[] appenderRefs, - @PluginAttr("errorRef") final String errorRef, + @PluginAttr("errorRef") @PluginAliases("error-ref") final String errorRef, @PluginAttr("blocking") final String blocking, @PluginAttr("bufferSize") final String size, @PluginAttr("name") final String name, Index: core/src/main/java/org/apache/logging/log4j/core/config/AppenderRef.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/config/AppenderRef.java (revision 1514953) +++ core/src/main/java/org/apache/logging/log4j/core/config/AppenderRef.java (working copy) @@ -20,6 +20,7 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAliases; import org.apache.logging.log4j.core.config.plugins.PluginAttr; import org.apache.logging.log4j.core.config.plugins.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; @@ -29,6 +30,7 @@ * An Appender reference. */ @Plugin(name = "AppenderRef", category = "Core", printObject = true) +@PluginAliases("appender-ref") public final class AppenderRef { private static final Logger LOGGER = StatusLogger.getLogger(); @@ -54,6 +56,11 @@ return filter; } + @Override + public String toString() { + return ref; + } + /** * Create an Appender reference. * @param ref The name of the Appender. Index: core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java (revision 1514953) +++ core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java (working copy) @@ -36,6 +36,7 @@ import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.ConsoleAppender; +import org.apache.logging.log4j.core.config.plugins.PluginAliases; import org.apache.logging.log4j.core.config.plugins.PluginAttr; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginElement; @@ -635,7 +636,16 @@ * If not an array, store the object in the child node into the parameter array. */ for (final Annotation[] parmTypes : parmArray) { + String[] aliases = null; + for (final Annotation a: parmTypes) { + if (a instanceof PluginAliases) { + aliases = ((PluginAliases) a).value(); + } + } for (final Annotation a : parmTypes) { + if (a instanceof PluginAliases) { + continue; + } if (sb.length() == 0) { sb.append(" with params("); } else { @@ -655,14 +665,15 @@ final String name = ((PluginValue) a).value(); String v = node.getValue(); if (v == null) { - v = getAttrValue("value", attrs); + v = getAttrValue("value", null, attrs); } final String value = subst.replace(event, v); sb.append(name).append("=\"").append(value).append("\""); parms[index] = value; } else if (a instanceof PluginAttr) { - final String name = ((PluginAttr) a).value(); - final String value = subst.replace(event, getAttrValue(name, attrs)); + PluginAttr attr = (PluginAttr) a; + final String name = attr.value(); + final String value = subst.replace(event, getAttrValue(name, aliases, attrs)); sb.append(name).append("=\"").append(value).append("\""); parms[index] = value; } else if (a instanceof PluginElement) { @@ -804,13 +815,22 @@ } } - private String getAttrValue(final String name, final Map attrs) { + private String getAttrValue(final String name, final String[] aliases, final Map attrs) { for (final String key : attrs.keySet()) { if (key.equalsIgnoreCase(name)) { final String attr = attrs.get(key); attrs.remove(key); return attr; } + if (aliases != null) { + for (String alias : aliases) { + if (key.equalsIgnoreCase(alias)) { + final String attr = attrs.get(key); + attrs.remove(key); + return attr; + } + } + } } return null; } Index: core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java (revision 1514953) +++ core/src/main/java/org/apache/logging/log4j/core/config/XMLConfiguration.java (working copy) @@ -73,7 +73,7 @@ /** * Creates a new DocumentBuilder suitable for parsing a configuration file. - * + * * @return a new DocumentBuilder * @throws ParserConfigurationException */ @@ -87,7 +87,7 @@ /** * Enables XInclude for the given DocumentBuilderFactory - * + * * @param factory * a DocumentBuilderFactory * @throws ParserConfigurationException @@ -345,7 +345,8 @@ if (w3cNode instanceof Element) { final Element child = (Element) w3cNode; final String name = getType(child); - final PluginType type = getPluginManager().getPluginType(name); + PluginManager mgr = getPluginManager(); + final PluginType type = mgr.getPluginType(name); final Node childNode = new Node(node, name, type); constructHierarchy(childNode, child); if (type == null) { Index: core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java (working copy) +++ core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAliases.java (working copy) @@ -25,8 +25,8 @@ * Identifies a Plugin Attribute. */ @Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.PARAMETER) -public @interface PluginAttr { +@Target({ElementType.PARAMETER, ElementType.TYPE}) +public @interface PluginAliases { - String value(); + String[] value(); } Index: core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java =================================================================== --- core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java (revision 1514953) +++ core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginManager.java (working copy) @@ -174,14 +174,22 @@ } for (final Class clazz : resolver.getClasses()) { final Plugin plugin = clazz.getAnnotation(Plugin.class); - final String pluginType = plugin.category(); - if (!pluginTypeMap.containsKey(pluginType)) { - pluginTypeMap.putIfAbsent(pluginType, new ConcurrentHashMap>()); + final String pluginCategory = plugin.category(); + if (!pluginTypeMap.containsKey(pluginCategory)) { + pluginTypeMap.putIfAbsent(pluginCategory, new ConcurrentHashMap>()); } - final Map> map = pluginTypeMap.get(pluginType); - final String type = plugin.elementType().equals(Plugin.EMPTY) ? plugin.name() : plugin.elementType(); - map.put(plugin.name().toLowerCase(), new PluginType(clazz, type, plugin.printObject(), - plugin.deferChildren())); + final Map> map = pluginTypeMap.get(pluginCategory); + String type = plugin.elementType().equals(Plugin.EMPTY) ? plugin.name() : plugin.elementType(); + PluginType pluginType = new PluginType(clazz, type, plugin.printObject(), plugin.deferChildren()); + map.put(plugin.name().toLowerCase(), pluginType); + final PluginAliases pluginAliases = clazz.getAnnotation(PluginAliases.class); + if (pluginAliases != null) { + for (String alias : pluginAliases.value()) { + type = plugin.elementType().equals(Plugin.EMPTY) ? alias : plugin.elementType(); + pluginType = new PluginType(clazz, type, plugin.printObject(), plugin.deferChildren()); + map.put(alias.trim().toLowerCase(), pluginType); + } + } } long elapsed = System.nanoTime() - start; plugins = pluginTypeMap.get(type); Index: core/src/test/resources/log4j-asynch.xml =================================================================== --- core/src/test/resources/log4j-asynch.xml (revision 1514953) +++ core/src/test/resources/log4j-asynch.xml (working copy) @@ -25,7 +25,7 @@ - + Index: core/src/test/resources/log4j-test2.xml =================================================================== --- core/src/test/resources/log4j-test2.xml (revision 1514953) +++ core/src/test/resources/log4j-test2.xml (working copy) @@ -61,7 +61,8 @@ > - + + Index: src/changes/changes.xml =================================================================== --- src/changes/changes.xml (revision 1514953) +++ src/changes/changes.xml (working copy) @@ -21,6 +21,9 @@ + + Allow Plugins to have aliases. + Create a JSON Layout.