You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/09/04 07:22:17 UTC

[29/50] logging-log4j2 git commit: First commit for LOG4J2-1558 branch.

First commit for LOG4J2-1558 branch.

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

Branch: refs/heads/LOG4J2-1349-gcfree-threadcontext
Commit: 53e7bbc0f06fb73b6a42fcf7fb43ec603e60e639
Parents: e18fcb7
Author: ggregory <gg...@apache.org>
Authored: Thu Sep 1 14:16:03 2016 -0700
Committer: ggregory <gg...@apache.org>
Committed: Thu Sep 1 14:16:03 2016 -0700

----------------------------------------------------------------------
 .../appender/AbstractOutputStreamAppender.java  | 27 ++++++-
 .../log4j/core/appender/FileAppender.java       | 28 +------
 .../core/appender/OutputStreamManager.java      |  8 +-
 .../core/appender/RollingFileAppender.java      | 33 +-------
 .../log4j/core/appender/SocketAppender.java     | 19 ++---
 .../log4j/core/appender/SyslogAppender.java     |  4 +-
 .../log4j/core/net/AbstractSocketManager.java   |  6 +-
 .../log4j/core/net/DatagramSocketManager.java   | 21 +++--
 .../log4j/core/net/SslSocketManager.java        | 31 +++----
 .../log4j/core/net/TcpSocketManager.java        | 85 +++++++++++---------
 .../log4j/core/appender/SocketAppenderTest.java | 29 +++++--
 11 files changed, 159 insertions(+), 132 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/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 3e14d84..be62a66 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
@@ -39,16 +39,41 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
     public abstract static class Builder<B extends Builder<B>> extends AbstractAppender.Builder<B> {
     
         @PluginBuilderAttribute
+        private boolean bufferedIo = true;
+
+        @PluginBuilderAttribute
+        private int bufferSize = Constants.ENCODER_BYTE_BUFFER_SIZE;
+
+        @PluginBuilderAttribute
         private boolean immediateFlush;
 
+        public int getBufferSize() {
+            return bufferSize;
+        }
+
+        public boolean isBufferedIo() {
+            return bufferedIo;
+        }
+
         public boolean isImmediateFlush() {
             return immediateFlush;
         }
-
+        
         public B withImmediateFlush(boolean immediateFlush) {
             this.immediateFlush = immediateFlush;
             return asBuilder();
         }
+        
+        public B withBufferedIo(final boolean bufferedIo) {
+            this.bufferedIo = bufferedIo;
+            return asBuilder();
+        }
+
+        public B withBufferSize(final int bufferSize) {
+            this.bufferSize = bufferSize;
+            return asBuilder();
+        }
+
     }
     
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/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 6b035cd..9e95593 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
@@ -58,12 +58,6 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
         private boolean locking;
 
         @PluginBuilderAttribute
-        private boolean bufferedIo = true;
-
-        @PluginBuilderAttribute
-        private int bufferSize = DEFAULT_BUFFER_SIZE;
-
-        @PluginBuilderAttribute
         private boolean advertise;
 
         @PluginBuilderAttribute
@@ -77,12 +71,14 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
 
         @Override
         public FileAppender build() {
+            boolean bufferedIo = isBufferedIo();
+            final int bufferSize = getBufferSize();
             if (locking && bufferedIo) {
                 LOGGER.warn("Locking and buffering are mutually exclusive. No buffering will occur for {}", fileName);
                 bufferedIo = false;
             }
             if (!bufferedIo && bufferSize > 0) {
-                LOGGER.warn("The bufferSize is set to {} but bufferedIo is not true: {}", bufferSize, bufferedIo);
+                LOGGER.warn("The bufferSize is set to {} but bufferedIo is false: {}", bufferSize, bufferedIo);
             }
             Layout<? extends Serializable> layout = getOrCreateLayout();
 
@@ -100,10 +96,6 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             return advertiseUri;
         }
 
