You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2018/10/30 02:16:45 UTC

[1/2] logging-log4j2 git commit: [LOG4J2-2491] Allow all Appenders to optionally carry a Property array.

Repository: logging-log4j2
Updated Branches:
  refs/heads/release-2.x d39546d77 -> 61b77dfb6


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
index a89e5e0..b241f29 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/jdbc/JdbcAppender.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
 import org.apache.logging.log4j.core.appender.db.ColumnMapping;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -55,8 +56,8 @@ public final class JdbcAppender extends AbstractDatabaseAppender<JdbcDatabaseMan
     private final String description;
 
     private JdbcAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
-            final boolean ignoreExceptions, final JdbcDatabaseManager manager) {
-        super(name, filter, layout, ignoreExceptions, manager);
+            final boolean ignoreExceptions, final Property[] properties, final JdbcDatabaseManager manager) {
+        super(name, filter, layout, ignoreExceptions, properties, manager);
         this.description = this.getName() + "{ manager=" + this.getManager() + " }";
     }
 
@@ -89,9 +90,7 @@ public final class JdbcAppender extends AbstractDatabaseAppender<JdbcDatabaseMan
         .setBufferSize(bufferSizeInt)
         .setColumnConfigs(columnConfigs)
         .setConnectionSource(connectionSource)
-        .setTableName(tableName)
-        .withName(name)
-        .withIgnoreExceptions(ignoreExceptions).setFilter(filter)
+        .setTableName(tableName).setName(name).setIgnoreExceptions(ignoreExceptions).setFilter(filter)
             .build();
     }
 
@@ -180,7 +179,8 @@ public final class JdbcAppender extends AbstractDatabaseAppender<JdbcDatabaseMan
             if (manager == null) {
                 return null;
             }
-            return new JdbcAppender(getName(), getFilter(), getLayout(), isIgnoreExceptions(), manager);
+            return new JdbcAppender(getName(), getFilter(), getLayout(), isIgnoreExceptions(), getPropertyArray(),
+                    manager);
         }
 
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java
index 1704018..7a7bd43 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsAppender.java
@@ -29,8 +29,11 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.AbstractManager;
+import org.apache.logging.log4j.core.appender.HttpAppender;
+import org.apache.logging.log4j.core.appender.HttpAppender.Builder;
 import org.apache.logging.log4j.core.appender.mom.JmsManager.JmsManagerConfiguration;
 import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.core.config.Property;
 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.PluginBuilderAttribute;
