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 <ggreg...@apache.org> Authored: Thu Sep 1 14:16:03 2016 -0700 Committer: ggregory <ggreg...@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(); } }