-        public int getBufferSize() {
-            return bufferSize;
-        }
-
         public Configuration getConfiguration() {
             return configuration;
         }
@@ -120,10 +112,6 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             return append;
         }
 
-        public boolean isBufferedIo() {
-            return bufferedIo;
-        }
-
         public boolean isCreateOnDemand() {
             return createOnDemand;
         }
@@ -147,16 +135,6 @@ public final class FileAppender extends AbstractOutputStreamAppender<FileManager
             return asBuilder();
         }
 
-        public B withBufferedIo(final boolean bufferedIo) {
-            this.bufferedIo = bufferedIo;
-            return asBuilder();
-        }
-
-        public B withBufferSize(final int bufferSize) {
-            this.bufferSize = bufferSize;
-            return asBuilder();
-        }
-
         public B withConfiguration(final Configuration config) {
             this.configuration = config;
             return asBuilder();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
index 97a9dc6..81d5027 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamManager.java
@@ -40,7 +40,13 @@ public class OutputStreamManager extends AbstractManager implements ByteBufferDe
     protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
             final boolean writeHeader) {
         // Can't use new ctor because it throws an exception
-        this(os, streamName, layout, writeHeader, ByteBuffer.wrap(new byte[Constants.ENCODER_BYTE_BUFFER_SIZE]));
+        this(os, streamName, layout, writeHeader, Constants.ENCODER_BYTE_BUFFER_SIZE);
+    }
+
+    protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
+            final boolean writeHeader, final int bufferSize) {
+        // Can't use new ctor because it throws an exception
+        this(os, streamName, layout, writeHeader, ByteBuffer.wrap(new byte[bufferSize]));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/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 f8f66f2..e081f87 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
@@ -30,14 +30,11 @@ 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.plugins.Plugin;
-import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
-import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.config.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.net.Advertiser;
 import org.apache.logging.log4j.core.util.Booleans;
 import org.apache.logging.log4j.core.util.Integers;
@@ -79,12 +76,6 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
         private RolloverStrategy strategy;
 
         @PluginBuilderAttribute
-        private boolean bufferedIo = true;
-
-        @PluginBuilderAttribute
-        private int bufferSize = DEFAULT_BUFFER_SIZE;
-
-        @PluginBuilderAttribute
         private boolean advertise;
 
         @PluginBuilderAttribute
@@ -100,12 +91,14 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
         public RollingFileAppender build() {
             // Even though some variables may be annotated with @Required, we must still perform validation here for
             // call sites that build builders programmatically.
+            final boolean isBufferedIo = isBufferedIo();
+            final int bufferSize = getBufferSize();
             if (getName() == null) {
                 LOGGER.error("RollingFileAppender '{}': No name provided.", getName());
                 return null;
             }
 
-            if (!bufferedIo && bufferSize > 0) {
+            if (!isBufferedIo && bufferSize > 0) {
                 LOGGER.warn("RollingFileAppender '{}': The bufferSize is set to {} but bufferedIO is not true", getName(), bufferSize);
             }
 
@@ -135,7 +128,7 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
             }
 
             final RollingFileManager manager = RollingFileManager.getFileManager(fileName, filePattern, append,
-                    bufferedIo, policy, strategy, advertiseUri, getLayout(), bufferSize, isImmediateFlush(),
+                    isBufferedIo, policy, strategy, advertiseUri, getLayout(), bufferSize, isImmediateFlush(),
                     createOnDemand, configuration);
             if (manager == null) {
                 return null;
@@ -151,10 +144,6 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
             return advertiseUri;
         }
 
-        public int getBufferSize() {
-            return bufferSize;
-        }
-
         public Configuration getConfiguration() {
             return configuration;
         }
@@ -171,10 +160,6 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
             return append;
         }
 
-        public boolean isBufferedIo() {
-            return bufferedIo;
-        }
-
         public boolean isCreateOnDemand() {
             return createOnDemand;
         }
@@ -198,16 +183,6 @@ public final class RollingFileAppender extends AbstractOutputStreamAppender<Roll
             return asBuilder();
         }
 