@@ -47,15 +50,12 @@ import org.apache.logging.log4j.core.net.JndiManager;
 @PluginAliases({ "JMSQueue", "JMSTopic" })
 public class JmsAppender extends AbstractAppender {
 
-    public static class Builder implements org.apache.logging.log4j.core.util.Builder<JmsAppender> {
+    public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
+            implements org.apache.logging.log4j.core.util.Builder<JmsAppender> {
 
         public static final int DEFAULT_RECONNECT_INTERVAL_MILLIS = 5000;
 
         @PluginBuilderAttribute
-        @Required(message = "A name for the JmsAppender must be specified")
-        private String name;
-
-        @PluginBuilderAttribute
         private String factoryName;
 
         @PluginBuilderAttribute
@@ -85,18 +85,9 @@ public class JmsAppender extends AbstractAppender {
         @PluginBuilderAttribute(sensitive = true)
         private char[] password;
 
-        @PluginElement("Layout")
-        private Layout<? extends Serializable> layout;
-
-        @PluginElement("Filter")
-        private Filter filter;
-
         private long reconnectIntervalMillis = DEFAULT_RECONNECT_INTERVAL_MILLIS;
 
         @PluginBuilderAttribute
-        private boolean ignoreExceptions = true;
-
-        @PluginBuilderAttribute
         private boolean immediateFail;
 
         // Programmatic access only for now.
@@ -115,20 +106,22 @@ public class JmsAppender extends AbstractAppender {
                         securityPrincipalName, securityCredentials, null);
                 configuration = new JmsManagerConfiguration(jndiProperties, factoryBindingName, destinationBindingName,
                         userName, password, false, reconnectIntervalMillis);
-                actualJmsManager = AbstractManager.getManager(name, JmsManager.FACTORY, configuration);
+                actualJmsManager = AbstractManager.getManager(getName(), JmsManager.FACTORY, configuration);
             }
             if (actualJmsManager == null) {
                 // JmsManagerFactory has already logged an ERROR.
                 return null;
             }
+            Layout<? extends Serializable> layout = getLayout();
             if (layout == null) {
                 LOGGER.error("No layout provided for JmsAppender");
                 return null;
             }
             try {
-                return new JmsAppender(name, filter, layout, ignoreExceptions, actualJmsManager);
+                return new JmsAppender(getName(), getFilter(), layout, isIgnoreExceptions(), getPropertyArray(),
+                        actualJmsManager);
             } catch (final JMSException e) {
-                //  Never happens since the ctor no longer actually throws a JMSException.
+                // Never happens since the ctor no longer actually throws a JMSException.
                 throw new IllegalStateException(e);
             }
         }
@@ -148,16 +141,6 @@ public class JmsAppender extends AbstractAppender {
             return this;
         }
 
-        public Builder setFilter(final Filter filter) {
-            this.filter = filter;
-            return this;
-        }
-
-        public Builder setIgnoreExceptions(final boolean ignoreExceptions) {
-            this.ignoreExceptions = ignoreExceptions;
-            return this;
-        }
-
         public Builder setImmediateFail(final boolean immediateFail) {
             this.immediateFail = immediateFail;
             return this;
@@ -168,16 +151,6 @@ public class JmsAppender extends AbstractAppender {
             return this;
         }
 
-        public Builder setLayout(final Layout<? extends Serializable> layout) {
-            this.layout = layout;
-            return this;
-        }
-
-        public Builder setName(final String name) {
-            this.name = name;
-            return this;
-        }
-
         public Builder setPassword(final char[] password) {
             this.password = password;
             return this;
@@ -236,12 +209,12 @@ public class JmsAppender extends AbstractAppender {
          */
         @Override
         public String toString() {
-            return "Builder [name=" + name + ", factoryName=" + factoryName + ", providerUrl=" + providerUrl
+            return "Builder [name=" + getName() + ", factoryName=" + factoryName + ", providerUrl=" + providerUrl
                     + ", urlPkgPrefixes=" + urlPkgPrefixes + ", securityPrincipalName=" + securityPrincipalName
                     + ", securityCredentials=" + securityCredentials + ", factoryBindingName=" + factoryBindingName
                     + ", destinationBindingName=" + destinationBindingName + ", username=" + userName + ", layout="
-                    + layout + ", filter=" + filter + ", ignoreExceptions=" + ignoreExceptions + ", jmsManager="
-                    + jmsManager + "]";
+                    + getLayout() + ", filter=" + getFilter() + ", ignoreExceptions=" + isIgnoreExceptions()
+                    + ", jmsManager=" + jmsManager + "]";
         }
 
     }
@@ -255,12 +228,23 @@ public class JmsAppender extends AbstractAppender {
 
     /**
      *
-     * @throws JMSException
-     *             not thrown as of 2.9 but retained in the signature for compatibility, will be removed in 3.0
+     * @throws JMSException not thrown as of 2.9 but retained in the signature for compatibility, will be removed in 3.0
+     */
+    protected JmsAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
+            final boolean ignoreExceptions, final Property[] properties, final JmsManager manager) throws JMSException {
+        super(name, filter, layout, ignoreExceptions, properties);
+        this.manager = manager;
+    }
+
+    /**
+     *
+     * @throws JMSException not thrown as of 2.9 but retained in the signature for compatibility, will be removed in 3.0
+     * @deprecated
      */
+    @Deprecated
     protected JmsAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
             final boolean ignoreExceptions, final JmsManager manager) throws JMSException {
-        super(name, filter, layout, ignoreExceptions);
+        super(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
         this.manager = manager;
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
index aa78fad..ef8593f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/jeromq/JeroMqAppender.java
@@ -69,8 +69,8 @@ public final class JeroMqAppender extends AbstractAppender {
             final long maxMsgSize, final long rcvHwm, final long receiveBufferSize, final int receiveTimeOut,
             final long reconnectIVL, final long reconnectIVLMax, final long sendBufferSize, final int sendTimeOut,
             final long sndHWM, final int tcpKeepAlive, final long tcpKeepAliveCount, final long tcpKeepAliveIdle,
-            final long tcpKeepAliveInterval, final boolean xpubVerbose) {
-        super(name, filter, layout, ignoreExceptions);
+            final long tcpKeepAliveInterval, final boolean xpubVerbose, final Property[] properties) {
+        super(name, filter, layout, ignoreExceptions, properties);
         this.manager = JeroMqManager.getJeroMqManager(name, affinity, backlog, delayAttachOnConnect, identity, ipv4Only,
             linger, maxMsgSize, rcvHwm, receiveBufferSize, receiveTimeOut, reconnectIVL, reconnectIVLMax,
             sendBufferSize, sendTimeOut, sndHWM, tcpKeepAlive, tcpKeepAliveCount, tcpKeepAliveIdle,
@@ -134,7 +134,7 @@ public final class JeroMqAppender extends AbstractAppender {
         return new JeroMqAppender(name, filter, layout, ignoreExceptions, endpoints, affinity, backlog,
                 delayAttachOnConnect, identity, ipv4Only, linger, maxMsgSize, rcvHwm, receiveBufferSize,
                 receiveTimeOut, reconnectIVL, reconnectIVLMax, sendBufferSize, sendTimeOut, sndHwm, tcpKeepAlive,
-                tcpKeepAliveCount, tcpKeepAliveIdle, tcpKeepAliveInterval, xpubVerbose);
+                tcpKeepAliveCount, tcpKeepAliveIdle, tcpKeepAliveInterval, xpubVerbose, null);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java
index e4d8e6b..642d6bb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/kafka/KafkaAppender.java
@@ -35,7 +35,6 @@ import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.layout.SerializedLayout;
 
 /**
@@ -68,9 +67,10 @@ public final class KafkaAppender extends AbstractAppender {
                 AbstractLifeCycle.LOGGER.error("No layout provided for KafkaAppender");
                 return null;
             }
-            final KafkaManager kafkaManager =
-                    new KafkaManager(getConfiguration().getLoggerContext(), getName(), topic, syncSend, getProperties(), key);
-            return new KafkaAppender(getName(), layout, getFilter(), isIgnoreExceptions(), kafkaManager);
+            final KafkaManager kafkaManager = new KafkaManager(getConfiguration().getLoggerContext(), getName(), topic,
+                    syncSend, getPropertyArray(), key);
+            return new KafkaAppender(getName(), layout, getFilter(), isIgnoreExceptions(), kafkaManager,
+                    getPropertyArray());
         }
 
         public String getTopic() {
@@ -110,7 +110,7 @@ public final class KafkaAppender extends AbstractAppender {
         }
         final KafkaManager kafkaManager =
                 new KafkaManager(configuration.getLoggerContext(), name, topic, true, properties, key);
-        return new KafkaAppender(name, layout, filter, ignoreExceptions, kafkaManager);
+        return new KafkaAppender(name, layout, filter, ignoreExceptions, kafkaManager, null);
     }
 
     /**
@@ -125,8 +125,8 @@ public final class KafkaAppender extends AbstractAppender {
     private final KafkaManager manager;
 
     private KafkaAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
-            final boolean ignoreExceptions, final KafkaManager manager) {
-        super(name, filter, layout, ignoreExceptions);
+            final boolean ignoreExceptions, final KafkaManager manager, final Property[] properties) {
+        super(name, filter, layout, ignoreExceptions, properties);
         this.manager = Objects.requireNonNull(manager, "manager");
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
index 0d23a2a..fd3ca5d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlAppender.java
@@ -23,6 +23,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -78,7 +79,7 @@ public final class NoSqlAppender extends AbstractDatabaseAppender<NoSqlDatabaseM
                 return null;
             }
 
-            return new NoSqlAppender(name, getFilter(), getLayout(), isIgnoreExceptions(), manager);
+            return new NoSqlAppender(name, getFilter(), getLayout(), isIgnoreExceptions(), getPropertyArray(), manager);
         }
 
         /**
@@ -152,7 +153,7 @@ public final class NoSqlAppender extends AbstractDatabaseAppender<NoSqlDatabaseM
             return null;
         }
 
-        return new NoSqlAppender(name, filter, null, ignoreExceptions, manager);
+        return new NoSqlAppender(name, filter, null, ignoreExceptions, null, manager);
     }
 
     @PluginBuilderFactory
@@ -163,8 +164,8 @@ public final class NoSqlAppender extends AbstractDatabaseAppender<NoSqlDatabaseM
     private final String description;
 
     private NoSqlAppender(final String name, final Filter filter, Layout<? extends Serializable> layout,
-            final boolean ignoreExceptions, final NoSqlDatabaseManager<?> manager) {
-        super(name, filter, layout, ignoreExceptions, manager);
+            final boolean ignoreExceptions, final Property[] properties, final NoSqlDatabaseManager<?> manager) {
+        super(name, filter, layout, ignoreExceptions, properties, manager);
         this.description = this.getName() + "{ manager=" + this.getManager() + " }";
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
index 64a0abd..fc7dc5e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/RewriteAppender.java
@@ -27,6 +27,7 @@ import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.config.AppenderControl;
 import org.apache.logging.log4j.core.config.AppenderRef;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
@@ -47,8 +48,8 @@ public final class RewriteAppender extends AbstractAppender {
 
     private RewriteAppender(final String name, final Filter filter, final boolean ignoreExceptions,
                             final AppenderRef[] appenderRefs, final RewritePolicy rewritePolicy,
-                            final Configuration config) {
-        super(name, filter, null, ignoreExceptions);
+                            final Configuration config, final Property[] properties) {
+        super(name, filter, null, ignoreExceptions, properties);
         this.config = config;
         this.rewritePolicy = rewritePolicy;
         this.appenderRefs = appenderRefs;
@@ -113,6 +114,6 @@ public final class RewriteAppender extends AbstractAppender {
             LOGGER.error("No appender references defined for RewriteAppender");
             return null;
         }
-        return new RewriteAppender(name, filter, ignoreExceptions, appenderRefs, rewritePolicy, config);
+        return new RewriteAppender(name, filter, ignoreExceptions, appenderRefs, rewritePolicy, config, null);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
index d55504b..4fd50d2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/routing/RoutingAppender.java
@@ -35,6 +35,7 @@ import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy;
 import org.apache.logging.log4j.core.config.AppenderControl;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.Node;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
@@ -83,7 +84,7 @@ public final class RoutingAppender extends AbstractAppender {
                 return null;
             }
             return new RoutingAppender(name, getFilter(), isIgnoreExceptions(), routes, rewritePolicy,
-                    getConfiguration(), purgePolicy, defaultRouteScript);
+                    getConfiguration(), purgePolicy, defaultRouteScript, getPropertyArray());
         }
 
         public Routes getRoutes() {
@@ -141,8 +142,8 @@ public final class RoutingAppender extends AbstractAppender {
 
     private RoutingAppender(final String name, final Filter filter, final boolean ignoreExceptions, final Routes routes,
             final RewritePolicy rewritePolicy, final Configuration configuration, final PurgePolicy purgePolicy,
-            final AbstractScript defaultRouteScript) {
-        super(name, filter, null, ignoreExceptions);
+            final AbstractScript defaultRouteScript, final Property[] properties) {
+        super(name, filter, null, ignoreExceptions, properties);
         this.routes = routes;
         this.configuration = configuration;
         this.rewritePolicy = rewritePolicy;
@@ -333,7 +334,7 @@ public final class RoutingAppender extends AbstractAppender {
             LOGGER.error("No routes defined for RoutingAppender");
             return null;
         }
-        return new RoutingAppender(name, filter, ignoreExceptions, routes, rewritePolicy, config, purgePolicy, null);
+        return new RoutingAppender(name, filter, ignoreExceptions, routes, rewritePolicy, config, purgePolicy, null, null);
     }
 
     public Route getDefaultRoute() {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index 5938539..ecaf4b3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -122,8 +122,8 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
     private ConcurrentMap<String, Appender> appenders = new ConcurrentHashMap<>();
     private ConcurrentMap<String, LoggerConfig> loggerConfigs = new ConcurrentHashMap<>();
     private List<CustomLevelConfig> customLevels = Collections.emptyList();
-    private final ConcurrentMap<String, String> properties = new ConcurrentHashMap<>();
-    private final StrLookup tempLookup = new Interpolator(properties);
+    private final ConcurrentMap<String, String> propertyMap = new ConcurrentHashMap<>();
+    private final StrLookup tempLookup = new Interpolator(propertyMap);
     private final StrSubstitutor subst = new StrSubstitutor(tempLookup);
     private LoggerConfig root = new LoggerConfig();
     private final ConcurrentMap<String, Object> componentMap = new ConcurrentHashMap<>();
@@ -142,7 +142,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
         // The loggerContext is null for the NullConfiguration class.
         // this.loggerContext = new WeakReference(Objects.requireNonNull(loggerContext, "loggerContext is null"));
         this.configurationSource = Objects.requireNonNull(configurationSource, "configurationSource is null");
-        componentMap.put(Configuration.CONTEXT_PROPERTIES, properties);
+        componentMap.put(Configuration.CONTEXT_PROPERTIES, propertyMap);
         pluginManager = new PluginManager(Node.CATEGORY);
         rootNode = new Node();
         setState(State.INITIALIZING);
@@ -161,7 +161,7 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
 
     @Override
     public Map<String, String> getProperties() {
-        return properties;
+        return propertyMap;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
index 09b07a5..cb4731e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Property.java
@@ -32,6 +32,11 @@ import org.apache.logging.log4j.util.Strings;
 @Plugin(name = "property", category = Node.CATEGORY, printObject = true)
 public final class Property {
 
+    /**
+     * @since 2.11.2
+     */
+    public static final Property[] EMPTY_ARRAY = new Property[0];
+    
     private static final Logger LOGGER = StatusLogger.getLogger();
 
     private final String name;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
index 34234ff..4c61d33 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/AbstractFilterable.java
@@ -41,8 +41,10 @@ public abstract class AbstractFilterable extends AbstractLifeCycle implements Fi
         @PluginElement("Filter")
         private Filter filter;
 
+        // We are calling this attribute propertyArray because we use the more generic "properties" in several places
+        // with different types: Array, Map and List.
         @PluginElement("Properties")
-        private Property[] properties;
+        private Property[] propertyArray;
 
         @SuppressWarnings("unchecked")
         public B asBuilder() {
@@ -53,8 +55,8 @@ public abstract class AbstractFilterable extends AbstractLifeCycle implements Fi
             return filter;
         }
 
-        public Property[] getProperties() {
-            return properties;
+        public Property[] getPropertyArray() {
+            return propertyArray;
         }
 
         public B setFilter(final Filter filter) {
@@ -62,12 +64,16 @@ public abstract class AbstractFilterable extends AbstractLifeCycle implements Fi
             return asBuilder();
         }
 
-        public B setProperties(Property[] properties) {
-            this.properties = properties;
+        public B setPropertyArray(Property[] properties) {
+            this.propertyArray = properties;
             return asBuilder();
         }
 
         /**
+         * Sets the filter.
+         * 
+         * @param filter The filter
+         * @return this
          * @deprecated Use {@link #setFilter(Filter)}.
          */
         @Deprecated
@@ -81,12 +87,24 @@ public abstract class AbstractFilterable extends AbstractLifeCycle implements Fi
      * May be null.
      */
     private volatile Filter filter;
+    
+    @PluginElement("Properties")
+    private final Property[] propertyArray;
 
     protected AbstractFilterable() {
+        this(null, Property.EMPTY_ARRAY);
     }
 
     protected AbstractFilterable(final Filter filter) {
+        this(filter, Property.EMPTY_ARRAY);
+    }
+
+    /**
+     * @since 2.11.2
+     */
+    protected AbstractFilterable(final Filter filter, final Property[] propertyArray) {
         this.filter = filter;
+        this.propertyArray = propertyArray == null ? Property.EMPTY_ARRAY : propertyArray;
     }
 
     /**
@@ -203,4 +221,8 @@ public abstract class AbstractFilterable extends AbstractLifeCycle implements Fi
         return stopped;
     }
 
+    public Property[] getPropertyArray() {
+        return propertyArray;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java
index a3303bb..d0ff679 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderBuilderTest.java
@@ -40,7 +40,7 @@ public class ConsoleAppenderBuilderTest {
      */
     @Test
     public void testDefaultLayoutDefaultCharset() {
-        final ConsoleAppender appender = ConsoleAppender.newBuilder().withName("test").build();
+        final ConsoleAppender appender = ConsoleAppender.newBuilder().setName("test").build();
         final PatternLayout layout = (PatternLayout) appender.getLayout();
         final String charsetName = System.getProperty("sun.stdout.encoding");
         final String expectedName = charsetName != null ? charsetName : Charset.defaultCharset().name();
@@ -52,7 +52,7 @@ public class ConsoleAppenderBuilderTest {
      */
     @Test
     public void testSetNullErrorHandlerIsNotAllowed() {
-        final ConsoleAppender appender = ConsoleAppender.newBuilder().withName("test").build();
+        final ConsoleAppender appender = ConsoleAppender.newBuilder().setName("test").build();
         ErrorHandler handler = appender.getHandler();
         Assert.assertNotNull(handler);
         // This could likely be allowed to throw, but we're just testing that

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
index e203db1..39e204e 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/ConsoleAppenderTest.java
@@ -92,8 +92,7 @@ public class ConsoleAppenderTest {
         try {
             systemSetter.systemSet(psMock);
             final Layout<String> layout = PatternLayout.newBuilder().withAlwaysWriteExceptions(true).build();
-            final ConsoleAppender app = ConsoleAppender.newBuilder().withLayout(layout).setTarget(targetName)
-                    .withName("Console").withIgnoreExceptions(false).build();
+            final ConsoleAppender app = ConsoleAppender.newBuilder().setLayout(layout).setTarget(targetName).setName("Console").setIgnoreExceptions(false).build();
             app.start();
             assertTrue("Appender did not start", app.isStarted());
 
@@ -125,8 +124,7 @@ public class ConsoleAppenderTest {
     }
 
     private void testFollowSystemPrintStream(final PrintStream ps, final Target target, final SystemSetter systemSetter) {
-        final ConsoleAppender app = ConsoleAppender.newBuilder().setTarget(target).setFollow(true)
-                .withIgnoreExceptions(false).withName("test").build();
+        final ConsoleAppender app = ConsoleAppender.newBuilder().setTarget(target).setFollow(true).setIgnoreExceptions(false).setName("test").build();
         Assert.assertEquals(target, app.getTarget());
         app.start();
         try {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java
index 716c9de..0c2ed98 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderPermissionsTest.java
@@ -92,13 +92,10 @@ public class FileAppenderPermissionsTest {
                 .build();
         // @formatter:off
         final FileAppender appender = FileAppender.newBuilder()
-            .withFileName(file.getAbsolutePath())
-            .withName("test")
-            .withImmediateFlush(false)
-            .withIgnoreExceptions(false)
+        .withFileName(file.getAbsolutePath()).setName("test")
+            .withImmediateFlush(false).setIgnoreExceptions(false)
             .withBufferedIo(false)
-            .withBufferSize(1)
-            .withLayout(layout)
+            .withBufferSize(1).setLayout(layout)
             .withCreateOnDemand(createOnDemand)
             .withFilePermissions(filePermissions)
             .build();
@@ -147,13 +144,10 @@ public class FileAppenderPermissionsTest {
                 .build();
         // @formatter:off
         final FileAppender appender = FileAppender.newBuilder()
-            .withFileName(file.getAbsolutePath())
-            .withName("test")
-            .withImmediateFlush(true)
-            .withIgnoreExceptions(false)
+        .withFileName(file.getAbsolutePath()).setName("test")
+            .withImmediateFlush(true).setIgnoreExceptions(false)
             .withBufferedIo(false)
-            .withBufferSize(1)
-            .withLayout(layout)
+            .withBufferSize(1).setLayout(layout)
             .withFilePermissions(filePermissions)
             .withFileOwner(user)
             .withFileGroup(group)

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
index 066b560..80ae3c9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/FileAppenderTest.java
@@ -93,13 +93,10 @@ public class FileAppenderTest {
         final Layout<String> layout = createPatternLayout();
         // @formatter:off
         final FileAppender appender = FileAppender.newBuilder()
-            .withFileName(FILE_NAME)
-            .withName("test")
-            .withImmediateFlush(false)
-            .withIgnoreExceptions(false)
+        .withFileName(FILE_NAME).setName("test")
+            .withImmediateFlush(false).setIgnoreExceptions(false)
             .withBufferedIo(false)
-            .withBufferSize(1)
-            .withLayout(layout)
+            .withBufferSize(1).setLayout(layout)
             .withCreateOnDemand(createOnDemand)
             .build();
         // @formatter:on
@@ -124,13 +121,10 @@ public class FileAppenderTest {
         final Layout<String> layout = createPatternLayout();
         // @formatter:off
         final FileAppender appender = FileAppender.newBuilder()
-            .withFileName(FILE_NAME)
-            .withName("test")
-            .withImmediateFlush(false)
-            .withIgnoreExceptions(false)
+        .withFileName(FILE_NAME).setName("test")
+            .withImmediateFlush(false).setIgnoreExceptions(false)
             .withBufferedIo(false)
-            .withBufferSize(1)
-            .withLayout(layout)
+            .withBufferSize(1).setLayout(layout)
             .withCreateOnDemand(createOnDemand)
             .build();
         // @formatter:on
@@ -233,13 +227,10 @@ public class FileAppenderTest {
         final Layout<String> layout = createPatternLayout();
         // @formatter:off
         final FileAppender appender = FileAppender.newBuilder()
-            .withFileName(FILE_NAME)
-            .withName("test")
-            .withImmediateFlush(false)
-            .withIgnoreExceptions(false)
+        .withFileName(FILE_NAME).setName("test")
+            .withImmediateFlush(false).setIgnoreExceptions(false)
             .withLocking(locking)
-            .withBufferedIo(false)
-            .withLayout(layout)
+            .withBufferedIo(false).setLayout(layout)
             .withCreateOnDemand(createOnDemand)
             .build();
         // @formatter:on

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java
index 1c7b237..5e063ee 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HangingAppender.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
@@ -39,8 +40,9 @@ public class HangingAppender extends AbstractAppender {
     private final long startupDelay;
     private final long shutdownDelay;
 
-    public HangingAppender(final String name, final long delay, final long startupDelay, final long shutdownDelay) {
-        super(name, null, null);
+    public HangingAppender(final String name, final long delay, final long startupDelay, final long shutdownDelay,
+            Property[] properties) {
+        super(name, null, null, true, Property.EMPTY_ARRAY);
         this.delay = delay;
         this.startupDelay = startupDelay;
         this.shutdownDelay = shutdownDelay;
@@ -65,7 +67,7 @@ public class HangingAppender extends AbstractAppender {
             @PluginAttribute("shutdownDelay") final long shutdownDelay,
             @PluginElement("Layout") final Layout<? extends Serializable> layout,
             @PluginElement("Filter") final Filter filter) {
-        return new HangingAppender(name, delay, startupDelay, shutdownDelay);
+        return new HangingAppender(name, delay, startupDelay, shutdownDelay, null);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java
index 25261f9..ad83d5b 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/HttpAppenderTest.java
@@ -29,10 +29,12 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.net.URL;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.layout.JsonLayout;
@@ -162,9 +164,7 @@ public class HttpAppenderTest {
         wireMockRule.stubFor(post(urlEqualTo("/test/log4j/"))
             .willReturn(SUCCESS_RESPONSE));
 
-        final Appender appender = HttpAppender.newBuilder()
-            .withName("Http")
-            .withLayout(JsonLayout.createDefaultLayout())
+        final Appender appender = HttpAppender.newBuilder().setName("Http").setLayout((Layout<? extends Serializable>) JsonLayout.createDefaultLayout())
             .setConfiguration(ctx.getConfiguration())
             .setUrl(new URL("http://localhost:" + wireMockRule.port() + "/test/log4j/"))
             .build();
@@ -181,9 +181,7 @@ public class HttpAppenderTest {
         wireMockRule.stubFor(post(urlEqualTo("/test/log4j/"))
             .willReturn(SUCCESS_RESPONSE));
 
-        final Appender appender = HttpAppender.newBuilder()
-            .withName("Http")
-            .withLayout(JsonLayout.createDefaultLayout())
+        final Appender appender = HttpAppender.newBuilder().setName("Http").setLayout((Layout<? extends Serializable>) JsonLayout.createDefaultLayout())
             .setConfiguration(ctx.getConfiguration())
             .setUrl(new URL("https://localhost:" + wireMockRule.httpsPort() + "/test/log4j/"))
             .setSslConfiguration(SslConfiguration.createSSLConfiguration(null,
@@ -204,9 +202,7 @@ public class HttpAppenderTest {
         wireMockRule.stubFor(put(urlEqualTo("/test/log4j/1234"))
             .willReturn(SUCCESS_RESPONSE));
 
-        final Appender appender = HttpAppender.newBuilder()
-            .withName("Http")
-            .withLayout(JsonLayout.createDefaultLayout())
+        final Appender appender = HttpAppender.newBuilder().setName("Http").setLayout((Layout<? extends Serializable>) JsonLayout.createDefaultLayout())
             .setConfiguration(ctx.getConfiguration())
             .setMethod("PUT")
             .setUrl(new URL("http://localhost:" + wireMockRule.port() + "/test/log4j/1234"))
@@ -224,9 +220,7 @@ public class HttpAppenderTest {
         wireMockRule.stubFor(post(urlEqualTo("/test/log4j/"))
             .willReturn(SUCCESS_RESPONSE));
 
-        final Appender appender = HttpAppender.newBuilder()
-            .withName("Http")
-            .withLayout(JsonLayout.createDefaultLayout())
+        final Appender appender = HttpAppender.newBuilder().setName("Http").setLayout((Layout<? extends Serializable>) JsonLayout.createDefaultLayout())
             .setConfiguration(ctx.getConfiguration())
             .setUrl(new URL("http://localhost:" + wireMockRule.port() + "/test/log4j/"))
             .setHeaders(new Property[] {
@@ -268,9 +262,7 @@ public class HttpAppenderTest {
 
         error = null;
 
-        final Appender appender = HttpAppender.newBuilder()
-            .withName("Http")
-            .withLayout(JsonLayout.createDefaultLayout())
+        final Appender appender = HttpAppender.newBuilder().setName("Http").setLayout((Layout<? extends Serializable>) JsonLayout.createDefaultLayout())
             .setConfiguration(ctx.getConfiguration())
             .setUrl(new URL("http://localhost:" + wireMockRule.port() + "/test/log4j/"))
             .build();
@@ -291,11 +283,8 @@ public class HttpAppenderTest {
         wireMockRule.stubFor(post(urlEqualTo("/test/log4j/"))
             .willReturn(FAILURE_RESPONSE));
 
-        final Appender appender = HttpAppender.newBuilder()
-            .withName("Http")
-            .withLayout(JsonLayout.createDefaultLayout())
-            .setConfiguration(ctx.getConfiguration())
-            .withIgnoreExceptions(false)
+        final Appender appender = HttpAppender.newBuilder().setName("Http").setLayout((Layout<? extends Serializable>) JsonLayout.createDefaultLayout())
+        .setConfiguration(ctx.getConfiguration()).setIgnoreExceptions(false)
             .setUrl(new URL("http://localhost:" + wireMockRule.port() + "/test/log4j/"))
             .build();
         appender.append(createLogEvent());
@@ -303,11 +292,8 @@ public class HttpAppenderTest {
 
     @Test(expected = AppenderLoggingException.class)
     public void testAppendConnectError() throws Exception {
-        final Appender appender = HttpAppender.newBuilder()
-            .withName("Http")
-            .withLayout(JsonLayout.createDefaultLayout())
-            .setConfiguration(ctx.getConfiguration())
-            .withIgnoreExceptions(false)
+        final Appender appender = HttpAppender.newBuilder().setName("Http").setLayout((Layout<? extends Serializable>) JsonLayout.createDefaultLayout())
+        .setConfiguration(ctx.getConfiguration()).setIgnoreExceptions(false)
             .setUrl(new URL("http://localhost:"+(wireMockRule.port()+1)+"/test/log4j/"))
             .build();
         appender.append(createLogEvent());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
index d3ffa38..00af014 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamAppenderTest.java
@@ -93,10 +93,8 @@ public class OutputStreamAppenderTest {
         final Configuration config = ctx.getConfiguration();
         // @formatter:off
         final Appender appender = FileAppender.newBuilder()
-            .withFileName("target/" + getClass().getName() + ".log")
-            .withAppend(false)
-            .withName("File")
-            .withIgnoreExceptions(false)
+        .withFileName("target/" + getClass().getName() + ".log")
+        .withAppend(false).setName("File").setIgnoreExceptions(false)
             .withBufferedIo(false)
             .withBufferSize(4000)
             .setConfiguration(config)

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java
index 8aee640..08b7f20 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SocketAppenderTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.fail;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.ServerSocket;
@@ -41,6 +42,7 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -126,13 +128,11 @@ public class SocketAppenderTest {
             throws Exception {
         // @formatter:off
         final SocketAppender appender = SocketAppender.newBuilder()
-                .withHost("localhost")
-                .withPort(tcpTestServer.getLocalPort())
-                .withReconnectDelayMillis(-1)
-                .withName("test")
+        .withHost("localhost")
+        .withPort(tcpTestServer.getLocalPort())
+        .withReconnectDelayMillis(-1).setName("test")
                 .withImmediateFail(false)
-                .withBufferSize(bufferSize)
-                .withLayout(JsonLayout.newBuilder().setProperties(true).build())
+                .withBufferSize(bufferSize).setLayout((Layout<? extends Serializable>) JsonLayout.newBuilder().setProperties(true).build())
                 .build();
         // @formatter:on
         appender.start();
@@ -175,11 +175,9 @@ public class SocketAppenderTest {
     public void testDefaultProtocol() throws Exception {
         // @formatter:off
         final SocketAppender appender = SocketAppender.newBuilder()
-                .withPort(tcpServer.getLocalPort())
-                .withReconnectDelayMillis(-1)
-                .withName("test")
-                .withImmediateFail(false)
-                .withLayout(JsonLayout.newBuilder().setProperties(true).build())
+        .withPort(tcpServer.getLocalPort())
+        .withReconnectDelayMillis(-1).setName("test")
+                .withImmediateFail(false).setLayout((Layout<? extends Serializable>) JsonLayout.newBuilder().setProperties(true).build())
                 .build();
         // @formatter:on
         assertNotNull(appender);
@@ -196,12 +194,10 @@ public class SocketAppenderTest {
 
         // @formatter:off
         final SocketAppender appender = SocketAppender.newBuilder()
-                .withProtocol(Protocol.UDP)
-                .withPort(tcpServer.getLocalPort())
-                .withReconnectDelayMillis(-1)
-                .withName("test")
-                .withImmediateFail(false)
-                .withLayout(JsonLayout.newBuilder().setProperties(true).build())
+        .withProtocol(Protocol.UDP)
+        .withPort(tcpServer.getLocalPort())
+        .withReconnectDelayMillis(-1).setName("test")
+                .withImmediateFail(false).setLayout((Layout<? extends Serializable>) JsonLayout.newBuilder().setProperties(true).build())
                 .build();
         // @formatter:on
         appender.start();
@@ -222,12 +218,10 @@ public class SocketAppenderTest {
 
         // @formatter:off
         final SocketAppender appender = SocketAppender.newBuilder()
-                .withHost("localhost")
-                .withPort(DYN_PORT)
-                .withReconnectDelayMillis(100)
-                .withName("test")
-                .withImmediateFail(false)
-                .withLayout(JsonLayout.newBuilder().setProperties(true).build())
+        .withHost("localhost")
+        .withPort(DYN_PORT)
+        .withReconnectDelayMillis(100).setName("test")
+                .withImmediateFail(false).setLayout((Layout<? extends Serializable>) JsonLayout.newBuilder().setProperties(true).build())
                 .build();
         // @formatter:on
         appender.start();
@@ -253,13 +247,10 @@ public class SocketAppenderTest {
     public void testTcpAppenderNoWait() throws Exception {
         // @formatter:off
         final SocketAppender appender = SocketAppender.newBuilder()
-                .withHost("localhost")
-                .withPort(ERROR_PORT)
-                .withReconnectDelayMillis(100)
-                .withName("test")
-                .withImmediateFail(false)
-                .withIgnoreExceptions(false)
-                .withLayout(JsonLayout.newBuilder().setProperties(true).build())
+        .withHost("localhost")
+        .withPort(ERROR_PORT)
+        .withReconnectDelayMillis(100).setName("test")
+                .withImmediateFail(false).setIgnoreExceptions(false).setLayout((Layout<? extends Serializable>) JsonLayout.newBuilder().setProperties(true).build())
                 .build();
         // @formatter:on
         appender.start();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderCustomLayoutTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderCustomLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderCustomLayoutTest.java
index 716223e..9888eb4 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderCustomLayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderCustomLayoutTest.java
@@ -17,6 +17,9 @@
 
 package org.apache.logging.log4j.core.appender;
 
+import java.io.Serializable;
+
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.SyslogAppender.Builder;
 import org.apache.logging.log4j.core.layout.SyslogLayout;
 import org.apache.logging.log4j.core.net.Facility;
@@ -31,7 +34,7 @@ public class SyslogAppenderCustomLayoutTest extends SyslogAppenderTest {
     @Override
     protected Builder newSyslogAppenderBuilder(final String protocol, final String format, final boolean newLine) {
         final Builder builder = super.newSyslogAppenderBuilder(protocol, format, newLine);
-        builder.withLayout(SyslogLayout.newBuilder().setFacility(Facility.LOCAL3).setIncludeNewLine(true).build());
+        builder.setLayout((Layout<? extends Serializable>) SyslogLayout.newBuilder().setFacility(Facility.LOCAL3).setIncludeNewLine(true).build());
         return builder;
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
index 741a51f..5d21bf8 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
@@ -116,11 +116,9 @@ public class SyslogAppenderTest extends SyslogAppenderTestBase {
     protected Builder newSyslogAppenderBuilder(final String protocol, final String format, final boolean newLine) {
         // @formatter:off
         return SyslogAppender.newSyslogAppenderBuilder()
-                .withPort(PORTNUM)
-                .withProtocol(EnglishEnums.valueOf(Protocol.class, protocol))
-                .withReconnectDelayMillis(-1)
-                .withName("TestApp")
-                .withIgnoreExceptions(false)
+        .withPort(PORTNUM)
+        .withProtocol(EnglishEnums.valueOf(Protocol.class, protocol))
+        .withReconnectDelayMillis(-1).setName("TestApp").setIgnoreExceptions(false)
                 .setId("Audit")
                 .setEnterpriseNumber(18060)
                 .setMdcId("RequestContext")

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicyTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicyTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicyTest.java
index f6bf296..8bf89e0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicyTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/CronTriggeringPolicyTest.java
@@ -51,8 +51,7 @@ public class CronTriggeringPolicyTest {
 
     private void testBuilder() {
         // @formatter:off
-        final RollingFileAppender raf = RollingFileAppender.newBuilder()
-            .withName("test1")
+        final RollingFileAppender raf = RollingFileAppender.newBuilder().setName("test1")
             .withFileName("target/testcmd1.log")
             .withFilePattern("target/testcmd1.log.%d{yyyy-MM-dd}")
             .withPolicy(createPolicy())
@@ -87,8 +86,7 @@ public class CronTriggeringPolicyTest {
     @Test
     public void testRollingRandomAccessFileAppender() {
         // @formatter:off
-        RollingRandomAccessFileAppender.newBuilder()
-            .withName("test2")
+        RollingRandomAccessFileAppender.newBuilder().setName("test2")
             .withFileName("target/testcmd2.log")
             .withFilePattern("target/testcmd2.log.%d{yyyy-MM-dd}")
             .withPolicy(createPolicy())

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
index 8af78b2..103145c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderAccessTest.java
@@ -40,9 +40,8 @@ public class RollingFileAppenderAccessTest {
             file.deleteOnExit();
             // @formatter:off
             final RollingFileAppender appender = RollingFileAppender.newBuilder()
-                    .withFileName(file.getCanonicalPath())
-                    .withFilePattern("FilePattern")
-                    .withName("Name")
+            .withFileName(file.getCanonicalPath())
+            .withFilePattern("FilePattern").setName("Name")
                     .withPolicy(OnStartupTriggeringPolicy.createPolicy(1))
                     .setConfiguration(config)
                     .build();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderLayoutTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderLayoutTest.java
index 5fe9b68..d934007 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderLayoutTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderLayoutTest.java
@@ -26,8 +26,7 @@ public class RollingFileAppenderLayoutTest {
     @Test
     public void testDefaultLayout() throws Exception {
         // @formatter:off
-        Assert.assertNotNull(RollingFileAppender.newBuilder()
-                .withName(RollingFileAppenderLayoutTest.class.getName())
+        Assert.assertNotNull(RollingFileAppender.newBuilder().setName(RollingFileAppenderLayoutTest.class.getName())
                 .setConfiguration(new DefaultConfiguration())
                 .withFileName("log.txt")
                 .withFilePattern("FilePattern")

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
index eca746b..6c8423f 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
@@ -45,7 +46,7 @@ public class BlockingAppender extends AbstractAppender {
     public CountDownLatch countDownLatch = null;
 
     public BlockingAppender(final String name) {
-        super(name, null, null);
+        super(name, null, null, true, Property.EMPTY_ARRAY);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
index d725043..4a8366d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/CustomConfigurationTest.java
@@ -81,13 +81,10 @@ public class CustomConfigurationTest {
             .build();
         // @formatter:off
         final FileAppender appender = FileAppender.newBuilder()
-            .withFileName(LOG_FILE)
-            .withAppend(false)
-            .withName("File")
-            .withIgnoreExceptions(false)
+        .withFileName(LOG_FILE)
+        .withAppend(false).setName("File").setIgnoreExceptions(false)
             .withBufferSize(4000)
-            .withBufferedIo(false)
-            .withLayout(layout)
+            .withBufferedIo(false).setLayout(layout)
             .build();
         // @formatter:on
         appender.start();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/core/config/JiraLog4j2_2134Test.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/JiraLog4j2_2134Test.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/JiraLog4j2_2134Test.java
index 37508bb..b94a5a9 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/JiraLog4j2_2134Test.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/JiraLog4j2_2134Test.java
@@ -17,10 +17,13 @@
 
 package org.apache.logging.log4j.core.config;
 
+import java.io.Serializable;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.FileAppender;
 import org.apache.logging.log4j.core.layout.PatternLayout;
@@ -43,9 +46,10 @@ public class JiraLog4j2_2134Test {
 				.withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN)
 				.withConfiguration(config)
 				.build();
+        final Layout<? extends Serializable> layout1 = layout;
 		// @formatter:on
-		Appender appender = FileAppender.newBuilder().withFileName("target/test.log").withLayout(layout)
-				.setConfiguration(config).withBufferSize(4000).withName("File").build();
+		Appender appender = FileAppender.newBuilder().withFileName("target/test.log").setLayout(layout1)
+        .setConfiguration(config).withBufferSize(4000).setName("File").build();
 		// appender.start();
 		config.addAppender(appender);
 		AppenderRef ref = AppenderRef.createAppenderRef("File", null, null);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java
index 666fca4..25f2c68 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/AlwaysFailAppender.java
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -32,7 +33,7 @@ import org.apache.logging.log4j.core.config.plugins.validation.constraints.Requi
 public class AlwaysFailAppender extends AbstractAppender {
 
     private AlwaysFailAppender(final String name) {
-        super(name, null, null, false);
+        super(name, null, null, false, Property.EMPTY_ARRAY);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java
index 7c73ed0..59e0509 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/BlockingAppender.java
@@ -21,6 +21,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -34,7 +35,7 @@ public class BlockingAppender extends AbstractAppender {
     public volatile boolean running = true;
 
     private BlockingAppender(final String name) {
-        super(name, null, null, false);
+        super(name, null, null, false, Property.EMPTY_ARRAY);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java
index 700ee8b..588ae57 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/DeadlockAppender.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -38,7 +39,7 @@ public class DeadlockAppender extends AbstractAppender {
     private WorkerThread thread = null;
 
     private DeadlockAppender(final String name) {
-        super(name, null, null, false);
+        super(name, null, null, false, Property.EMPTY_ARRAY);
         thread = new WorkerThread();
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java
index 95157b5..66b003d 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/FailOnceAppender.java
@@ -23,6 +23,7 @@ import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -39,7 +40,7 @@ public class FailOnceAppender extends AbstractAppender {
     private final List<LogEvent> events = new ArrayList<>();
 
     private FailOnceAppender(final String name) {
-        super(name, null, null, false);
+        super(name, null, null, false, Property.EMPTY_ARRAY);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
index 07ac7fe..d61a205 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/InMemoryAppender.java
@@ -23,6 +23,7 @@ import java.io.Serializable;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender;
 import org.apache.logging.log4j.core.appender.OutputStreamManager;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.filter.CompositeFilter;
 
 /**
@@ -32,7 +33,8 @@ public class InMemoryAppender extends AbstractOutputStreamAppender<InMemoryAppen
 
     public InMemoryAppender(final String name, final Layout<? extends Serializable> layout, final CompositeFilter filters,
                             final boolean ignoreExceptions, final boolean writeHeader) {
-        super(name, layout, filters, ignoreExceptions, true, new InMemoryManager(name, layout, writeHeader));
+        super(name, layout, filters, ignoreExceptions, true, Property.EMPTY_ARRAY,
+                new InMemoryManager(name, layout, writeHeader));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
index c5ac234..8f21423 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/ListAppender.java
@@ -30,6 +30,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -94,14 +95,14 @@ public class ListAppender extends AbstractAppender {
     public CountDownLatch countDownLatch = null;
 
     public ListAppender(final String name) {
-        super(name, null, null);
+        super(name, null, null, true, Property.EMPTY_ARRAY);
         newLine = false;
         raw = false;
     }
 
     public ListAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout, final boolean newline,
                         final boolean raw) {
-        super(name, filter, layout);
+        super(name, filter, layout, true, Property.EMPTY_ARRAY);
         this.newLine = newline;
         this.raw = raw;
         if (layout != null && !(layout instanceof SerializedLayout)) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java
index 5c80cb4..ff43419 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/appender/UsesLoggingAppender.java
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
@@ -38,7 +39,7 @@ public final class UsesLoggingAppender extends AbstractAppender {
     private final SomethingThatUsesLogging thing;
 
     private UsesLoggingAppender(final String name, final Filter filter, final Layout<?> layout, final boolean ignoreExceptions) {
-        super(name, filter, layout, ignoreExceptions);
+        super(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
         thing = new SomethingThatUsesLogging();
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/test/resources/log4j-test2.xml
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/resources/log4j-test2.xml b/log4j-core/src/test/resources/log4j-test2.xml
index 65c6827..afb9266 100644
--- a/log4j-core/src/test/resources/log4j-test2.xml
+++ b/log4j-core/src/test/resources/log4j-test2.xml
@@ -65,7 +65,7 @@
     </Logger>
 
     <Logger name="org.apache.logging.log4j.hosttest" level="debug" additivity="false">
-      <!-- User appender-ref alias to prove it works -->
+      <!-- Use appender-ref alias to prove it works -->
       <appender-ref ref="HostTest"/>
     </Logger>
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
----------------------------------------------------------------------
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
index 4524a26..d4c5219 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeAppender.java
@@ -73,10 +73,10 @@ public final class FlumeAppender extends AbstractAppender implements FlumeEventF
     }
 
     private FlumeAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
-                          final boolean ignoreExceptions, final String includes, final String excludes,
-                          final String required, final String mdcPrefix, final String eventPrefix,
-                          final boolean compress, final FlumeEventFactory factory, final AbstractFlumeManager manager) {
-        super(name, filter, layout, ignoreExceptions);
+            final boolean ignoreExceptions, final String includes, final String excludes, final String required,
+            final String mdcPrefix, final String eventPrefix, final boolean compress, final FlumeEventFactory factory,
+            final AbstractFlumeManager manager, Property[] properties) {
+        super(name, filter, layout, ignoreExceptions, properties);
         this.manager = manager;
         this.mdcIncludes = includes;
         this.mdcExcludes = excludes;
@@ -264,7 +264,7 @@ public final class FlumeAppender extends AbstractAppender implements FlumeEventF
         }
 
         return new FlumeAppender(name, filter, layout,  ignoreExceptions, includes,
-            excludes, required, mdcPrefix, eventPrefix, compress, factory, manager);
+            excludes, required, mdcPrefix, eventPrefix, compress, factory, manager, null);
     }
 
     private static Agent[] getAgents(Agent[] agents, final String hosts) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java
----------------------------------------------------------------------
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java
index aee94e8..d0a574a 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/core/appender/db/jpa/JpaAppender.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
@@ -45,8 +46,8 @@ public final class JpaAppender extends AbstractDatabaseAppender<JpaDatabaseManag
     private final String description;
 
     private JpaAppender(final String name, final Filter filter, final boolean ignoreExceptions,
-            final JpaDatabaseManager manager) {
-        super(name, filter, ignoreExceptions, manager);
+            final Property[] properties, final JpaDatabaseManager manager) {
+        super(name, filter, null, ignoreExceptions, properties, manager);
         this.description = this.getName() + "{ manager=" + this.getManager() + " }";
     }
 
@@ -110,7 +111,7 @@ public final class JpaAppender extends AbstractDatabaseAppender<JpaDatabaseManag
                 return null;
             }
 
-            return new JpaAppender(name, filter, ignoreExceptions, manager);
+            return new JpaAppender(name, filter, ignoreExceptions, null, manager);
         } catch (final ClassNotFoundException e) {
             LOGGER.error("Could not load entity class [{}].", entityClassName, e);
             return null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/LoggerConfigBenchmark.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/LoggerConfigBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/LoggerConfigBenchmark.java
index bf64b19..0d36c21 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/LoggerConfigBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/LoggerConfigBenchmark.java
@@ -29,6 +29,7 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.config.AppenderControl;
 import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.openjdk.jmh.annotations.Benchmark;
@@ -68,7 +69,7 @@ public class LoggerConfigBenchmark {
         private final AtomicInteger count = new AtomicInteger();
 
         protected SimpleListAppender() {
-            super("list", null, null);
+            super("list", null, null, true, Property.EMPTY_ARRAY);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/DemoAppender.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/DemoAppender.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/DemoAppender.java
index a4ff97f..f59889d 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/DemoAppender.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/DemoAppender.java
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.layout.ByteBufferDestination;
 import org.apache.logging.log4j.core.layout.ByteBufferDestinationHelper;
 
@@ -33,7 +34,7 @@ public class DemoAppender extends AbstractAppender implements ByteBufferDestinat
     public long checksum;
 
     public DemoAppender(final Layout<?> layout) {
-        super("demo", null, layout);
+        super("demo", null, layout, true, Property.EMPTY_ARRAY);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/DemoAppender.java
----------------------------------------------------------------------
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/DemoAppender.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/DemoAppender.java
index 3a6da07..aa2df05 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/DemoAppender.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/util/DemoAppender.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.perf.util;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.layout.ByteBufferDestination;
 import org.apache.logging.log4j.core.layout.ByteBufferDestinationHelper;
 import org.apache.logging.log4j.core.util.Constants;
@@ -34,7 +35,7 @@ public class DemoAppender extends AbstractAppender implements ByteBufferDestinat
     public long checksum;
 
     public DemoAppender(final Layout<?> layout) {
-        super("demo", null, layout);
+        super("demo", null, layout, true, Property.EMPTY_ARRAY);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
----------------------------------------------------------------------
diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
index 6dace71..ddbc799 100644
--- a/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
+++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/appender/ServletAppender.java
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -92,7 +93,7 @@ public class ServletAppender extends AbstractAppender {
     
     private ServletAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
             final ServletContext servletContext, final boolean ignoreExceptions, final boolean logThrowables) {
-        super(name, filter, layout, ignoreExceptions);
+        super(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
         this.servletContext = servletContext;
         this.logThrowables = logThrowables;
     }
@@ -121,10 +122,7 @@ public class ServletAppender extends AbstractAppender {
     public static ServletAppender createAppender(final Layout<? extends Serializable> layout, final Filter filter,
             final String name, final boolean ignoreExceptions) {
         // @formatter:off
-    	return newBuilder().setFilter(filter)
-    			.withIgnoreExceptions(ignoreExceptions)
-    			.withLayout(layout)
-    			.withName(name)
+    	return newBuilder().setFilter(filter).setIgnoreExceptions(ignoreExceptions).setLayout(layout).setName(name)
     			.build();
     	// @formatter:on
     }


[2/2] logging-log4j2 git commit: [LOG4J2-2491] Allow all Appenders to optionally carry a Property array.

Posted by gg...@apache.org.
[LOG4J2-2491] Allow all Appenders to optionally carry a Property array.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/61b77dfb
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/61b77dfb
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/61b77dfb

Branch: refs/heads/release-2.x
Commit: 61b77dfb6ec5f69117f7892ccb940e34b5223954
Parents: d39546d
Author: Gary Gregory <ga...@gmail.com>
Authored: Mon Oct 29 20:16:41 2018 -0600
Committer: Gary Gregory <ga...@gmail.com>
Committed: Mon Oct 29 20:16:41 2018 -0600

----------------------------------------------------------------------
 .../test/java/org/apache/log4j/LoggerTest.java  |   3 +-
 .../log4j/cassandra/CassandraAppender.java      |   7 +-
 .../log4j/core/appender/AbstractAppender.java   | 114 +++++---
 .../core/appender/AbstractFileAppender.java     |   5 +-
 .../appender/AbstractOutputStreamAppender.java  |  22 +-
 .../core/appender/AbstractWriterAppender.java   | 274 ++++++++++---------
 .../log4j/core/appender/AsyncAppender.java      |  14 +-
 .../log4j/core/appender/ConsoleAppender.java    |  14 +-
 .../core/appender/CountingNoOpAppender.java     |   9 +-
 .../log4j/core/appender/FailoverAppender.java   |   9 +-
 .../log4j/core/appender/FileAppender.java       |  17 +-
 .../log4j/core/appender/HttpAppender.java       |  12 +-
 .../core/appender/MemoryMappedFileAppender.java |  15 +-
 .../log4j/core/appender/NullAppender.java       |   4 +-
 .../core/appender/OutputStreamAppender.java     |  50 ++--
 .../core/appender/RandomAccessFileAppender.java |  15 +-
 .../core/appender/RollingFileAppender.java      |  18 +-
 .../RollingRandomAccessFileAppender.java        |  21 +-
 .../core/appender/ScriptAppenderSelector.java   |   6 +-
 .../log4j/core/appender/SmtpAppender.java       |   9 +-
 .../log4j/core/appender/SocketAppender.java     |  25 +-
 .../log4j/core/appender/SyslogAppender.java     |  25 +-
 .../log4j/core/appender/WriterAppender.java     |  54 ++--
 .../appender/db/AbstractDatabaseAppender.java   |  26 +-
 .../core/appender/db/jdbc/JdbcAppender.java     |  12 +-
 .../log4j/core/appender/mom/JmsAppender.java    |  70 ++---
 .../appender/mom/jeromq/JeroMqAppender.java     |   6 +-
 .../core/appender/mom/kafka/KafkaAppender.java  |  14 +-
 .../core/appender/nosql/NoSqlAppender.java      |   9 +-
 .../core/appender/rewrite/RewriteAppender.java  |   7 +-
 .../core/appender/routing/RoutingAppender.java  |   9 +-
 .../core/config/AbstractConfiguration.java      |   8 +-
 .../logging/log4j/core/config/Property.java     |   5 +
 .../log4j/core/filter/AbstractFilterable.java   |  32 ++-
 .../appender/ConsoleAppenderBuilderTest.java    |   4 +-
 .../core/appender/ConsoleAppenderTest.java      |   6 +-
 .../appender/FileAppenderPermissionsTest.java   |  18 +-
 .../log4j/core/appender/FileAppenderTest.java   |  27 +-
 .../log4j/core/appender/HangingAppender.java    |   8 +-
 .../log4j/core/appender/HttpAppenderTest.java   |  36 +--
 .../core/appender/OutputStreamAppenderTest.java |   6 +-
 .../log4j/core/appender/SocketAppenderTest.java |  51 ++--
 .../SyslogAppenderCustomLayoutTest.java         |   5 +-
 .../log4j/core/appender/SyslogAppenderTest.java |   8 +-
 .../rolling/CronTriggeringPolicyTest.java       |   6 +-
 .../rolling/RollingFileAppenderAccessTest.java  |   5 +-
 .../rolling/RollingFileAppenderLayoutTest.java  |   3 +-
 .../log4j/core/async/BlockingAppender.java      |   3 +-
 .../core/config/CustomConfigurationTest.java    |   9 +-
 .../log4j/core/config/JiraLog4j2_2134Test.java  |   8 +-
 .../log4j/test/appender/AlwaysFailAppender.java |   3 +-
 .../log4j/test/appender/BlockingAppender.java   |   3 +-
 .../log4j/test/appender/DeadlockAppender.java   |   3 +-
 .../log4j/test/appender/FailOnceAppender.java   |   3 +-
 .../log4j/test/appender/InMemoryAppender.java   |   4 +-
 .../log4j/test/appender/ListAppender.java       |   5 +-
 .../test/appender/UsesLoggingAppender.java      |   3 +-
 log4j-core/src/test/resources/log4j-test2.xml   |   2 +-
 .../log4j/flume/appender/FlumeAppender.java     |  10 +-
 .../log4j/core/appender/db/jpa/JpaAppender.java |   7 +-
 .../log4j/perf/jmh/LoggerConfigBenchmark.java   |   3 +-
 .../logging/log4j/perf/nogc/DemoAppender.java   |   3 +-
 .../logging/log4j/perf/util/DemoAppender.java   |   3 +-
 .../log4j/web/appender/ServletAppender.java     |   8 +-
 64 files changed, 645 insertions(+), 558 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
----------------------------------------------------------------------
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
index d21fa62..48b073d 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.test.appender.ListAppender;
 import org.junit.After;
@@ -507,7 +508,7 @@ public class LoggerTest {
         int counter;
 
         CountingAppender() {
-            super("Counter", null, null);
+            super("Counter", null, null, true, Property.EMPTY_ARRAY);
             counter = 0;
         }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
----------------------------------------------------------------------
diff --git a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
index 7a9ade9..7d2bf10 100644
--- a/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
+++ b/log4j-cassandra/src/main/java/org/apache/logging/log4j/cassandra/CassandraAppender.java
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.db.AbstractDatabaseAppender;
 import org.apache.logging.log4j.core.appender.db.ColumnMapping;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -40,8 +41,8 @@ import org.apache.logging.log4j.core.util.Clock;
 public class CassandraAppender extends AbstractDatabaseAppender<CassandraManager> {
 
     private CassandraAppender(final String name, final Filter filter, final boolean ignoreExceptions,
-                              final CassandraManager manager) {
-        super(name, filter, ignoreExceptions, manager);
+                              final Property[] properties, final CassandraManager manager) {
+        super(name, filter, null, ignoreExceptions, properties, manager);
     }
 
     @PluginBuilderFactory
@@ -177,7 +178,7 @@ public class CassandraAppender extends AbstractDatabaseAppender<CassandraManager
             final CassandraManager manager = CassandraManager.getManager(getName(), contactPoints, columns, useTls,
                 clusterName, keyspace, table, username, password, useClockForTimestampGenerator, bufferSize, batched,
                 batchType);
-            return new CassandraAppender(getName(), getFilter(), isIgnoreExceptions(), manager);
+            return new CassandraAppender(getName(), getFilter(), isIgnoreExceptions(), null, manager);
         }
 
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
index c97f70c..77e547e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractAppender.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
@@ -60,47 +61,56 @@ public abstract class AbstractAppender extends AbstractFilterable implements App
         @PluginConfiguration
         private Configuration configuration;
 
+        public Configuration getConfiguration() {
+            return configuration;
+        }
+
+        public Layout<? extends Serializable> getLayout() {
+            return layout;
+        }
+
         public String getName() {
             return name;
         }
 
-        public boolean isIgnoreExceptions() {
-            return ignoreExceptions;
+        public Layout<? extends Serializable> getOrCreateLayout() {
+            if (layout == null) {
+                return PatternLayout.createDefaultLayout();
+            }
+            return layout;
         }
 
-        public Layout<? extends Serializable> getLayout() {
+        public Layout<? extends Serializable> getOrCreateLayout(final Charset charset) {
+            if (layout == null) {
+                return PatternLayout.newBuilder().withCharset(charset).build();
+            }
             return layout;
         }
 
-        public B withName(final String name) {
-            this.name = name;
+        public boolean isIgnoreExceptions() {
+            return ignoreExceptions;
+        }
+
+        public B setConfiguration(final Configuration configuration) {
+            this.configuration = configuration;
             return asBuilder();
         }
 
-        public B withIgnoreExceptions(final boolean ignoreExceptions) {
+        public B setIgnoreExceptions(final boolean ignoreExceptions) {
             this.ignoreExceptions = ignoreExceptions;
             return asBuilder();
         }
 
-        public B withLayout(final Layout<? extends Serializable> layout) {
+        public B setLayout(final Layout<? extends Serializable> layout) {
             this.layout = layout;
             return asBuilder();
         }
 
-        public Layout<? extends Serializable> getOrCreateLayout() {
-            if (layout == null) {
-                return PatternLayout.createDefaultLayout();
-            }
-            return layout;
+        public B setName(final String name) {
+            this.name = name;
+            return asBuilder();
         }
         
-        public Layout<? extends Serializable> getOrCreateLayout(final Charset charset) {
-            if (layout == null) {
-                return PatternLayout.newBuilder().withCharset(charset).build();
-            }
-            return layout;
-        }
-
         /**
          * @deprecated Use {@link #setConfiguration(Configuration)}
          */
@@ -110,20 +120,44 @@ public abstract class AbstractAppender extends AbstractFilterable implements App
             return asBuilder();
         }
 
-        public B setConfiguration(final Configuration configuration) {
-            this.configuration = configuration;
-            return asBuilder();
+        /**
+         * @deprecated use {@link #setIgnoreExceptions(boolean)}.
+         */
+        @Deprecated
+        public B withIgnoreExceptions(final boolean ignoreExceptions) {
+            return setIgnoreExceptions(ignoreExceptions);
         }
 
-        public Configuration getConfiguration() {
-            return configuration;
+        /**
+         * @deprecated use {@link #setLayout(Layout)}.
+         */
+        @Deprecated
+        public B withLayout(final Layout<? extends Serializable> layout) {
+            return setLayout(layout);
+        }
+
+        /**
+         * @deprecated use {@link #setName(String)}.
+         */
+        @Deprecated
+        public B withName(final String name) {
+            return setName(name);
         }
         
     }
     
+    public static int parseInt(final String s, final int defaultValue) {
+        try {
+            return Integers.parseInt(s, defaultValue);
+        } catch (final NumberFormatException e) {
+            LOGGER.error("Could not parse \"{}\" as an integer,  using default value {}: {}", s, defaultValue, e);
+            return defaultValue;
+        }
+    }
     private final String name;
     private final boolean ignoreExceptions;
     private final Layout<? extends Serializable> layout;
+
     private ErrorHandler handler = new DefaultErrorHandler(this);
 
     /**
@@ -132,9 +166,11 @@ public abstract class AbstractAppender extends AbstractFilterable implements App
      * @param name The Appender name.
      * @param filter The Filter to associate with the Appender.
      * @param layout The layout to use to format the event.
+     * @deprecated Use {@link #AbstractAppender(String, Filter, Layout, boolean, Property[])}.
      */
+    @Deprecated
     protected AbstractAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout) {
-        this(name, filter, layout, true);
+        this(name, filter, layout, true, Property.EMPTY_ARRAY);
     }
 
     /**
@@ -145,24 +181,32 @@ public abstract class AbstractAppender extends AbstractFilterable implements App
      * @param layout The layout to use to format the event.
      * @param ignoreExceptions If true, exceptions will be logged and suppressed. If false errors will be logged and
      *            then passed to the application.
+     * @deprecated Use {@link #AbstractAppender(String, Filter, Layout, boolean, Property[])}
      */
+    @Deprecated
     protected AbstractAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
             final boolean ignoreExceptions) {
-        super(filter);
+        this(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
+    }
+
+    /**
+     * Constructor.
+     * 
+     * @param name The Appender name.
+     * @param filter The Filter to associate with the Appender.
+     * @param layout The layout to use to format the event.
+     * @param ignoreExceptions If true, exceptions will be logged and suppressed. If false errors will be logged and
+     *            then passed to the application.
+     * @since 2.11.2
+     */
+    protected AbstractAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
+            final boolean ignoreExceptions, final Property[] properties) {
+        super(filter, properties);
         this.name = Objects.requireNonNull(name, "name");
         this.layout = layout;
         this.ignoreExceptions = ignoreExceptions;
     }
 
-    public static int parseInt(final String s, final int defaultValue) {
-        try {
-            return Integers.parseInt(s, defaultValue);
-        } catch (final NumberFormatException e) {
-            LOGGER.error("Could not parse \"{}\" as an integer,  using default value {}: {}", s, defaultValue, e);
-            return defaultValue;
-        }
-    }
-
     /**
      * Handle an error with a message using the {@link ErrorHandler} configured for this Appender.
      * 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java
index 09127c3..7537d99 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractFileAppender.java
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.core.net.Advertiser;
@@ -159,9 +160,9 @@ public abstract class AbstractFileAppender<M extends OutputStreamManager> extend
 
     private AbstractFileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
             final M manager, final String filename, final boolean ignoreExceptions,
-            final boolean immediateFlush, final Advertiser advertiser) {
+            final boolean immediateFlush, final Advertiser advertiser, final Property[] properties) {
 
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+        super(name, layout, filter, ignoreExceptions, immediateFlush, properties, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
             configuration.putAll(manager.getContentFormat());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
index f0f0a41..d6acc08 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
@@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.util.Constants;
 
@@ -94,10 +95,29 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
      * @param name The name of the Appender.
      * @param layout The layout to format the message.
      * @param manager The OutputStreamManager.
+     * @deprecated Use {@link #AbstractOutputStreamAppender(String, Layout, Filter, boolean, boolean, Property[], OutputStreamManager)}
      */
+    @Deprecated
     protected AbstractOutputStreamAppender(final String name, final Layout<? extends Serializable> layout,
             final Filter filter, final boolean ignoreExceptions, final boolean immediateFlush, final M manager) {
-        super(name, filter, layout, ignoreExceptions);
+        super(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
+        this.manager = manager;
+        this.immediateFlush = immediateFlush;
+    }
+
+    /**
+     * Instantiates a WriterAppender and set the output destination to a new {@link java.io.OutputStreamWriter}
+     * initialized with <code>os</code> as its {@link java.io.OutputStream}.
+     *
+     * @param name The name of the Appender.
+     * @param layout The layout to format the message.
+     * @param properties optional properties
+     * @param manager The OutputStreamManager.
+     */
+    protected AbstractOutputStreamAppender(final String name, final Layout<? extends Serializable> layout,
+            final Filter filter, final boolean ignoreExceptions, final boolean immediateFlush,
+            final Property[] properties, final M manager) {
+        super(name, filter, layout, ignoreExceptions, properties);
         this.manager = manager;
         this.immediateFlush = immediateFlush;
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java
index 81c1391..f94ef59 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractWriterAppender.java
@@ -1,126 +1,148 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
-package org.apache.logging.log4j.core.appender;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import org.apache.logging.log4j.core.Filter;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.StringLayout;
-
-/**
- * Appends log events as strings to a writer.
- * 
- * @param <M>
- *            The kind of {@link WriterManager} under management
- */
-public abstract class AbstractWriterAppender<M extends WriterManager> extends AbstractAppender {
-
-    /**
-     * Immediate flush means that the underlying writer will be flushed at the
-     * end of each append operation. Immediate flush is slower but ensures that
-     * each append request is actually written. If <code>immediateFlush</code>
-     * is set to {@code false}, then there is a good chance that the last few
-     * logs events are not actually written to persistent media if and when the
-     * application crashes.
-     */
-    protected final boolean immediateFlush;
-    private final M manager;
-    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
-    private final Lock readLock = readWriteLock.readLock();
-
-    /**
-     * Instantiates.
-     * 
-     * @param name
-     *            The name of the Appender.
-     * @param layout
-     *            The layout to format the message.
-     * @param manager
-     *            The OutputStreamManager.
-     */
-    protected AbstractWriterAppender(final String name, final StringLayout layout, final Filter filter,
-            final boolean ignoreExceptions, final boolean immediateFlush, final M manager) {
-        super(name, filter, layout, ignoreExceptions);
-        this.manager = manager;
-        this.immediateFlush = immediateFlush;
-    }
-
-    /**
-     * Actual writing occurs here.
-     * <p>
-     * Most subclasses will need to override this method.
-     * </p>
-     * 
-     * @param event
-     *            The LogEvent.
-     */
-    @Override
-    public void append(final LogEvent event) {
-        readLock.lock();
-        try {
-            final String str = getStringLayout().toSerializable(event);
-            if (str.length() > 0) {
-                manager.write(str);
-                if (this.immediateFlush || event.isEndOfBatch()) {
-                    manager.flush();
-                }
-            }
-        } catch (final AppenderLoggingException ex) {
-            error("Unable to write " + manager.getName() + " for appender " + getName(), event, ex);
-            throw ex;
-        } finally {
-            readLock.unlock();
-        }
-    }
-
-    /**
-     * Gets the manager.
-     * 
-     * @return the manager.
-     */
-    public M getManager() {
-        return manager;
-    }
-
-    public StringLayout getStringLayout() {
-        return (StringLayout) getLayout();
-    }
-
-    @Override
-    public void start() {
-        if (getLayout() == null) {
-            LOGGER.error("No layout set for the appender named [{}].", getName());
-        }
-        if (manager == null) {
-            LOGGER.error("No OutputStreamManager set for the appender named [{}].", getName());
-        }
-        super.start();
-    }
-
-    @Override
-    public boolean stop(final long timeout, final TimeUnit timeUnit) {
-        setStopping();
-        boolean stopped = super.stop(timeout, timeUnit, false);
-        stopped &= manager.stop(timeout, timeUnit);
-        setStopped();
-        return stopped;
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.core.appender;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.StringLayout;
+import org.apache.logging.log4j.core.config.Property;
+
+/**
+ * Appends log events as strings to a writer.
+ * 
+ * @param <M>
+ *            The kind of {@link WriterManager} under management
+ */
+public abstract class AbstractWriterAppender<M extends WriterManager> extends AbstractAppender {
+
+    /**
+     * Immediate flush means that the underlying writer will be flushed at the
+     * end of each append operation. Immediate flush is slower but ensures that
+     * each append request is actually written. If <code>immediateFlush</code>
+     * is set to {@code false}, then there is a good chance that the last few
+     * logs events are not actually written to persistent media if and when the
+     * application crashes.
+     */
+    protected final boolean immediateFlush;
+    private final M manager;
+    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
+    private final Lock readLock = readWriteLock.readLock();
+
+    /**
+     * Instantiates.
+     * 
+     * @param name
+     *            The name of the Appender.
+     * @param layout
+     *            The layout to format the message.
+     * @param properties 
+     *            Optional properties.
+     * @param manager
+     *            The OutputStreamManager.
+     */
+    protected AbstractWriterAppender(final String name, final StringLayout layout, final Filter filter,
+            final boolean ignoreExceptions, final boolean immediateFlush, Property[] properties, final M manager) {
+        super(name, filter, layout, ignoreExceptions, properties);
+        this.manager = manager;
+        this.immediateFlush = immediateFlush;
+    }
+
+    /**
+     * Instantiates.
+     * 
+     * @param name
+     *            The name of the Appender.
+     * @param layout
+     *            The layout to format the message.
+     * @param manager
+     *            The OutputStreamManager.
+     * @deprecated Use {@link #AbstractWriterAppender(String, StringLayout, Filter, boolean, boolean, Property[], WriterManager)}.
+     */
+    @Deprecated
+    protected AbstractWriterAppender(final String name, final StringLayout layout, final Filter filter,
+            final boolean ignoreExceptions, final boolean immediateFlush, final M manager) {
+        super(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
+        this.manager = manager;
+        this.immediateFlush = immediateFlush;
+    }
+
+    /**
+     * Actual writing occurs here.
+     * <p>
+     * Most subclasses will need to override this method.
+     * </p>
+     * 
+     * @param event
+     *            The LogEvent.
+     */
+    @Override
+    public void append(final LogEvent event) {
+        readLock.lock();
+        try {
+            final String str = getStringLayout().toSerializable(event);
+            if (str.length() > 0) {
+                manager.write(str);
+                if (this.immediateFlush || event.isEndOfBatch()) {
+                    manager.flush();
+                }
+            }
+        } catch (final AppenderLoggingException ex) {
+            error("Unable to write " + manager.getName() + " for appender " + getName(), event, ex);
+            throw ex;
+        } finally {
+            readLock.unlock();
+        }
+    }
+
+    /**
+     * Gets the manager.
+     * 
+     * @return the manager.
+     */
+    public M getManager() {
+        return manager;
+    }
+
+    public StringLayout getStringLayout() {
+        return (StringLayout) getLayout();
+    }
+
+    @Override
+    public void start() {
+        if (getLayout() == null) {
+            LOGGER.error("No layout set for the appender named [{}].", getName());
+        }
+        if (manager == null) {
+            LOGGER.error("No OutputStreamManager set for the appender named [{}].", getName());
+        }
+        super.start();
+    }
+
+    @Override
+    public boolean stop(final long timeout, final TimeUnit timeUnit) {
+        setStopping();
+        boolean stopped = super.stop(timeout, timeUnit, false);
+        stopped &= manager.stop(timeout, timeUnit);
+        setStopped();
+        return stopped;
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
index b0ed1d9..bf8a163 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
@@ -41,6 +41,7 @@ import org.apache.logging.log4j.core.config.AppenderControl;
 import org.apache.logging.log4j.core.config.AppenderRef;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationException;
+import org.apache.logging.log4j.core.config.Property;
 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.PluginBuilderAttribute;
@@ -62,6 +63,7 @@ public final class AsyncAppender extends AbstractAppender {
 
     private static final int DEFAULT_QUEUE_SIZE = 1024;
     private static final LogEvent SHUTDOWN_LOG_EVENT = new AbstractLogEvent() {
+        private static final long serialVersionUID = -1761035149477086330L;
     };
 
     private static final AtomicLong THREAD_SEQUENCE = new AtomicLong(1);
@@ -79,10 +81,10 @@ public final class AsyncAppender extends AbstractAppender {
     private AsyncQueueFullPolicy asyncQueueFullPolicy;
 
     private AsyncAppender(final String name, final Filter filter, final AppenderRef[] appenderRefs,
-                          final String errorRef, final int queueSize, final boolean blocking,
-                          final boolean ignoreExceptions, final long shutdownTimeout, final Configuration config,
-                          final boolean includeLocation, final BlockingQueueFactory<LogEvent> blockingQueueFactory) {
-        super(name, filter, null, ignoreExceptions);
+            final String errorRef, final int queueSize, final boolean blocking, final boolean ignoreExceptions,
+            final long shutdownTimeout, final Configuration config, final boolean includeLocation,
+            final BlockingQueueFactory<LogEvent> blockingQueueFactory, final Property[] properties) {
+        super(name, filter, null, ignoreExceptions, properties);
         this.queue = blockingQueueFactory.create(queueSize);
         this.queueSize = queueSize;
         this.blocking = blocking;
@@ -270,7 +272,7 @@ public final class AsyncAppender extends AbstractAppender {
         }
 
         return new AsyncAppender(name, filter, appenderRefs, errorRef, size, blocking, ignoreExceptions,
-            shutdownTimeout, config, includeLocation, new ArrayBlockingQueueFactory<LogEvent>());
+            shutdownTimeout, config, includeLocation, new ArrayBlockingQueueFactory<LogEvent>(), null);
     }
 
     @PluginBuilderFactory
@@ -374,7 +376,7 @@ public final class AsyncAppender extends AbstractAppender {
         @Override
         public AsyncAppender build() {
             return new AsyncAppender(name, filter, appenderRefs, errorRef, bufferSize, blocking, ignoreExceptions,
-                shutdownTimeout, configuration, includeLocation, blockingQueueFactory);
+                shutdownTimeout, configuration, includeLocation, blockingQueueFactory, null);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 8e3b453..7a9864f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -90,8 +91,9 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
     }
 
     private ConsoleAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
-            final OutputStreamManager manager, final boolean ignoreExceptions, final Target target) {
-        super(name, layout, filter, ignoreExceptions, true, manager);
+            final OutputStreamManager manager, final boolean ignoreExceptions, final Target target,
+            Property[] properties) {
+        super(name, layout, filter, ignoreExceptions, true, properties, manager);
         this.target = target;
     }
 
@@ -125,7 +127,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
         final boolean isFollow = Boolean.parseBoolean(follow);
         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
         final Target target = targetStr == null ? DEFAULT_TARGET : Target.valueOf(targetStr);
-        return new ConsoleAppender(name, layout, filter, getManager(target, isFollow, false, layout), ignoreExceptions, target);
+        return new ConsoleAppender(name, layout, filter, getManager(target, isFollow, false, layout), ignoreExceptions, target, null);
     }
 
     /**
@@ -166,13 +168,13 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
             LOGGER.error("Cannot use both follow and direct on ConsoleAppender");
             return null;
         }
-        return new ConsoleAppender(name, layout, filter, getManager(target, follow, direct, layout), ignoreExceptions, target);
+        return new ConsoleAppender(name, layout, filter, getManager(target, follow, direct, layout), ignoreExceptions, target, null);
     }
 
     public static ConsoleAppender createDefaultAppenderForLayout(final Layout<? extends Serializable> layout) {
         // this method cannot use the builder class without introducing an infinite loop due to DefaultConfiguration
         return new ConsoleAppender("DefaultConsole-" + COUNT.incrementAndGet(), layout, null,
-                getDefaultManager(DEFAULT_TARGET, false, false, layout), true, DEFAULT_TARGET);
+                getDefaultManager(DEFAULT_TARGET, false, false, layout), true, DEFAULT_TARGET, null);
     }
 
     @PluginBuilderFactory
@@ -219,7 +221,7 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
             }
             final Layout<? extends Serializable> layout = getOrCreateLayout(target.getDefaultCharset());
             return new ConsoleAppender(getName(), layout, getFilter(), getManager(target, follow, direct, layout),
-                    isIgnoreExceptions(), target);
+                    isIgnoreExceptions(), target, getPropertyArray());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
index 0e3ac47..4c4c68e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/CountingNoOpAppender.java
@@ -23,6 +23,7 @@ import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -36,7 +37,11 @@ public class CountingNoOpAppender extends AbstractAppender  {
     private final AtomicLong total = new AtomicLong();
 
     public CountingNoOpAppender(final String name, final Layout<?> layout) {
-        super(name, null, layout);
+        super(name, null, layout, true, Property.EMPTY_ARRAY);
+    }
+
+    private CountingNoOpAppender(final String name, final Layout<?> layout, final Property[] properties) {
+        super(name, null, layout, true, properties);
     }
 
     public long getCount() {
@@ -53,6 +58,6 @@ public class CountingNoOpAppender extends AbstractAppender  {
      */
     @PluginFactory
     public static CountingNoOpAppender createAppender(@PluginAttribute("name") final String name) {
-        return new CountingNoOpAppender(Objects.requireNonNull(name), null);
+        return new CountingNoOpAppender(Objects.requireNonNull(name), null, Property.EMPTY_ARRAY);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
index 659caf1..3032e30 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FailoverAppender.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.AppenderControl;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 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.PluginAttribute;
@@ -62,15 +63,15 @@ public final class FailoverAppender extends AbstractAppender {
     private volatile long nextCheckNanos = 0;
 
     private FailoverAppender(final String name, final Filter filter, final String primary, final String[] failovers,
-                             final int intervalMillis, final Configuration config, final boolean ignoreExceptions) {
-        super(name, filter, null, ignoreExceptions);
+            final int intervalMillis, final Configuration config, final boolean ignoreExceptions,
+            Property[] properties) {
+        super(name, filter, null, ignoreExceptions, properties);
         this.primaryRef = primary;
         this.failovers = failovers;
         this.config = config;
         this.intervalNanos = TimeUnit.MILLISECONDS.toNanos(intervalMillis);
     }
 
-
     @Override
     public void start() {
         final Map<String, Appender> map = config.getAppenders();
@@ -213,6 +214,6 @@ public final class FailoverAppender extends AbstractAppender {
 
         final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true);
 
-        return new FailoverAppender(name, filter, primary, failovers, retryIntervalMillis, config, ignoreExceptions);
+        return new FailoverAppender(name, filter, primary, failovers, retryIntervalMillis, config, ignoreExceptions, null);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
index 034fb15..7dd239b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -99,7 +100,8 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             }
 
             return new FileAppender(getName(), layout, getFilter(), manager, fileName, isIgnoreExceptions(),
-                    !bufferedIo || isImmediateFlush(), advertise ? getConfiguration().getAdvertiser() : null);
+                    !bufferedIo || isImmediateFlush(), advertise ? getConfiguration().getAdvertiser() : null,
+                    getPropertyArray());
         }
 
         public String getAdvertiseUri() {
@@ -232,12 +234,9 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
         .withBufferedIo(Booleans.parseBoolean(bufferedIo, true))
         .withBufferSize(Integers.parseInt(bufferSizeStr, DEFAULT_BUFFER_SIZE))
         .setConfiguration(config)
-        .withFileName(fileName).setFilter(filter)
-            .withIgnoreExceptions(Booleans.parseBoolean(ignoreExceptions, true))
-            .withImmediateFlush(Booleans.parseBoolean(immediateFlush, true))
-            .withLayout(layout)
-            .withLocking(Boolean.parseBoolean(locking))
-            .withName(name)
+        .withFileName(fileName).setFilter(filter).setIgnoreExceptions(Booleans.parseBoolean(ignoreExceptions, true))
+            .withImmediateFlush(Booleans.parseBoolean(immediateFlush, true)).setLayout(layout)
+            .withLocking(Boolean.parseBoolean(locking)).setName(name)
             .build();
         // @formatter:on
     }
@@ -255,9 +254,9 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
 
     private FileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
             final FileManager manager, final String filename, final boolean ignoreExceptions,
-            final boolean immediateFlush, final Advertiser advertiser) {
+            final boolean immediateFlush, final Advertiser advertiser, Property[] properties) {
 
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+        super(name, layout, filter, ignoreExceptions, immediateFlush, properties, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
             configuration.putAll(manager.getContentFormat());

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java
index 59f93c8..f7ced5c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/HttpAppender.java
@@ -72,9 +72,11 @@ public final class HttpAppender extends AbstractAppender {
 
         @Override
         public HttpAppender build() {
-            final HttpManager httpManager = new HttpURLConnectionManager(getConfiguration(), getConfiguration().getLoggerContext(),
-                getName(), url, method, connectTimeoutMillis, readTimeoutMillis, headers, sslConfiguration, verifyHostname);
-            return new HttpAppender(getName(), getLayout(), getFilter(), isIgnoreExceptions(), httpManager);
+            final HttpManager httpManager = new HttpURLConnectionManager(getConfiguration(),
+                    getConfiguration().getLoggerContext(), getName(), url, method, connectTimeoutMillis,
+                    readTimeoutMillis, headers, sslConfiguration, verifyHostname);
+            return new HttpAppender(getName(), getLayout(), getFilter(), isIgnoreExceptions(), httpManager,
+                    getPropertyArray());
         }
 
         public URL getUrl() {
@@ -152,8 +154,8 @@ public final class HttpAppender extends AbstractAppender {
     private final HttpManager manager;
 
     private HttpAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
-                         final boolean ignoreExceptions, final HttpManager manager) {
-        super(name, filter, layout, ignoreExceptions);
+            final boolean ignoreExceptions, final HttpManager manager, final Property[] properties) {
+        super(name, filter, layout, ignoreExceptions, properties);
         Objects.requireNonNull(layout, "layout");
         this.manager = Objects.requireNonNull(manager, "manager");
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
index a6162bd..15a3a63 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileAppender.java
@@ -27,6 +27,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -88,7 +89,7 @@ public final class MemoryMappedFileAppender extends AbstractOutputStreamAppender
             }
 
             return new MemoryMappedFileAppender(name, layout, getFilter(), manager, fileName, isIgnoreExceptions(), false,
-                    advertise ? getConfiguration().getAdvertiser() : null);
+                    advertise ? getConfiguration().getAdvertiser() : null, getPropertyArray());
         }
 
         public B setFileName(final String fileName) {
@@ -128,8 +129,9 @@ public final class MemoryMappedFileAppender extends AbstractOutputStreamAppender
 
     private MemoryMappedFileAppender(final String name, final Layout<? extends Serializable> layout,
             final Filter filter, final MemoryMappedFileManager manager, final String filename,
-            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser,
+            final Property[] properties) {
+        super(name, layout, filter, ignoreExceptions, immediateFlush, properties, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
             configuration.putAll(manager.getContentFormat());
@@ -237,11 +239,8 @@ public final class MemoryMappedFileAppender extends AbstractOutputStreamAppender
         .setAdvertiseURI(advertiseURI)
         .setAppend(isAppend)
         .setConfiguration(config)
-        .setFileName(fileName).setFilter(filter)
-            .withIgnoreExceptions(ignoreExceptions)
-            .withImmediateFlush(isImmediateFlush)
-            .withLayout(layout)
-            .withName(name)
+        .setFileName(fileName).setFilter(filter).setIgnoreExceptions(ignoreExceptions)
+            .withImmediateFlush(isImmediateFlush).setLayout(layout).setName(name)
             .setRegionLength(regionLength)
             .build();
         // @formatter:on

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java
index 1733f9a..b90a8dd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/NullAppender.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.appender;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -39,8 +40,7 @@ public class NullAppender extends AbstractAppender {
 	}
 
 	private NullAppender(final String name) {
-		super(name, null, null);
-		// Do nothing
+		super(name, null, null, true, Property.EMPTY_ARRAY);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
index ddca626..3c84938 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
@@ -23,6 +23,8 @@ import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.Builder;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -41,7 +43,8 @@ public final class OutputStreamAppender extends AbstractOutputStreamAppender<Out
     /**
      * Builds OutputStreamAppender instances.
      */
-    public static class Builder implements org.apache.logging.log4j.core.util.Builder<OutputStreamAppender> {
+    public static class Builder<B extends Builder<B>> extends AbstractOutputStreamAppender.Builder<B>
+            implements org.apache.logging.log4j.core.util.Builder<OutputStreamAppender> {
 
         private Filter filter;
 
@@ -49,47 +52,28 @@ public final class OutputStreamAppender extends AbstractOutputStreamAppender<Out
 
         private boolean ignoreExceptions = true;
 
-        private Layout<? extends Serializable> layout = PatternLayout.createDefaultLayout();
-
-        private String name;
-
         private OutputStream target;
 
         @Override
         public OutputStreamAppender build() {
-            return new OutputStreamAppender(name, layout, filter, getManager(target, follow, layout), ignoreExceptions);
+            final Layout<? extends Serializable> layout = getLayout();
+            final Layout<? extends Serializable> actualLayout = layout == null ? PatternLayout.createDefaultLayout()
+                    : layout;
+            return new OutputStreamAppender(getName(), actualLayout, filter, getManager(target, follow, actualLayout),
+                    ignoreExceptions, getPropertyArray());
         }
 
-        public Builder setFilter(final Filter aFilter) {
-            this.filter = aFilter;
-            return this;
-        }
-
-        public Builder setFollow(final boolean shouldFollow) {
+        public B setFollow(final boolean shouldFollow) {
             this.follow = shouldFollow;
-            return this;
-        }
-
-        public Builder setIgnoreExceptions(final boolean shouldIgnoreExceptions) {
-            this.ignoreExceptions = shouldIgnoreExceptions;
-            return this;
-        }
-
-        public Builder setLayout(final Layout<? extends Serializable> aLayout) {
-            this.layout = aLayout;
-            return this;
-        }
-
-        public Builder setName(final String aName) {
-            this.name = aName;
-            return this;
+            return asBuilder();
         }
 
-        public Builder setTarget(final OutputStream aTarget) {
+        public B setTarget(final OutputStream aTarget) {
             this.target = aTarget;
-            return this;
+            return asBuilder();
         }
     }
+    
     /**
      * Holds data to pass to factory method.
      */
@@ -167,7 +151,7 @@ public final class OutputStreamAppender extends AbstractOutputStreamAppender<Out
         if (layout == null) {
             layout = PatternLayout.createDefaultLayout();
         }
-        return new OutputStreamAppender(name, layout, filter, getManager(target, follow, layout), ignore);
+        return new OutputStreamAppender(name, layout, filter, getManager(target, follow, layout), ignore, null);
     }
 
     private static OutputStreamManager getManager(final OutputStream target, final boolean follow,
@@ -184,8 +168,8 @@ public final class OutputStreamAppender extends AbstractOutputStreamAppender<Out
     }
 
     private OutputStreamAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
-            final OutputStreamManager manager, final boolean ignoreExceptions) {
-        super(name, layout, filter, ignoreExceptions, true, manager);
+            final OutputStreamManager manager, final boolean ignoreExceptions, final Property[] properties) {
+        super(name, layout, filter, ignoreExceptions, true, properties, manager);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
index 0ea8d99..98df988 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RandomAccessFileAppender.java
@@ -27,6 +27,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -82,7 +83,7 @@ public final class RandomAccessFileAppender extends AbstractOutputStreamAppender
             }
 
             return new RandomAccessFileAppender(name, layout, getFilter(), manager, fileName, isIgnoreExceptions(),
-                    immediateFlush, advertise ? getConfiguration().getAdvertiser() : null);
+                    immediateFlush, advertise ? getConfiguration().getAdvertiser() : null, getPropertyArray());
         }
 
         public B setFileName(final String fileName) {
@@ -113,9 +114,10 @@ public final class RandomAccessFileAppender extends AbstractOutputStreamAppender
 
     private RandomAccessFileAppender(final String name, final Layout<? extends Serializable> layout,
             final Filter filter, final RandomAccessFileManager manager, final String filename,
-            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
+            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser, 
+            final Property[] properties) {
 
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+        super(name, layout, filter, ignoreExceptions, immediateFlush, properties, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(
                     layout.getContentFormat());
@@ -227,11 +229,8 @@ public final class RandomAccessFileAppender extends AbstractOutputStreamAppender
         .setAppend(isAppend)
         .withBufferSize(bufferSize)
         .setConfiguration(configuration)
-        .setFileName(fileName).setFilter(filter)
-            .withIgnoreExceptions(ignoreExceptions)
-            .withImmediateFlush(isFlush)
-            .withLayout(layout)
-            .withName(name)
+        .setFileName(fileName).setFilter(filter).setIgnoreExceptions(ignoreExceptions)
+            .withImmediateFlush(isFlush).setLayout(layout).setName(name)
             .build();
     }
     

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
index cb9303a..ed42236 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingFileAppender.java
@@ -34,6 +34,7 @@ import org.apache.logging.log4j.core.appender.rolling.RollingFileManager;
 import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
 import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -152,7 +153,8 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
             manager.initialize();
 
             return new RollingFileAppender(getName(), layout, getFilter(), manager, fileName, filePattern,
-                    isIgnoreExceptions(), isImmediateFlush(), advertise ? getConfiguration().getAdvertiser() : null);
+                    isIgnoreExceptions(), isImmediateFlush(), advertise ? getConfiguration().getAdvertiser() : null,
+                    getPropertyArray());
         }
 
         public String getAdvertiseUri() {
@@ -274,8 +276,9 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
 
     private RollingFileAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
             final RollingFileManager manager, final String fileName, final String filePattern,
-            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser) {
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+            final boolean ignoreExceptions, final boolean immediateFlush, final Advertiser advertiser,
+            final Property[] properties) {
+        super(name, layout, filter, ignoreExceptions, immediateFlush, properties, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
             configuration.put("contentType", layout.getContentType());
@@ -385,13 +388,10 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
         .withBufferSize(bufferSize)
         .setConfiguration(config)
         .withFileName(fileName)
-        .withFilePattern(filePattern).setFilter(filter)
-                .withIgnoreExceptions(Booleans.parseBoolean(ignore, true))
-                .withImmediateFlush(Booleans.parseBoolean(immediateFlush, true))
-                .withLayout(layout)
+        .withFilePattern(filePattern).setFilter(filter).setIgnoreExceptions(Booleans.parseBoolean(ignore, true))
+                .withImmediateFlush(Booleans.parseBoolean(immediateFlush, true)).setLayout(layout)
                 .withCreateOnDemand(false)
-                .withLocking(false)
-                .withName(name)
+                .withLocking(false).setName(name)
                 .withPolicy(policy)
                 .withStrategy(strategy)
                 .build();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
index a3d8611..87bd023 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/RollingRandomAccessFileAppender.java
@@ -34,6 +34,7 @@ import org.apache.logging.log4j.core.appender.rolling.RollingRandomAccessFileMan
 import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy;
 import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -55,7 +56,7 @@ public final class RollingRandomAccessFileAppender extends AbstractOutputStreamA
         public Builder() {
             super();
             withBufferSize(RollingRandomAccessFileManager.DEFAULT_BUFFER_SIZE);
-            withIgnoreExceptions(true);
+            setIgnoreExceptions(true);
             withImmediateFlush(true);
         }
 
@@ -138,8 +139,9 @@ public final class RollingRandomAccessFileAppender extends AbstractOutputStreamA
 
             manager.initialize();
 
-            return new RollingRandomAccessFileAppender(name, layout,getFilter(), manager, fileName, filePattern,
-                    isIgnoreExceptions(), immediateFlush, bufferSize, advertise ? getConfiguration().getAdvertiser() : null);
+            return new RollingRandomAccessFileAppender(name, layout, getFilter(), manager, fileName, filePattern,
+                    isIgnoreExceptions(), immediateFlush, bufferSize,
+                    advertise ? getConfiguration().getAdvertiser() : null, getPropertyArray());
         }
 
         public B withFileName(final String fileName) {
@@ -201,9 +203,9 @@ public final class RollingRandomAccessFileAppender extends AbstractOutputStreamA
 
     private RollingRandomAccessFileAppender(final String name, final Layout<? extends Serializable> layout,
             final Filter filter, final RollingRandomAccessFileManager manager, final String fileName,
-            final String filePattern, final boolean ignoreExceptions,
-            final boolean immediateFlush, final int bufferSize, final Advertiser advertiser) {
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+            final String filePattern, final boolean ignoreExceptions, final boolean immediateFlush,
+            final int bufferSize, final Advertiser advertiser, final Property[] properties) {
+        super(name, layout, filter, ignoreExceptions, immediateFlush, properties, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
             configuration.put("contentType", layout.getContentType());
@@ -334,11 +336,8 @@ public final class RollingRandomAccessFileAppender extends AbstractOutputStreamA
            .withBufferSize(bufferSize)
            .setConfiguration(configuration)
            .withFileName(fileName)
-           .withFilePattern(filePattern).setFilter(filter)
-           .withIgnoreExceptions(isIgnoreExceptions)
-           .withImmediateFlush(isImmediateFlush)
-           .withLayout(layout)
-           .withName(name)
+           .withFilePattern(filePattern).setFilter(filter).setIgnoreExceptions(isIgnoreExceptions)
+           .withImmediateFlush(isImmediateFlush).setLayout(layout).setName(name)
            .withPolicy(policy)
            .withStrategy(strategy)
            .build();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
index 30a28f1..0d9cefa 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ScriptAppenderSelector.java
@@ -27,6 +27,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -132,8 +133,9 @@ public class ScriptAppenderSelector extends AbstractAppender {
         return new Builder();
     }
 
-    private ScriptAppenderSelector(final String name, final Filter filter, final Layout<? extends Serializable> layout) {
-        super(name, filter, layout);
+    private ScriptAppenderSelector(final String name, final Filter filter, final Layout<? extends Serializable> layout,
+            final Property[] properties) {
+        super(name, filter, layout, true, Property.EMPTY_ARRAY);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
index e3aac4d..714fe2d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SmtpAppender.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
@@ -64,9 +65,9 @@ public final class SmtpAppender extends AbstractAppender {
     /** The SMTP Manager */
     private final SmtpManager manager;
 
-    private SmtpAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout, final SmtpManager manager,
-                         final boolean ignoreExceptions) {
-        super(name, filter, layout, ignoreExceptions);
+    private SmtpAppender(final String name, final Filter filter, final Layout<? extends Serializable> layout,
+            final SmtpManager manager, final boolean ignoreExceptions, final Property[] properties) {
+        super(name, filter, layout, ignoreExceptions, properties);
         this.manager = manager;
     }
 
@@ -153,7 +154,7 @@ public final class SmtpAppender extends AbstractAppender {
             return null;
         }
 
-        return new SmtpAppender(name, filter, layout, manager, ignoreExceptions);
+        return new SmtpAppender(name, filter, layout, manager, ignoreExceptions, null);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
index ce4d254..39be95e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SocketAppender.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 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.PluginBuilderAttribute;
@@ -221,7 +222,8 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
                     getConnectTimeoutMillis(), getSslConfiguration(), getReconnectDelayMillis(), getImmediateFail(), layout, getBufferSize(), getSocketOptions());
 
             return new SocketAppender(name, layout, getFilter(), manager, isIgnoreExceptions(),
-                    !bufferedIo || immediateFlush, getAdvertise() ? getConfiguration().getAdvertiser() : null);
+                    !bufferedIo || immediateFlush, getAdvertise() ? getConfiguration().getAdvertiser() : null,
+                    getPropertyArray());
         }
     }
     
@@ -235,8 +237,8 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
 
     protected SocketAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
             final AbstractSocketManager manager, final boolean ignoreExceptions, final boolean immediateFlush,
-            final Advertiser advertiser) {
-        super(name, layout, filter, ignoreExceptions, immediateFlush, manager);
+            final Advertiser advertiser, final Property[] properties) {
+        super(name, layout, filter, ignoreExceptions, immediateFlush, properties, manager);
         if (advertiser != null) {
             final Map<String, String> configuration = new HashMap<>(layout.getContentFormat());
             configuration.putAll(manager.getContentFormat());
@@ -249,6 +251,16 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
         this.advertiser = advertiser;
     }
 
+    /**
+     * @deprecated {@link #SocketAppender(String, Layout, Filter, AbstractSocketManager, boolean, boolean, Advertiser, Property[])}.
+     */
+    @Deprecated
+    protected SocketAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
+            final AbstractSocketManager manager, final boolean ignoreExceptions, final boolean immediateFlush,
+            final Advertiser advertiser) {
+        this(name, layout, filter, manager, ignoreExceptions, immediateFlush, advertiser, Property.EMPTY_ARRAY);
+    }
+
     @Override
     public boolean stop(final long timeout, final TimeUnit timeUnit) {
         setStopping();
@@ -320,11 +332,8 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
         .withAdvertise(advertise)
         .setConfiguration(configuration)
         .withConnectTimeoutMillis(connectTimeoutMillis).setFilter(filter)
-            .withHost(host)
-            .withIgnoreExceptions(ignoreExceptions)
-            .withImmediateFail(immediateFail)
-            .withLayout(layout)
-            .withName(name)
+            .withHost(host).setIgnoreExceptions(ignoreExceptions)
+            .withImmediateFail(immediateFail).setLayout(layout).setName(name)
             .withPort(port)
             .withProtocol(protocol)
             .withReconnectDelayMillis(reconnectDelayMillis)

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
index 2b14598..87ec9f8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/SyslogAppender.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
@@ -124,7 +125,7 @@ public class SyslogAppender extends SocketAppender {
                             .setEscapeNL(escapeNL)
                             .setCharset(charsetName)
                             .build();
-                        // @formatter:off
+                        // @formatter:on
             }
             final String name = getName();
             if (name == null) {
@@ -135,7 +136,7 @@ public class SyslogAppender extends SocketAppender {
                     sslConfiguration, getReconnectDelayMillis(), getImmediateFail(), layout, Constants.ENCODER_BYTE_BUFFER_SIZE, null);
 
             return new SyslogAppender(name, layout, getFilter(), isIgnoreExceptions(), isImmediateFlush(), manager,
-                    getAdvertise() ? configuration.getAdvertiser() : null);
+                    getAdvertise() ? configuration.getAdvertiser() : null, null);
         }
 
         public Facility getFacility() {
@@ -305,9 +306,19 @@ public class SyslogAppender extends SocketAppender {
 
     protected SyslogAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
                              final boolean ignoreExceptions, final boolean immediateFlush,
-                             final AbstractSocketManager manager, final Advertiser advertiser) {
-        super(name, layout, filter, manager, ignoreExceptions, immediateFlush, advertiser);
+                             final AbstractSocketManager manager, final Advertiser advertiser, Property[] properties) {
+        super(name, layout, filter, manager, ignoreExceptions, immediateFlush, advertiser, properties);
+    }
 
+    /**
+     * @deprecated Use
+     * {@link #SyslogAppender(String, Layout, Filter, boolean, boolean, AbstractSocketManager, Advertiser, Property[])}.
+     */
+    @Deprecated
+    protected SyslogAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
+            final boolean ignoreExceptions, final boolean immediateFlush, final AbstractSocketManager manager,
+            final Advertiser advertiser) {
+        super(name, layout, filter, manager, ignoreExceptions, immediateFlush, advertiser, Property.EMPTY_ARRAY);
     }
 
     /**
@@ -393,10 +404,8 @@ public class SyslogAppender extends SocketAppender {
         .withSslConfiguration(sslConfiguration)
         .withConnectTimeoutMillis(connectTimeoutMillis)
         .withReconnectDelayMillis(reconnectDelayMillis)
-        .withImmediateFail(immediateFail)
-        .withName(appName)
-        .withImmediateFlush(immediateFlush)
-        .withIgnoreExceptions(ignoreExceptions).setFilter(filter)
+        .withImmediateFail(immediateFail).setName(appName)
+        .withImmediateFlush(immediateFlush).setIgnoreExceptions(ignoreExceptions).setFilter(filter)
                 .setConfiguration(configuration)
                 .withAdvertise(advertise)
                 .setFacility(facility)

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java
index dc8f4d2..a5683eb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/WriterAppender.java
@@ -16,12 +16,16 @@
  */
 package org.apache.logging.log4j.core.appender;
 
+import java.io.Serializable;
 import java.io.Writer;
 
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.StringLayout;
+import org.apache.logging.log4j.core.appender.HttpAppender.Builder;
+import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
@@ -37,53 +41,29 @@ public final class WriterAppender extends AbstractWriterAppender<WriterManager>
     /**
      * Builds WriterAppender instances.
      */
-    public static class Builder implements org.apache.logging.log4j.core.util.Builder<WriterAppender> {
-
-        private Filter filter;
+    public static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B>
+            implements org.apache.logging.log4j.core.util.Builder<WriterAppender> {
 
         private boolean follow = false;
 
-        private boolean ignoreExceptions = true;
-
-        private StringLayout layout = PatternLayout.createDefaultLayout();
-
-        private String name;
-
         private Writer target;
 
         @Override
         public WriterAppender build() {
-            return new WriterAppender(name, layout, filter, getManager(target, follow, layout), ignoreExceptions);
-        }
-
-        public Builder setFilter(final Filter aFilter) {
-            this.filter = aFilter;
-            return this;
+            StringLayout layout = (StringLayout) getLayout();
+            StringLayout actualLayout = layout != null ? layout : PatternLayout.createDefaultLayout();
+            return new WriterAppender(getName(), actualLayout, getFilter(), getManager(target, follow, actualLayout),
+                    isIgnoreExceptions(), getPropertyArray());
         }
 
-        public Builder setFollow(final boolean shouldFollow) {
+        public B setFollow(final boolean shouldFollow) {
             this.follow = shouldFollow;
-            return this;
-        }
-
-        public Builder setIgnoreExceptions(final boolean shouldIgnoreExceptions) {
-            this.ignoreExceptions = shouldIgnoreExceptions;
-            return this;
-        }
-
-        public Builder setLayout(final StringLayout aLayout) {
-            this.layout = aLayout;
-            return this;
-        }
-
-        public Builder setName(final String aName) {
-            this.name = aName;
-            return this;
+            return asBuilder();
         }
 
-        public Builder setTarget(final Writer aTarget) {
+        public B setTarget(final Writer aTarget) {
             this.target = aTarget;
-            return this;
+            return asBuilder();
         }
     }
     /**
@@ -160,7 +140,7 @@ public final class WriterAppender extends AbstractWriterAppender<WriterManager>
         if (layout == null) {
             layout = PatternLayout.createDefaultLayout();
         }
-        return new WriterAppender(name, layout, filter, getManager(target, follow, layout), ignore);
+        return new WriterAppender(name, layout, filter, getManager(target, follow, layout), ignore, null);
     }
 
     private static WriterManager getManager(final Writer target, final boolean follow, final StringLayout layout) {
@@ -176,8 +156,8 @@ public final class WriterAppender extends AbstractWriterAppender<WriterManager>
     }
 
     private WriterAppender(final String name, final StringLayout layout, final Filter filter,
-            final WriterManager manager, final boolean ignoreExceptions) {
-        super(name, layout, filter, ignoreExceptions, true, manager);
+            final WriterManager manager, final boolean ignoreExceptions, final Property[] properties) {
+        super(name, layout, filter, ignoreExceptions, true, properties, manager);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/61b77dfb/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java
index 09798fd..f720461 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/db/AbstractDatabaseAppender.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
+import org.apache.logging.log4j.core.config.Property;
 
 /**
  * An abstract Appender for writing events to a database of some type, be it relational or NoSQL. All database appenders
@@ -53,10 +54,12 @@ public abstract class AbstractDatabaseAppender<T extends AbstractDatabaseManager
      * @param ignoreExceptions If {@code true} exceptions encountered when appending events are logged; otherwise
      *                         they are propagated to the caller.
      * @param manager The matching {@link AbstractDatabaseManager} implementation.
+     * @deprecated Use {@link #AbstractDatabaseAppender(String, Filter, Layout, boolean, Property[], AbstractDatabaseManager)}.
      */
+    @Deprecated
     protected AbstractDatabaseAppender(final String name, final Filter filter, final boolean ignoreExceptions,
                                        final T manager) {
-        super(name, filter, null, ignoreExceptions);
+        super(name, filter, null, ignoreExceptions, Property.EMPTY_ARRAY);
         this.manager = manager;
     }
 
@@ -69,10 +72,29 @@ public abstract class AbstractDatabaseAppender<T extends AbstractDatabaseManager
      * @param ignoreExceptions If {@code true} exceptions encountered when appending events are logged; otherwise
      *                         they are propagated to the caller.
      * @param manager The matching {@link AbstractDatabaseManager} implementation.
+     * @deprecated Use {@link #AbstractDatabaseAppender(String, Filter, Layout, boolean, Property[], AbstractDatabaseManager)}
      */
+    @Deprecated
     protected AbstractDatabaseAppender(final String name, final Filter filter,
             final Layout<? extends Serializable> layout, final boolean ignoreExceptions, final T manager) {
-        super(name, filter, layout, ignoreExceptions);
+        super(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
+        this.manager = manager;
+    }
+
+    /**
+     * Instantiates the base appender.
+     *
+     * @param name The appender name.
+     * @param filter The filter, if any, to use.
+     * @param layout The layout to use to format the event.
+     * @param ignoreExceptions If {@code true} exceptions encountered when appending events are logged; otherwise
+     *                         they are propagated to the caller.
+     * @param manager The matching {@link AbstractDatabaseManager} implementation.
+     */
+    protected AbstractDatabaseAppender(final String name, final Filter filter,
+            final Layout<? extends Serializable> layout, final boolean ignoreExceptions, 
+            final Property[] properties, final T manager) {
+        super(name, filter, layout, ignoreExceptions, properties);
         this.manager = manager;
     }