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 2017/08/17 21:42:24 UTC
logging-log4j2 git commit: [LOG4J2-2013] SslSocketManager does not
apply SSLContext on TCP reconnect.
Repository: logging-log4j2
Updated Branches:
refs/heads/master 679e6e502 -> fb6f73d48
[LOG4J2-2013] SslSocketManager does not apply SSLContext on TCP
reconnect.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/fb6f73d4
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/fb6f73d4
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/fb6f73d4
Branch: refs/heads/master
Commit: fb6f73d48b85c8248ad7576468f77bbbb7acf670
Parents: 679e6e5
Author: Gary Gregory <ga...@gmail.com>
Authored: Thu Aug 17 15:42:13 2017 -0600
Committer: Gary Gregory <ga...@gmail.com>
Committed: Thu Aug 17 15:42:13 2017 -0600
----------------------------------------------------------------------
.../SecureSocketAppenderConnectReConnectIT.java | 7 +-
.../logging/log4j/core/net/SocketOptions.java | 33 ++++--
.../log4j/core/net/SslSocketManager.java | 102 +++++++------------
.../log4j/core/net/TcpSocketManager.java | 63 ++++++++----
src/changes/changes.xml | 3 +
5 files changed, 106 insertions(+), 102 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
----------------------------------------------------------------------
diff --git a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
index 97499b7..2a46cac 100644
--- a/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
+++ b/log4j-core-its/src/test/java/org/apache/logging/log4j/core/appender/net/SecureSocketAppenderConnectReConnectIT.java
@@ -21,6 +21,7 @@ import java.net.Socket;
import org.apache.logging.log4j.core.appender.SocketAppender;
import org.apache.logging.log4j.core.layout.JsonLayout;
+import org.apache.logging.log4j.core.net.SocketOptions;
import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
import org.apache.logging.log4j.core.net.ssl.SslConfigurationTest;
import org.apache.logging.log4j.core.net.ssl.StoreConfigurationException;
@@ -66,16 +67,18 @@ public class SecureSocketAppenderConnectReConnectIT extends AbstractSocketAppend
}
@Test
- @Ignore
+ //@Ignore
public void testConnectReConnect() throws Exception {
port = AvailablePortFinder.getNextAvailable();
// Start server
- server = TcpSocketServer.createJsonSocketServer(port);
+ server = SecureTcpSocketServer.createJsonServer(port, sslConfiguration);
startServer(200);
// Start appender
// @formatter:off
appender = SocketAppender.newBuilder()
.withPort(port)
+ .withConnectTimeoutMillis(1000)
+ .withSocketOptions(SocketOptions.newBuilder().setSoTimeout(1000))
.withReconnectDelayMillis(1000)
.withName("test")
.withLayout(JsonLayout.newBuilder().build())
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
index 62364e5..711d044 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/SocketOptions.java
@@ -167,48 +167,59 @@ public class SocketOptions implements Builder<SocketOptions>, Cloneable {
return tcpNoDelay;
}
- public void setKeepAlive(final boolean keepAlive) {
+ public SocketOptions setKeepAlive(final boolean keepAlive) {
this.keepAlive = Boolean.valueOf(keepAlive);
+ return this;
}
- public void setOobInline(final boolean oobInline) {
+ public SocketOptions setOobInline(final boolean oobInline) {
this.oobInline = Boolean.valueOf(oobInline);
+ return this;
}
- public void setPerformancePreferences(final SocketPerformancePreferences performancePreferences) {
+ public SocketOptions setPerformancePreferences(final SocketPerformancePreferences performancePreferences) {
this.performancePreferences = performancePreferences;
+ return this;
}
- public void setReceiveBufferSize(final int receiveBufferSize) {
+ public SocketOptions setReceiveBufferSize(final int receiveBufferSize) {
this.receiveBufferSize = receiveBufferSize;
+ return this;
}
- public void setReuseAddress(final boolean reuseAddress) {
+ public SocketOptions setReuseAddress(final boolean reuseAddress) {
this.reuseAddress = Boolean.valueOf(reuseAddress);
+ return this;
}
- public void setRfc1349TrafficClass(final Rfc1349TrafficClass trafficClass) {
+ public SocketOptions setRfc1349TrafficClass(final Rfc1349TrafficClass trafficClass) {
this.rfc1349TrafficClass = trafficClass;
+ return this;
}
- public void setSendBufferSize(final int sendBufferSize) {
+ public SocketOptions setSendBufferSize(final int sendBufferSize) {
this.sendBufferSize = sendBufferSize;
+ return this;
}
- public void setSoLinger(final int soLinger) {
+ public SocketOptions setSoLinger(final int soLinger) {
this.soLinger = soLinger;
+ return this;
}
- public void setSoTimeout(final int soTimeout) {
+ public SocketOptions setSoTimeout(final int soTimeout) {
this.soTimeout = soTimeout;
+ return this;
}
- public void setTcpNoDelay(final boolean tcpNoDelay) {
+ public SocketOptions setTcpNoDelay(final boolean tcpNoDelay) {
this.tcpNoDelay = Boolean.valueOf(tcpNoDelay);
+ return this;
}
- public void setTrafficClass(final int trafficClass) {
+ public SocketOptions setTrafficClass(final int trafficClass) {
this.trafficClass = trafficClass;
+ return this;
}
@Override
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/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 6d0b872..2a4593d 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
@@ -16,23 +16,18 @@
*/
package org.apache.logging.log4j.core.net;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
-import java.net.UnknownHostException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
-import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.appender.ManagerFactory;
import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
-import org.apache.logging.log4j.core.util.Closer;
import org.apache.logging.log4j.util.Strings;
/**
@@ -95,13 +90,20 @@ public class SslSocketManager extends TcpSocketManager {
protected SslConfiguration sslConfiguration;
public SslFactoryData(final SslConfiguration sslConfiguration, final String host, final int port,
- final int connectTimeoutMillis, final int reconnectDelayMillis, final int delayMillis,
- final boolean immediateFail, final Layout<? extends Serializable> layout, final int bufferSize,
- final SocketOptions socketOptions) {
+ final int connectTimeoutMillis, final int reconnectDelayMillis, final boolean immediateFail,
+ final Layout<? extends Serializable> layout, final int bufferSize, final SocketOptions socketOptions) {
super(host, port, connectTimeoutMillis, reconnectDelayMillis, immediateFail, layout, bufferSize,
socketOptions);
this.sslConfiguration = sslConfiguration;
}
+
+ @Override
+ public String toString() {
+ return "SslFactoryData [sslConfiguration=" + sslConfiguration + ", host=" + host + ", port=" + port
+ + ", connectTimeoutMillis=" + connectTimeoutMillis + ", reconnectDelayMillis="
+ + reconnectDelayMillis + ", immediateFail=" + immediateFail + ", layout=" + layout + ", bufferSize="
+ + bufferSize + ", socketOptions=" + socketOptions + "]";
+ }
}
/**
@@ -126,8 +128,9 @@ public class SslSocketManager extends TcpSocketManager {
if (reconnectDelayMillis == 0) {
reconnectDelayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
}
- return (SslSocketManager) getManager("TLS:" + host + ':' + port, new SslFactoryData(sslConfig, host, port,
- connectTimeoutMillis, 0, reconnectDelayMillis, immediateFail, layout, bufferSize, socketOptions), FACTORY);
+ final String name = "TLS:" + host + ':' + port;
+ return (SslSocketManager) getManager(name, new SslFactoryData(sslConfig, host, port, connectTimeoutMillis,
+ reconnectDelayMillis, immediateFail, layout, bufferSize, socketOptions), FACTORY);
}
@Override
@@ -152,73 +155,36 @@ public class SslSocketManager extends TcpSocketManager {
}
- private static class SslSocketManagerFactory implements ManagerFactory<SslSocketManager, SslFactoryData> {
-
- private static class TlsSocketManagerFactoryException extends Exception {
+ private static class SslSocketManagerFactory extends TcpSocketManagerFactory<SslSocketManager, SslFactoryData> {
- private static final long serialVersionUID = 1L;
- }
-
- @SuppressWarnings("resource")
@Override
- public SslSocketManager createManager(final String name, final SslFactoryData data) {
- InetAddress inetAddress = null;
- OutputStream os = null;
- Socket socket = null;
- try {
- inetAddress = resolveAddress(data.host);
- socket = createSocket(data);
- os = socket.getOutputStream();
- checkDelay(data.reconnectDelayMillis, os);
- } catch (final IOException e) {
- LOGGER.error("SslSocketManager ({})", name, e);
- os = new ByteArrayOutputStream();
- } catch (final TlsSocketManagerFactoryException e) {
- LOGGER.catching(Level.DEBUG, e);
- Closer.closeSilently(socket);
- return null;
- }
+ SslSocketManager createManager(final String name, OutputStream os, Socket socket, InetAddress inetAddress,
+ final SslFactoryData data) {
return new SslSocketManager(name, os, socket, data.sslConfiguration, inetAddress, data.host, data.port,
data.connectTimeoutMillis, data.reconnectDelayMillis, data.immediateFail, data.layout, data.bufferSize,
data.socketOptions);
}
-
- private InetAddress resolveAddress(final String hostName) throws TlsSocketManagerFactoryException {
- InetAddress address;
-
- try {
- address = InetAddress.getByName(hostName);
- } catch (final UnknownHostException ex) {
- LOGGER.error("Could not find address of {}", hostName, ex);
- throw new TlsSocketManagerFactoryException();
- }
-
- return address;
+
+ @Override
+ Socket createSocket(final SslFactoryData data) throws IOException {
+ return SslSocketManager.createSocket(data.host, data.port, data.connectTimeoutMillis, data.sslConfiguration,
+ data.socketOptions);
}
+ }
- private void checkDelay(final int delay, final OutputStream os) throws TlsSocketManagerFactoryException {
- if (delay == 0 && os == null) {
- throw new TlsSocketManagerFactoryException();
- }
+ static Socket createSocket(final String host, int port, int connectTimeoutMillis,
+ final SslConfiguration sslConfiguration, SocketOptions socketOptions) throws IOException {
+ final SSLSocketFactory socketFactory = createSslSocketFactory(sslConfiguration);
+ final SSLSocket socket = (SSLSocket) socketFactory.createSocket();
+ if (socketOptions != null) {
+ // Not sure which options must be applied before or after the connect() call.
+ socketOptions.apply(socket);
}
-
- private Socket createSocket(final SslFactoryData data) throws IOException {
- SSLSocketFactory socketFactory;
- SSLSocket socket;
-
- socketFactory = createSslSocketFactory(data.sslConfiguration);
- socket = (SSLSocket) socketFactory.createSocket();
- final SocketOptions socketOptions = data.socketOptions;
- if (socketOptions != null) {
- // Not sure which options must be applied before or after the connect() call.
- socketOptions.apply(socket);
- }
- socket.connect(new InetSocketAddress(data.host, data.port), data.connectTimeoutMillis);
- if (socketOptions != null) {
- // Not sure which options must be applied before or after the connect() call.
- socketOptions.apply(socket);
- }
- return socket;
+ socket.connect(new InetSocketAddress(host, port), connectTimeoutMillis);
+ if (socketOptions != null) {
+ // Not sure which options must be applied before or after the connect() call.
+ socketOptions.apply(socket);
}
+ return socket;
}
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/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 95b9bee..15d2bc8 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
@@ -33,6 +33,8 @@ import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.appender.AppenderLoggingException;
import org.apache.logging.log4j.core.appender.ManagerFactory;
import org.apache.logging.log4j.core.appender.OutputStreamManager;
+import org.apache.logging.log4j.core.net.TcpSocketManager.FactoryData;
+import org.apache.logging.log4j.core.net.TcpSocketManager.TcpSocketManagerFactory;
import org.apache.logging.log4j.core.util.Closer;
import org.apache.logging.log4j.core.util.Log4jThread;
import org.apache.logging.log4j.core.util.NullOutputStream;
@@ -51,7 +53,7 @@ public class TcpSocketManager extends AbstractSocketManager {
*/
private static final int DEFAULT_PORT = 4560;
- private static final TcpSocketManagerFactory FACTORY = new TcpSocketManagerFactory();
+ private static final TcpSocketManagerFactory<TcpSocketManager, FactoryData> FACTORY = new TcpSocketManagerFactory<>();
private final int reconnectionDelayMillis;
@@ -341,7 +343,7 @@ public class TcpSocketManager extends AbstractSocketManager {
}
void reconnect() throws IOException {
- final Socket sock = createSocket(inetAddress, port);
+ final Socket sock = createSocket(inetAddress.getHostName(), port);
@SuppressWarnings("resource") // newOS is managed by the enclosing Manager.
final OutputStream newOS = sock.getOutputStream();
synchronized (owner) {
@@ -367,14 +369,21 @@ public class TcpSocketManager extends AbstractSocketManager {
return recon;
}
- protected Socket createSocket(final InetAddress host, final int port) throws IOException {
- return createSocket(host.getHostName(), port);
+ protected Socket createSocket(final String host, final int port) throws IOException {
+ return createSocket(host, port, socketOptions, connectTimeoutMillis);
}
- protected Socket createSocket(final String host, final int port) throws IOException {
+ protected static Socket createSocket(final String host, final int port, final SocketOptions socketOptions,
+ final int connectTimeoutMillis) throws IOException {
+ LOGGER.debug("Creating socket {}:{}", host, port);
final Socket newSocket = new Socket();
+ if (socketOptions != null) {
+ // Not sure which options must be applied before or after the connect() call.
+ socketOptions.apply(newSocket);
+ }
newSocket.connect(new InetSocketAddress(host, port), connectTimeoutMillis);
if (socketOptions != null) {
+ // Not sure which options must be applied before or after the connect() call.
socketOptions.apply(newSocket);
}
return newSocket;
@@ -416,13 +425,18 @@ public class TcpSocketManager extends AbstractSocketManager {
/**
* Factory to create a TcpSocketManager.
+ *
+ * @param <M>
+ * The manager type.
+ * @param <T>
+ * The factory data type.
*/
- protected static class TcpSocketManagerFactory implements ManagerFactory<TcpSocketManager, FactoryData> {
+ protected static class TcpSocketManagerFactory<M extends TcpSocketManager, T extends FactoryData>
+ implements ManagerFactory<M, T> {
@SuppressWarnings("resource")
@Override
- public TcpSocketManager createManager(final String name, final FactoryData data) {
-
+ public M createManager(final String name, final T data) {
InetAddress inetAddress;
OutputStream os;
try {
@@ -436,9 +450,7 @@ public class TcpSocketManager extends AbstractSocketManager {
// LOG4J2-1042
socket = createSocket(data);
os = socket.getOutputStream();
- return new TcpSocketManager(name, os, socket, inetAddress, data.host, data.port,
- data.connectTimeoutMillis, data.reconnectDelayMillis, data.immediateFail, data.layout,
- data.bufferSize, data.socketOptions);
+ return createManager(name, os, socket, inetAddress, data);
} catch (final IOException ex) {
LOGGER.error("TcpSocketManager ({}) caught exception and will continue:", name, ex, ex);
os = NullOutputStream.getInstance();
@@ -447,18 +459,18 @@ public class TcpSocketManager extends AbstractSocketManager {
Closer.closeSilently(socket);
return null;
}
- return new TcpSocketManager(name, os, null, inetAddress, data.host, data.port, data.connectTimeoutMillis,
- data.reconnectDelayMillis, data.immediateFail, data.layout, data.bufferSize, data.socketOptions);
+ return createManager(name, os, null, inetAddress, data);
}
- static Socket createSocket(final FactoryData data) throws IOException, SocketException {
- final Socket socket = new Socket();
- socket.connect(new InetSocketAddress(data.host, data.port), data.connectTimeoutMillis);
- final SocketOptions socketOptions = data.socketOptions;
- if (socketOptions != null) {
- socketOptions.apply(socket);
- }
- return socket;
+ @SuppressWarnings("unchecked")
+ M createManager(final String name, OutputStream os, Socket socket, InetAddress inetAddress, final T data) {
+ return (M) new TcpSocketManager(name, os, socket, inetAddress, data.host, data.port,
+ data.connectTimeoutMillis, data.reconnectDelayMillis, data.immediateFail, data.layout,
+ data.bufferSize, data.socketOptions);
+ }
+
+ Socket createSocket(final T data) throws IOException {
+ return TcpSocketManager.createSocket(data.host, data.port, data.socketOptions, data.connectTimeoutMillis);
}
}
@@ -481,4 +493,13 @@ public class TcpSocketManager extends AbstractSocketManager {
return reconnectionDelayMillis;
}
+ @Override
+ public String toString() {
+ return "TcpSocketManager [reconnectionDelayMillis=" + reconnectionDelayMillis + ", reconnector=" + reconnector
+ + ", socket=" + socket + ", socketOptions=" + socketOptions + ", retry=" + retry + ", immediateFail="
+ + immediateFail + ", connectTimeoutMillis=" + connectTimeoutMillis + ", inetAddress=" + inetAddress
+ + ", host=" + host + ", port=" + port + ", layout=" + layout + ", byteBuffer=" + byteBuffer + ", count="
+ + count + "]";
+ }
+
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/fb6f73d4/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 69c8b53..70e88d1 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -37,6 +37,9 @@
<action issue="LOG4J2-2018" dev="rpopma" type="fix">
Fix incorrect documentation for LoggerNameLevelRewritePolicy.
</action>
+ <action issue="LOG4J2-2013" dev="ggregory" type="fix" due-to="Taylor Patton, Gary Gregory">
+ SslSocketManager does not apply SSLContext on TCP reconnect.
+ </action>
<action issue="LOG4J2-2015" dev="ggregory" type="update">
Allow KeyStoreConfiguration and TrustStoreConfiguration to find files as resources.
</action>