-        public B withBufferedIo(final boolean bufferedIo) {
-            this.bufferedIo = bufferedIo;
-            return asBuilder();
-        }
-
-        public B withBufferSize(final int bufferSize) {
-            this.bufferSize = bufferSize;
-            return asBuilder();
-        }
-
         public B withConfiguration(final Configuration config) {
             this.configuration = config;
             return asBuilder();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/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 57cbceb..d6eb27e 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
@@ -40,6 +40,7 @@ import org.apache.logging.log4j.core.net.SslSocketManager;
 import org.apache.logging.log4j.core.net.TcpSocketManager;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
 import org.apache.logging.log4j.core.util.Booleans;
+import org.apache.logging.log4j.core.util.Constants;
 
 /**
  * An Appender that delivers events over socket connections. Supports both TCP and UDP.
@@ -109,7 +110,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
             }
 
             final AbstractSocketManager manager = SocketAppender.createSocketManager(name, actualProtocol, host, port,
-                    connectTimeoutMillis, sslConfiguration, reconnectDelayMillis, immediateFail, layout);
+                    connectTimeoutMillis, sslConfiguration, reconnectDelayMillis, immediateFail, layout, getBufferSize());
 
             return new SocketAppender(name, layout, getFilter(), manager, isIgnoreExceptions(), immediateFlush,
                     advertise ? configuration.getAdvertiser() : null);
@@ -310,7 +311,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
             }
 
             final AbstractSocketManager manager = createSocketManager(name, actualProtocol, host, port,
-                    connectTimeoutMillis, sslConfig, reconnectDelayMillis, immediateFail, layout);
+                    connectTimeoutMillis, sslConfig, reconnectDelayMillis, immediateFail, layout, Constants.ENCODER_BYTE_BUFFER_SIZE);
 
             return new SocketAppender(name, layout, filter, manager, ignoreExceptions, immediateFlush,
                     advertise ? configuration.getAdvertiser() : null);
@@ -388,8 +389,8 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
      *             if the protocol cannot be handled.
      */
     protected static AbstractSocketManager createSocketManager(final String name, Protocol protocol, final String host,
-            final int port, final int connectTimeoutMillis, final SslConfiguration sslConfig, final int delayMillis,
-            final boolean immediateFail, final Layout<? extends Serializable> layout) {
+            final int port, final int connectTimeoutMillis, final SslConfiguration sslConfig, final int reconnectDelayMillis,
+            final boolean immediateFail, final Layout<? extends Serializable> layout, final int bufferSize) {
         if (protocol == Protocol.TCP && sslConfig != null) {
             // Upgrade TCP to SSL if an SSL config is specified.
             protocol = Protocol.SSL;
@@ -399,13 +400,13 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
         }
         switch (protocol) {
         case TCP:
-            return TcpSocketManager.getSocketManager(host, port, connectTimeoutMillis, delayMillis, immediateFail,
-                    layout);
+            return TcpSocketManager.getSocketManager(host, port, connectTimeoutMillis, reconnectDelayMillis, immediateFail,
+                    layout, bufferSize);
         case UDP:
-            return DatagramSocketManager.getSocketManager(host, port, layout);
+            return DatagramSocketManager.getSocketManager(host, port, layout, bufferSize);
         case SSL:
-            return SslSocketManager.getSocketManager(sslConfig, host, port, connectTimeoutMillis, delayMillis,
-                    immediateFail, layout);
+            return SslSocketManager.getSocketManager(sslConfig, host, port, connectTimeoutMillis, reconnectDelayMillis,
+                    immediateFail, layout, bufferSize);
         default:
             throw new IllegalArgumentException(protocol.toString());
         }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/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 1e9cdc0..13fa995 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
@@ -36,6 +36,7 @@ import org.apache.logging.log4j.core.net.Advertiser;
 import org.apache.logging.log4j.core.net.Facility;
 import org.apache.logging.log4j.core.net.Protocol;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
+import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.util.EnglishEnums;
 
 /**
@@ -89,7 +90,6 @@ public class SyslogAppender extends SocketAppender {
      * @param exceptionPattern The converter pattern to use for formatting exceptions.
      * @param loggerFields The logger fields
      * @param advertise Whether to advertise
-     * @param connectTimeoutMillis the connect timeout in milliseconds.
      * @return A SyslogAppender.
      */
     @PluginFactory
@@ -143,7 +143,7 @@ public class SyslogAppender extends SocketAppender {
             return null;
         }
         final AbstractSocketManager manager = createSocketManager(name, protocol, host, port, connectTimeoutMillis,
-                sslConfig, reconnectionDelayMillis, immediateFail, layout);
+                sslConfig, reconnectionDelayMillis, immediateFail, layout, Constants.ENCODER_BYTE_BUFFER_SIZE);
 
         return new SyslogAppender(name, layout, filter, ignoreExceptions, immediateFlush, manager,
                 advertise ? config.getAdvertiser() : null);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java
index ceeeeff..5157365 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/AbstractSocketManager.java
@@ -52,10 +52,12 @@ public abstract class AbstractSocketManager extends OutputStreamManager {
      * @param inetAddress The Internet address.
      * @param host The target host name.
      * @param port The target port number.
+     * @param bufferSize The buffer size.
      */
     public AbstractSocketManager(final String name, final OutputStream os, final InetAddress inetAddress,
-            final String host, final int port, final Layout<? extends Serializable> layout, final boolean writeHeader) {
-        super(os, name, layout, writeHeader);
+            final String host, final int port, final Layout<? extends Serializable> layout, final boolean writeHeader, 
+            final int bufferSize) {
+        super(os, name, layout, writeHeader, bufferSize);
         this.inetAddress = inetAddress;
         this.host = host;
         this.port = port;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/log4j-core/src/main/java/org/apache/logging/log4j/core/net/DatagramSocketManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/DatagramSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/DatagramSocketManager.java
index 0bcd793..56e17dc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/DatagramSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/DatagramSocketManager.java
@@ -42,10 +42,11 @@ public class DatagramSocketManager extends AbstractSocketManager {
      * @param host The host to connect to.
      * @param port The port on the host.
      * @param layout The layout
+     * @param bufferSize The buffer size
      */
     protected DatagramSocketManager(final String name, final OutputStream os, final InetAddress inetAddress, final String host,
-                final int port, final Layout<? extends Serializable> layout) {
-        super(name, os, inetAddress, host, port, layout, true);
+                final int port, final Layout<? extends Serializable> layout, final int bufferSize) {
+        super(name, os, inetAddress, host, port, layout, true, bufferSize);
     }
 
     /**
@@ -53,17 +54,19 @@ public class DatagramSocketManager extends AbstractSocketManager {
      * @param host The host to connect to.
      * @param port The port on the host.
      * @param layout The layout.
+     * @param bufferSize The buffer size.
      * @return A DatagramSocketManager.
      */
-    public static DatagramSocketManager getSocketManager(final String host, final int port, final Layout<? extends Serializable> layout) {
+    public static DatagramSocketManager getSocketManager(final String host, final int port,
+            final Layout<? extends Serializable> layout, final int bufferSize) {
         if (Strings.isEmpty(host)) {
             throw new IllegalArgumentException("A host name is required");
         }
         if (port <= 0) {
             throw new IllegalArgumentException("A port value is required");
         }
-        return (DatagramSocketManager) getManager("UDP:" + host + ':' + port, new FactoryData(host, port, layout),
-            FACTORY);
+        return (DatagramSocketManager) getManager("UDP:" + host + ':' + port,
+                new FactoryData(host, port, layout, bufferSize), FACTORY);
     }
 
     /**
@@ -90,11 +93,13 @@ public class DatagramSocketManager extends AbstractSocketManager {
         private final String host;
         private final int port;
         private final Layout<? extends Serializable> layout;
-
-        public FactoryData(final String host, final int port, final Layout<? extends Serializable> layout) {
+        private final int bufferSize;
+        
+        public FactoryData(final String host, final int port, final Layout<? extends Serializable> layout, int bufferSize) {
             this.host = host;
             this.port = port;
             this.layout = layout;
+            this.bufferSize = bufferSize;
         }
     }
 
@@ -114,7 +119,7 @@ public class DatagramSocketManager extends AbstractSocketManager {
             }
             final OutputStream os = new DatagramOutputStream(data.host, data.port, data.layout.getHeader(),
                     data.layout.getFooter());
-            return new DatagramSocketManager(name, os, inetAddress, data.host, data.port, data.layout);
+            return new DatagramSocketManager(name, os, inetAddress, data.host, data.port, data.layout, data.bufferSize);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
index 1e5a958..73e2230 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SslSocketManager.java
@@ -55,51 +55,54 @@ public class SslSocketManager extends TcpSocketManager {
      * @param delay         Reconnection interval.
      * @param immediateFail
      * @param layout        The Layout.
+     * @param bufferSize The buffer size.
      */
     public SslSocketManager(final String name, final OutputStream os, final Socket sock,
             final SslConfiguration sslConfig, final InetAddress inetAddress, final String host, final int port,
             final int connectTimeoutMillis, final int delay, final boolean immediateFail,
-            final Layout<? extends Serializable> layout) {
-        super(name, os, sock, inetAddress, host, port, connectTimeoutMillis, delay, immediateFail, layout);
+            final Layout<? extends Serializable> layout, int bufferSize) {
+        super(name, os, sock, inetAddress, host, port, connectTimeoutMillis, delay, immediateFail, layout, bufferSize);
         this.sslConfig = sslConfig;
     }
 
     private static class SslFactoryData {
-        protected SslConfiguration sslConfig;
+        protected SslConfiguration sslConfiguration;
         private final String host;
         private final int port;
         private final int connectTimeoutMillis;
         private final int delayMillis;
         private final boolean immediateFail;
         private final Layout<? extends Serializable> layout;
+        private final int bufferSize;
 
-        public SslFactoryData(final SslConfiguration sslConfig, final String host, final int port,
+        public SslFactoryData(final SslConfiguration sslConfiguration, final String host, final int port,
                 final int connectTimeoutMillis, final int delayMillis, final boolean immediateFail,
-                final Layout<? extends Serializable> layout) {
+                final Layout<? extends Serializable> layout, final int bufferSize) {
             this.host = host;
             this.port = port;
             this.connectTimeoutMillis = connectTimeoutMillis;
             this.delayMillis = delayMillis;
             this.immediateFail = immediateFail;
             this.layout = layout;
-            this.sslConfig = sslConfig;
+            this.sslConfiguration = sslConfiguration;
+            this.bufferSize = bufferSize;
         }
     }
 
     public static SslSocketManager getSocketManager(final SslConfiguration sslConfig, final String host, int port,
-            final int connectTimeoutMillis, int delayMillis, final boolean immediateFail,
-            final Layout<? extends Serializable> layout) {
+            final int connectTimeoutMillis, int reconnectDelayMillis, final boolean immediateFail,
+            final Layout<? extends Serializable> layout, final int bufferSize) {
         if (Strings.isEmpty(host)) {
             throw new IllegalArgumentException("A host name is required");
         }
         if (port <= 0) {
             port = DEFAULT_PORT;
         }
-        if (delayMillis == 0) {
-            delayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
+        if (reconnectDelayMillis == 0) {
+            reconnectDelayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
         }
         return (SslSocketManager) getManager("TLS:" + host + ':' + port, new SslFactoryData(sslConfig, host, port,
-                connectTimeoutMillis, delayMillis, immediateFail, layout), FACTORY);
+                connectTimeoutMillis, reconnectDelayMillis, immediateFail, layout, bufferSize), FACTORY);
     }
 
     @Override
@@ -151,8 +154,8 @@ public class SslSocketManager extends TcpSocketManager {
                 LOGGER.catching(Level.DEBUG, e);
                 return null;
             }
-            return new SslSocketManager(name, os, socket, data.sslConfig, inetAddress, data.host, data.port, 0,
-                    data.delayMillis, data.immediateFail, data.layout);
+            return new SslSocketManager(name, os, socket, data.sslConfiguration, inetAddress, data.host, data.port, 0,
+                    data.delayMillis, data.immediateFail, data.layout, data.bufferSize);
         }
 
         private InetAddress resolveAddress(final String hostName) throws TlsSocketManagerFactoryException {
@@ -178,7 +181,7 @@ public class SslSocketManager extends TcpSocketManager {
             SSLSocketFactory socketFactory;
             SSLSocket socket;
 
-            socketFactory = createSslSocketFactory(data.sslConfig);
+            socketFactory = createSslSocketFactory(data.sslConfiguration);
             socket = (SSLSocket) socketFactory.createSocket(data.host, data.port);
             return socket;
         }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
index 756ba35..4f7f822 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java
@@ -53,7 +53,7 @@ public class TcpSocketManager extends AbstractSocketManager {
 
     private final int reconnectionDelay;
 
-    private Reconnector connector;
+    private Reconnector reconnector;
 
     private Socket socket;
 
@@ -67,7 +67,7 @@ public class TcpSocketManager extends AbstractSocketManager {
      * The Constructor.
      * @param name The unique name of this connection.
      * @param os The OutputStream.
-     * @param sock The Socket.
+     * @param socket The Socket.
      * @param inetAddress The Internet address of the host.
      * @param host The name of the host.
      * @param port The port number on the host.
@@ -75,21 +75,22 @@ public class TcpSocketManager extends AbstractSocketManager {
      * @param delay Reconnection interval.
      * @param immediateFail True if the write should fail if no socket is immediately available.
      * @param layout The Layout.
+     * @param bufferSize The buffer size.
      */
-    public TcpSocketManager(final String name, final OutputStream os, final Socket sock, final InetAddress inetAddress,
+    public TcpSocketManager(final String name, final OutputStream os, final Socket socket, final InetAddress inetAddress,
                             final String host, final int port, final int connectTimeoutMillis, final int delay,
-                            final boolean immediateFail, final Layout<? extends Serializable> layout) {
-        super(name, os, inetAddress, host, port, layout, true);
+                            final boolean immediateFail, final Layout<? extends Serializable> layout, int bufferSize) {
+        super(name, os, inetAddress, host, port, layout, true, bufferSize);
         this.connectTimeoutMillis = connectTimeoutMillis;
         this.reconnectionDelay = delay;
-        this.socket = sock;
+        this.socket = socket;
         this.immediateFail = immediateFail;
         retry = delay > 0;
-        if (sock == null) {
-            connector = new Reconnector(this);
-            connector.setDaemon(true);
-            connector.setPriority(Thread.MIN_PRIORITY);
-            connector.start();
+        if (socket == null) {
+            reconnector = new Reconnector(this);
+            reconnector.setDaemon(true);
+            reconnector.setPriority(Thread.MIN_PRIORITY);
+            reconnector.start();
         }
     }
 
@@ -98,29 +99,30 @@ public class TcpSocketManager extends AbstractSocketManager {
      * @param host The host to connect to.
      * @param port The port on the host.
      * @param connectTimeoutMillis the connect timeout in milliseconds
-     * @param delayMillis The interval to pause between retries.
+     * @param reconnectDelayMillis The interval to pause between retries.
+     * @param bufferSize The buffer size.
      * @return A TcpSocketManager.
      */
     public static TcpSocketManager getSocketManager(final String host, int port, final int connectTimeoutMillis,
-            int delayMillis, final boolean immediateFail, final Layout<? extends Serializable> layout) {
+            int reconnectDelayMillis, final boolean immediateFail, final Layout<? extends Serializable> layout, final int bufferSize) {
         if (Strings.isEmpty(host)) {
             throw new IllegalArgumentException("A host name is required");
         }
         if (port <= 0) {
             port = DEFAULT_PORT;
         }
-        if (delayMillis == 0) {
-            delayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
+        if (reconnectDelayMillis == 0) {
+            reconnectDelayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
         }
-        return (TcpSocketManager) getManager("TCP:" + host + ':' + port, new FactoryData(host, port,
-                connectTimeoutMillis, delayMillis, immediateFail, layout), FACTORY);
+        return (TcpSocketManager) getManager("TCP:" + host + ':' + port, new FactoryData(
+                host, port, connectTimeoutMillis, reconnectDelayMillis, immediateFail, layout, bufferSize), FACTORY);
     }
 
     @Override
     protected void write(final byte[] bytes, final int offset, final int length, final boolean immediateFlush)  {
         if (socket == null) {
-            if (connector != null && !immediateFail) {
-                connector.latch();
+            if (reconnector != null && !immediateFail) {
+                reconnector.latch();
             }
             if (socket == null) {
                 final String msg = "Error writing to " + getName() + " socket not available";
@@ -135,11 +137,11 @@ public class TcpSocketManager extends AbstractSocketManager {
                     outputStream.flush();
                 }
             } catch (final IOException ex) {
-                if (retry && connector == null) {
-                    connector = new Reconnector(this);
-                    connector.setDaemon(true);
-                    connector.setPriority(Thread.MIN_PRIORITY);
-                    connector.start();
+                if (retry && reconnector == null) {
+                    reconnector = new Reconnector(this);
+                    reconnector.setDaemon(true);
+                    reconnector.setPriority(Thread.MIN_PRIORITY);
+                    reconnector.start();
                 }
                 final String msg = "Error writing to " + getName();
                 throw new AppenderLoggingException(msg, ex);
@@ -150,10 +152,19 @@ public class TcpSocketManager extends AbstractSocketManager {
     @Override
     protected synchronized void closeOutputStream() {
         super.closeOutputStream();
-        if (connector != null) {
-            connector.shutdown();
-            connector.interrupt();
-            connector = null;
+        if (reconnector != null) {
+            reconnector.shutdown();
+            reconnector.interrupt();
+            reconnector = null;
+        }
+        final Socket oldSocket = socket;
+        socket = null;
+        if (oldSocket != null) {
+            try {
+                oldSocket.close();
+            } catch (IOException e) {
+                LOGGER.error("Could not close socket {}", socket);
+            }
         }
     }
 
@@ -221,7 +232,7 @@ public class TcpSocketManager extends AbstractSocketManager {
 
                         setOutputStream(newOS);
                         socket = sock;
-                        connector = null;
+                        reconnector = null;
                         shutdown = true;
                     }
                     LOGGER.debug("Connection to " + host + ':' + port + " reestablished.");
@@ -256,18 +267,20 @@ public class TcpSocketManager extends AbstractSocketManager {
         private final String host;
         private final int port;
         private final int connectTimeoutMillis;
-        private final int delayMillis;
+        private final int reconnectDelayMillis;
         private final boolean immediateFail;
         private final Layout<? extends Serializable> layout;
+        private final int bufferSize;
 
-        public FactoryData(final String host, final int port, final int connectTimeoutMillis, final int delayMillis,
-                           final boolean immediateFail, final Layout<? extends Serializable> layout) {
+        public FactoryData(final String host, final int port, final int connectTimeoutMillis, final int reconnectDelayMillis,
+                           final boolean immediateFail, final Layout<? extends Serializable> layout, final int bufferSize) {
             this.host = host;
             this.port = port;
             this.connectTimeoutMillis = connectTimeoutMillis;
-            this.delayMillis = delayMillis;
+            this.reconnectDelayMillis = reconnectDelayMillis;
             this.immediateFail = immediateFail;
             this.layout = layout;
+            this.bufferSize = bufferSize;
         }
     }
 
@@ -292,16 +305,16 @@ public class TcpSocketManager extends AbstractSocketManager {
                 socket.connect(new InetSocketAddress(data.host, data.port), data.connectTimeoutMillis);
                 os = socket.getOutputStream();
                 return new TcpSocketManager(name, os, socket, inetAddress, data.host, data.port,
-                        data.connectTimeoutMillis, data.delayMillis, data.immediateFail, data.layout);
+                        data.connectTimeoutMillis, data.reconnectDelayMillis, data.immediateFail, data.layout, data.bufferSize);
             } catch (final IOException ex) {
                 LOGGER.error("TcpSocketManager (" + name + ") " + ex, ex);
                 os = new ByteArrayOutputStream();
             }
-            if (data.delayMillis == 0) {
+            if (data.reconnectDelayMillis == 0) {
                 return null;
             }
             return new TcpSocketManager(name, os, null, inetAddress, data.host, data.port, data.connectTimeoutMillis,
-                    data.delayMillis, data.immediateFail, data.layout);
+                    data.reconnectDelayMillis, data.immediateFail, data.layout, data.bufferSize);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/53e7bbc0/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 705b242..4046bc0 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
@@ -44,10 +44,12 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.net.Protocol;
+import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.Throwables;
 import org.apache.logging.log4j.test.AvailablePortFinder;
 import org.junit.After;
 import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -91,9 +93,9 @@ public class SocketAppenderTest {
     public void teardown() {
         final Map<String, Appender> map = root.getAppenders();
         for (final Map.Entry<String, Appender> entry : map.entrySet()) {
-            final Appender app = entry.getValue();
-            root.removeAppender(app);
-            app.stop();
+            final Appender appender = entry.getValue();
+            root.removeAppender(appender);
+            appender.stop();
         }
         tcpCount = 0;
         udpCount = 0;
@@ -101,7 +103,21 @@ public class SocketAppenderTest {
     }
 
     @Test
-    public void testTcpAppender() throws Exception {
+    public void testTcpAppenderDefaultBufferSize() throws Exception {
+        testTcpAppender(Constants.ENCODER_BYTE_BUFFER_SIZE);
+    }
+
+    @Test
+    public void testTcpAppenderSmallestBufferSize() throws Exception {
+        testTcpAppender(1);
+    }
+
+    @Test
+    public void testTcpAppenderLargeBufferSize() throws Exception {
+        testTcpAppender(Constants.ENCODER_BYTE_BUFFER_SIZE * 100);
+    }
+
+    private void testTcpAppender(final int bufferSize) throws Exception {
 
         // @formatter:off
         final SocketAppender appender = SocketAppender.newBuilder()
@@ -110,9 +126,11 @@ public class SocketAppenderTest {
                 .withReconnectDelayMillis(-1)
                 .withName("test")
                 .withImmediateFail(false)
+                .withBufferSize(bufferSize)
                 .build();
         // @formatter:on
         appender.start();
+        Assert.assertEquals(bufferSize, appender.getManager().getByteBuffer().capacity());
 
         // set appender on root and set level to debug
         root.addAppender(appender);
@@ -159,6 +177,7 @@ public class SocketAppenderTest {
                 .build();
         // @formatter:on
         assertNotNull(appender);
+        appender.stop();
     }
 
     @Test
@@ -242,7 +261,7 @@ public class SocketAppenderTest {
         } catch (final Exception ex) {
             // TODO: move exception to @Test(expect = Exception.class)
             // Failure is expected.
-            ex.printStackTrace();
+            // ex.printStackTrace();
         }
     }