- [LOG4J2-895] Specify the SyslogAppender connect timeout value as part
- [LOG4J2-899] Specify the SocketAppender connect timeout value as part
of the configuration.

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

Branch: refs/heads/master
Commit: 3cdbbeddf19137d20fa6527d6620e88afcecb7f9
Parents: d2c5264
Author: Gary Gregory <[email protected]>
Authored: Tue Nov 18 00:59:17 2014 -0500
Committer: Gary Gregory <[email protected]>
Committed: Tue Nov 18 00:59:17 2014 -0500

----------------------------------------------------------------------
 .../log4j/core/appender/SocketAppender.java     | 21 +++++-----
 .../log4j/core/appender/SyslogAppender.java     | 10 +++--
 .../log4j/core/net/SslSocketManager.java        | 39 ++++++++++--------
 .../log4j/core/net/TcpSocketManager.java        | 42 ++++++++++++++------
 .../log4j/core/appender/SocketAppenderTest.java | 20 +++++-----
 .../log4j/core/appender/SyslogAppenderTest.java |  6 +--
 .../core/appender/TlsSyslogAppenderTest.java    |  6 +--
 .../net/server/AbstractSocketServerTest.java    |  4 +-
 .../core/net/server/SslXmlSocketServerTest.java |  4 +-
 src/changes/changes.xml                         | 10 ++++-
 src/site/xdoc/manual/appenders.xml              | 12 ++++++
 11 files changed, 109 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/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 49a9bcb..2c59ad3 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
@@ -83,6 +83,7 @@ public class SocketAppender extends 
AbstractOutputStreamAppender<AbstractSocketM
      *        The Protocol to use.
      * @param sslConfig
      *        The SSL configuration file for TCP/SSL, ignored for UPD.
+     * @param connectTimeoutMillis TODO
      * @param delayMillis
      *        The interval in which failed writes should be retried.
      * @param immediateFail
@@ -111,6 +112,7 @@ public class SocketAppender extends 
AbstractOutputStreamAppender<AbstractSocketM
             @PluginAttribute("port") final String portNum,
             @PluginAttribute("protocol") final String protocolStr,
             @PluginElement("SSL") final SslConfiguration sslConfig,
+            @PluginAttribute(value = "connectTimeoutMillis", defaultInt = 0) 
final int connectTimeoutMillis,
             @PluginAliases("reconnectionDelay") // deprecated
             @PluginAttribute("reconnectionDelayMillis") final String 
delayMillis,
             @PluginAttribute("immediateFail") final String immediateFail,
@@ -118,9 +120,8 @@ public class SocketAppender extends 
AbstractOutputStreamAppender<AbstractSocketM
             @PluginAttribute("immediateFlush") final String immediateFlush,
             @PluginAttribute("ignoreExceptions") final String ignore,
             @PluginElement("Layout") Layout<? extends Serializable> layout,
-            @PluginElement("Filter") final Filter filter,
-            @PluginAttribute("advertise") final String advertise, 
-            @PluginConfiguration final Configuration config) {
+            @PluginElement("Filter") final Filter filter, 
+            @PluginAttribute("advertise") final String advertise, 
@PluginConfiguration final Configuration config) {
             // @formatter:on
         boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
         final boolean isAdvertise = Boolean.parseBoolean(advertise);
@@ -143,8 +144,8 @@ public class SocketAppender extends 
AbstractOutputStreamAppender<AbstractSocketM
             isFlush = true;
         }
 
-        final AbstractSocketManager manager = createSocketManager(name, 
protocol, host, port, sslConfig,
-                reconnectDelayMillis, fail, layout);
+        final AbstractSocketManager manager = createSocketManager(name, 
protocol, host, port, connectTimeoutMillis,
+                sslConfig, reconnectDelayMillis, fail, layout);
 
         return new SocketAppender(name, layout, filter, manager, 
ignoreExceptions, isFlush,
                 isAdvertise ? config.getAdvertiser() : null);
@@ -157,8 +158,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 SslConfiguration sslConfig, final int 
delayMillis, final boolean immediateFail,
-            final Layout<? extends Serializable> layout) {
+            final int port, int connectTimeoutMillis, final SslConfiguration 
sslConfig, final int delayMillis,
+            final boolean immediateFail, final Layout<? extends Serializable> 
layout) {
         if (protocol == Protocol.TCP && sslConfig != null) {
             // Upgrade TCP to SSL if an SSL config is specified.
             protocol = Protocol.SSL;
@@ -168,11 +169,13 @@ public class SocketAppender extends 
AbstractOutputStreamAppender<AbstractSocketM
         }
         switch (protocol) {
         case TCP:
-            return TcpSocketManager.getSocketManager(host, port, delayMillis, 
immediateFail, layout);
+            return TcpSocketManager.getSocketManager(host, port, 
connectTimeoutMillis, delayMillis, immediateFail,
+                    layout);
         case UDP:
             return DatagramSocketManager.getSocketManager(host, port, layout);
         case SSL:
-            return SslSocketManager.getSocketManager(sslConfig, host, port, 
delayMillis, immediateFail, layout);
+            return SslSocketManager.getSocketManager(sslConfig, host, port, 
connectTimeoutMillis, delayMillis,
+                    immediateFail, layout);
         default:
             throw new IllegalArgumentException(protocol.toString());
         }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/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 38201ab..391accd 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
@@ -60,6 +60,7 @@ public class SyslogAppender extends SocketAppender {
      * @param port The port to connect to on the target host.
      * @param protocolStr The Protocol to use.
      * @param sslConfig TODO
+     * @param connectTimeoutMillis TODO
      * @param reconnectionDelayMillis The interval in which failed writes 
should be retried.
      * @param immediateFail True if the write should fail if no socket is 
immediately available.
      * @param name The name of the Appender.
@@ -89,6 +90,7 @@ 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
@@ -98,6 +100,7 @@ public class SyslogAppender extends SocketAppender {
             @PluginAttribute(value = "port", defaultInt = 0) final int port,
             @PluginAttribute("protocol") final String protocolStr,
             @PluginElement("SSL") final SslConfiguration sslConfig,
+            @PluginAttribute(value = "connectTimeoutMillis", defaultInt = 0) 
final int connectTimeoutMillis,
             @PluginAliases("reconnectionDelay") // deprecated
             @PluginAttribute(value = "reconnectionDelayMillis", defaultInt = 
0) final int reconnectionDelayMillis,
             @PluginAttribute(value = "immediateFail", defaultBoolean = true) 
final boolean immediateFail,
@@ -123,8 +126,7 @@ public class SyslogAppender extends SocketAppender {
             @PluginConfiguration final Configuration config,
             @PluginAttribute(value = "charset", defaultString = "UTF-8") final 
Charset charsetName,
             @PluginAttribute("exceptionPattern") final String exceptionPattern,
-            @PluginElement("LoggerFields") final LoggerFields[] loggerFields,
-            @PluginAttribute(value = "advertise", defaultBoolean = false) 
final boolean advertise) {
+            @PluginElement("LoggerFields") final LoggerFields[] loggerFields, 
@PluginAttribute(value = "advertise", defaultBoolean = false) final boolean 
advertise) {
         // @formatter:on
 
         // TODO: add Protocol to TypeConverters
@@ -140,8 +142,8 @@ public class SyslogAppender extends SocketAppender {
             LOGGER.error("No name provided for SyslogAppender");
             return null;
         }
-        final AbstractSocketManager manager = createSocketManager(name, 
protocol, host, port, sslConfig,
-            reconnectionDelayMillis, immediateFail, layout);
+        final AbstractSocketManager manager = createSocketManager(name, 
protocol, host, port, connectTimeoutMillis,
+                sslConfig, reconnectionDelayMillis, immediateFail, layout);
 
         return new SyslogAppender(name, layout, filter, ignoreExceptions, 
immediateFlush, manager,
                 advertise ? config.getAdvertiser() : null);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/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 d9a43db..87e7867 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
@@ -21,6 +21,7 @@ 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;
 
@@ -50,13 +51,16 @@ public class SslSocketManager extends TcpSocketManager {
      * @param inetAddress          The Internet address of the host.
      * @param host          The name of the host.
      * @param port          The port number on the host.
+     * @param connectTimeoutMillis the connect timeout in milliseconds.
      * @param delay         Reconnection interval.
      * @param immediateFail
      * @param layout        The Layout.
      */
-    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 
delay, final boolean immediateFail, final Layout<? extends Serializable> 
layout) {
-        super(name, os, sock, inetAddress, host, port, delay, immediateFail, 
layout);
+    public SslSocketManager(final String name, final OutputStream os, final 
Socket sock,
+            final SslConfiguration sslConfig, final InetAddress inetAddress, 
final String host, final int port,
+            int connectTimeoutMillis, final int delay, final boolean 
immediateFail,
+            final Layout<? extends Serializable> layout) {
+        super(name, os, sock, inetAddress, host, port, connectTimeoutMillis, 
delay, immediateFail, layout);
         this.sslConfig = sslConfig;
     }
 
@@ -64,14 +68,17 @@ public class SslSocketManager extends TcpSocketManager {
         protected SslConfiguration sslConfig;
         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;
 
-        public SslFactoryData(final SslConfiguration sslConfig, final String 
host, final int port, final int delayMillis, final boolean immediateFail,
-                              final Layout<? extends Serializable> layout) {
+        public SslFactoryData(final SslConfiguration sslConfig, final String 
host, final int port,
+                int connectTimeoutMillis, final int delayMillis, final boolean 
immediateFail,
+                final Layout<? extends Serializable> layout) {
             this.host = host;
             this.port = port;
+            this.connectTimeoutMillis = connectTimeoutMillis;
             this.delayMillis = delayMillis;
             this.immediateFail = immediateFail;
             this.layout = layout;
@@ -80,7 +87,8 @@ public class SslSocketManager extends TcpSocketManager {
     }
 
     public static SslSocketManager getSocketManager(final SslConfiguration 
sslConfig, final String host, int port,
-                                                    int delayMillis, final 
boolean immediateFail, final Layout<? extends Serializable> layout ) {
+            int connectTimeoutMillis, int delayMillis, final boolean 
immediateFail,
+            final Layout<? extends Serializable> layout) {
         if (Strings.isEmpty(host)) {
             throw new IllegalArgumentException("A host name is required");
         }
@@ -90,14 +98,17 @@ public class SslSocketManager extends TcpSocketManager {
         if (delayMillis == 0) {
             delayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
         }
-        return (SslSocketManager) getManager("TLS:" + host + ':' + port,
-                new SslFactoryData(sslConfig, host, port, delayMillis, 
immediateFail, layout), FACTORY);
+        return (SslSocketManager) getManager("TLS:" + host + ':' + port, new 
SslFactoryData(sslConfig, host, port,
+                connectTimeoutMillis, delayMillis, immediateFail, layout), 
FACTORY);
     }
 
     @Override
     protected Socket createSocket(final String host, final int port) throws 
IOException {
         final SSLSocketFactory socketFactory = 
createSslSocketFactory(sslConfig);
-        return socketFactory.createSocket(host, port);
+        final InetSocketAddress address = new InetSocketAddress(host, port);
+        final Socket newSocket = socketFactory.createSocket();
+        newSocket.connect(address, getConnectTimeoutMillis());
+        return newSocket;
     }
 
     private static SSLSocketFactory createSslSocketFactory(final 
SslConfiguration sslConf) {
@@ -140,7 +151,8 @@ public class SslSocketManager extends TcpSocketManager {
                 LOGGER.catching(Level.DEBUG, e);
                 return null;
             }
-            return createManager(name, os, socket, data.sslConfig, 
inetAddress, data.host, data.port, data.delayMillis, data.immediateFail, 
data.layout);
+            return new SslSocketManager(name, os, socket, data.sslConfig, 
inetAddress, data.host, data.port, 0,
+                    data.delayMillis, data.immediateFail, data.layout);
         }
 
         private InetAddress resolveAddress(final String hostName) throws 
TlsSocketManagerFactoryException {
@@ -170,12 +182,5 @@ public class SslSocketManager extends TcpSocketManager {
             socket = (SSLSocket) socketFactory.createSocket(data.host, 
data.port);
             return socket;
         }
-
-        private SslSocketManager createManager(final String name, final 
OutputStream os, final Socket socket,
-                final SslConfiguration sslConfig, final InetAddress 
inetAddress, final String host, final int port,
-                final int delay, final boolean immediateFail, final Layout<? 
extends Serializable> layout) {
-            return new SslSocketManager(name, os, socket, sslConfig, 
inetAddress, host, port, delay, immediateFail,
-                    layout);
-        }
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/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 c5c8397..9ab9f5f 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
@@ -22,6 +22,7 @@ import java.io.OutputStream;
 import java.io.Serializable;
 import java.net.ConnectException;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.Socket;
 import java.net.UnknownHostException;
 import java.util.HashMap;
@@ -58,6 +59,8 @@ public class TcpSocketManager extends AbstractSocketManager {
     private final boolean retry;
 
     private final boolean immediateFail;
+    
+    private final int connectTimeoutMillis;
 
     /**
      * The Constructor.
@@ -67,14 +70,16 @@ public class TcpSocketManager extends AbstractSocketManager 
{
      * @param inetAddress The Internet address of the host.
      * @param host The name of the host.
      * @param port The port number on the host.
+     * @param connectTimeoutMillis the connect timeout in milliseconds.
      * @param delay Reconnection interval.
      * @param immediateFail
      * @param layout The Layout.
      */
     public TcpSocketManager(final String name, final OutputStream os, final 
Socket sock, final InetAddress inetAddress,
-                            final String host, final int port, final int 
delay, final boolean immediateFail,
-                            final Layout<? extends Serializable> layout) {
+                            final String host, final int port, int 
connectTimeoutMillis, final int delay,
+                            final boolean immediateFail, final Layout<? 
extends Serializable> layout) {
         super(name, os, inetAddress, host, port, layout);
+        this.connectTimeoutMillis = connectTimeoutMillis;
         this.reconnectionDelay = delay;
         this.socket = sock;
         this.immediateFail = immediateFail;
@@ -91,11 +96,12 @@ public class TcpSocketManager extends AbstractSocketManager 
{
      * Obtain a TcpSocketManager.
      * @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.
      * @return A TcpSocketManager.
      */
-    public static TcpSocketManager getSocketManager(final String host, int 
port, int delayMillis,
-                                                    final boolean 
immediateFail, final Layout<? extends Serializable> layout ) {
+    public static TcpSocketManager getSocketManager(final String host, int 
port, int connectTimeoutMillis,
+            int delayMillis, final boolean immediateFail, final Layout<? 
extends Serializable> layout) {
         if (Strings.isEmpty(host)) {
             throw new IllegalArgumentException("A host name is required");
         }
@@ -105,8 +111,8 @@ public class TcpSocketManager extends AbstractSocketManager 
{
         if (delayMillis == 0) {
             delayMillis = DEFAULT_RECONNECTION_DELAY_MILLIS;
         }
-        return (TcpSocketManager) getManager("TCP:" + host + ':' + port,
-            new FactoryData(host, port, delayMillis, immediateFail, layout), 
FACTORY);
+        return (TcpSocketManager) getManager("TCP:" + host + ':' + port, new 
FactoryData(host, port,
+                connectTimeoutMillis, delayMillis, immediateFail, layout), 
FACTORY);
     }
 
     @Override
@@ -146,6 +152,10 @@ public class TcpSocketManager extends 
AbstractSocketManager {
         }
     }
 
+    public int getConnectTimeoutMillis() {
+        return connectTimeoutMillis;
+    }
+
     /**
      * Gets this TcpSocketManager's content format. Specified by:
      * <ul>
@@ -228,7 +238,10 @@ public class TcpSocketManager extends 
AbstractSocketManager {
     }
 
     protected Socket createSocket(final String host, final int port) throws 
IOException {
-        return new Socket(host, port);
+        final InetSocketAddress address = new InetSocketAddress(host, port);
+        final Socket newSocket = new Socket();
+        newSocket.connect(address, connectTimeoutMillis);
+        return newSocket;
     }
 
     /**
@@ -237,14 +250,16 @@ public class TcpSocketManager extends 
AbstractSocketManager {
     private static class FactoryData {
         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;
 
-        public FactoryData(final String host, final int port, final int 
delayMillis, final boolean immediateFail,
-                           final Layout<? extends Serializable> layout) {
+        public FactoryData(final String host, final int port, int 
connectTimeoutMillis, final int delayMillis,
+                           final boolean immediateFail, final Layout<? extends 
Serializable> layout) {
             this.host = host;
             this.port = port;
+            this.connectTimeoutMillis = connectTimeoutMillis;
             this.delayMillis = delayMillis;
             this.immediateFail = immediateFail;
             this.layout = layout;
@@ -269,8 +284,8 @@ public class TcpSocketManager extends AbstractSocketManager 
{
             try {
                 final Socket socket = new Socket(data.host, data.port);
                 os = socket.getOutputStream();
-                return new TcpSocketManager(name, os, socket, inetAddress, 
data.host, data.port, data.delayMillis,
-                    data.immediateFail, data.layout);
+                return new TcpSocketManager(name, os, socket, inetAddress, 
data.host, data.port,
+                        data.connectTimeoutMillis, data.delayMillis, 
data.immediateFail, data.layout);
             } catch (final IOException ex) {
                 LOGGER.error("TcpSocketManager (" + name + ") " + ex);
                 os = new ByteArrayOutputStream();
@@ -278,8 +293,9 @@ public class TcpSocketManager extends AbstractSocketManager 
{
             if (data.delayMillis == 0) {
                 return null;
             }
-            return new TcpSocketManager(name, os, null, inetAddress, 
data.host, data.port, data.delayMillis, data.immediateFail,
-                data.layout);
+            return new TcpSocketManager(name, os, null, inetAddress, 
data.host, data.port, data.connectTimeoutMillis,
+                    data.delayMillis, data.immediateFail, data.layout);
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/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 c11020f..bd6fd61 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
@@ -104,8 +104,8 @@ public class SocketAppenderTest {
     @Test
     public void testTcpAppender() throws Exception {
 
-        final SocketAppender appender = 
SocketAppender.createAppender("localhost", PORT, "tcp", null, "-1", "false",
-                "Test", null, null, null, null, null, null);
+        final SocketAppender appender = 
SocketAppender.createAppender("localhost", PORT, "tcp", null, 0, "-1",
+                "false", "Test", null, null, null, null, null, null);
         appender.start();
 
         // set appender on root and set level to debug
@@ -144,16 +144,16 @@ public class SocketAppenderTest {
     @Test
     public void testDefaultProtocol() throws Exception {
 
-        final SocketAppender appender = 
SocketAppender.createAppender("localhost", PORT, null, null, "-1", "false",
-                "Test", null, null, null, null, null, null);
+        final SocketAppender appender = 
SocketAppender.createAppender("localhost", PORT, null, null, 0, "-1",
+                "false", "Test", null, null, null, null, null, null);
         assertNotNull(appender);
     }
 
     @Test
     public void testUdpAppender() throws Exception {
 
-        final SocketAppender appender = 
SocketAppender.createAppender("localhost", PORT, "udp", null, "-1", "false",
-                "Test", null, null, null, null, null, null);
+        final SocketAppender appender = 
SocketAppender.createAppender("localhost", PORT, "udp", null, 0, "-1",
+                "false", "Test", null, null, null, null, null, null);
         appender.start();
 
         // set appender on root and set level to debug
@@ -170,8 +170,8 @@ public class SocketAppenderTest {
     @Test
     public void testTcpAppenderDeadlock() throws Exception {
 
-        final SocketAppender appender = 
SocketAppender.createAppender("localhost", DYN_PORT, "tcp", null, "100",
-                "false", "Test", null, null, null, null, null, null);
+        final SocketAppender appender = 
SocketAppender.createAppender("localhost", DYN_PORT, "tcp", null, 0,
+                "100", "false", "Test", null, null, null, null, null, null);
         appender.start();
         // set appender on root and set level to debug
         root.addAppender(appender);
@@ -189,8 +189,8 @@ public class SocketAppenderTest {
     @Test
     public void testTcpAppenderNoWait() throws Exception {
 
-        final SocketAppender appender = 
SocketAppender.createAppender("localhost", ERROR_PORT, "tcp", null, "100",
-                "true", "Test", null, "false", null, null, null, null);
+        final SocketAppender appender = 
SocketAppender.createAppender("localhost", ERROR_PORT, "tcp", null, 0,
+                "100", "true", "Test", null, "false", null, null, null, null);
         appender.start();
         // set appender on root and set level to debug
         root.addAppender(appender);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
index 3ca7b91..03b5807 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
@@ -107,8 +107,8 @@ public class SyslogAppenderTest extends 
SyslogAppenderTestBase {
     }
 
     private SyslogAppender createAppender(final String protocol, final String 
format) {
-        return SyslogAppender.createAppender("localhost", PORTNUM, protocol, 
null, -1, true, "Test", true, false,
-            Facility.LOCAL0, "Audit", 18060, true, "RequestContext", null, 
null, includeNewLine, null, "TestApp",
-            "Test", null, "ipAddress,loginId", null, format, null, null, null, 
null, null, false);
+        return SyslogAppender.createAppender("localhost", PORTNUM, protocol, 
null, 0, -1, true, "Test", true,
+            false, Facility.LOCAL0, "Audit", 18060, true, "RequestContext", 
null, null, includeNewLine, null,
+            "TestApp", "Test", null, "ipAddress,loginId", null, format, null, 
null, null, null, null, false);
     }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
index 198f261..27977f5 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
@@ -95,9 +95,9 @@ public class TlsSyslogAppenderTest extends SyslogAppenderTest 
{
             format = "RFC5424";
         }
 
-        return SyslogAppender.createAppender("localhost", PORTNUM, "SSL", 
sslConfig, -1, true, "Test", true, false,
-            Facility.LOCAL0, "Audit", 18060, true, "RequestContext", null, 
null, includeNewLine, null, "TestApp",
-            "Test", null, "ipAddress,loginId", null, format, null, null, null, 
null, null, false);
+        return SyslogAppender.createAppender("localhost", PORTNUM, "SSL", 
sslConfig, 0, -1, true, "Test", true,
+            false, Facility.LOCAL0, "Audit", 18060, true, "RequestContext", 
null, null, includeNewLine, null,
+            "TestApp", "Test", null, "ipAddress,loginId", null, format, null, 
null, null, null, null, false);
     }
 
     private void initTlsTestEnvironment(final int numberOfMessages, final 
TlsSyslogMessageFormat messageFormat) throws IOException {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/AbstractSocketServerTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/AbstractSocketServerTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/AbstractSocketServerTest.java
index 680ac37..f97b584 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/AbstractSocketServerTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/AbstractSocketServerTest.java
@@ -212,8 +212,8 @@ public abstract class AbstractSocketServerTest {
 
     protected SocketAppender createSocketAppender(final Filter socketFilter,
             final Layout<? extends Serializable> socketLayout) {
-        return SocketAppender.createAppender("localhost", this.port, 
this.protocol, null, "-1", null, "Test",
-                "true", "false", socketLayout, socketFilter, null, null);
+        return SocketAppender.createAppender("localhost", this.port, 
this.protocol, null, 0, "-1", null,
+                "Test", "true", "false", socketLayout, socketFilter, null, 
null);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/SslXmlSocketServerTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/SslXmlSocketServerTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/SslXmlSocketServerTest.java
index 4b4ee31..35c0e8b 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/SslXmlSocketServerTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/server/SslXmlSocketServerTest.java
@@ -51,8 +51,8 @@ public class SslXmlSocketServerTest extends 
AbstractSocketServerTest {
     @Override
     protected SocketAppender createSocketAppender(final Filter socketFilter,
             final Layout<? extends Serializable> socketLayout) {
-        return SocketAppender.createAppender("localhost", this.port, 
this.protocol, sslConfig, "-1", null, "Test",
-                "true", "false", socketLayout, socketFilter, null, null);
+        return SocketAppender.createAppender("localhost", this.port, 
this.protocol, sslConfig, 0, "-1", null,
+                "Test", "true", "false", socketLayout, socketFilter, null, 
null);
     }
 
     @BeforeClass

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 47e9dca..85272e4 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -23,12 +23,18 @@
     <title>Changes</title>
   </properties>
   <body>
-    <release version="2.1.1" date="201?-??-??" description="GA Release 2.2">
+    <release version="2.2" date="201?-??-??" description="GA Release 2.2">
+      <action issue="LOG4J2-895" dev="ggregory" type="add">
+        Specify the SyslogAppender connect timeout value as part of the 
configuration.
+      </action>
+      <action issue="LOG4J2-899" dev="ggregory" type="add">
+        Specify the SocketAppender connect timeout value as part of the 
configuration.
+      </action>
       <action issue="LOG4J2-893" dev="ggregory" type="fix">
         NullPointerException on filter when mapping JUL to Log4j2.
       </action>
       <action issue="LOG4J2-892" dev="ggregory" type="fix">
-        JUL adapter does not map Log4j'2 FATAL level to JUL level.
+        JUL adapter does not map Log4j'2 FATAL level to a JUL level.
       </action>
       <action issue="LOG4J2-881" dev="ggregory" type="fix" due-to="Mariano 
Gonzalez">
         AbstractLifecycle should not implement equals() and hashCode().

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3cdbbedd/src/site/xdoc/manual/appenders.xml
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/appenders.xml 
b/src/site/xdoc/manual/appenders.xml
index c62c75d..abe0c9a 100644
--- a/src/site/xdoc/manual/appenders.xml
+++ b/src/site/xdoc/manual/appenders.xml
@@ -2876,6 +2876,12 @@ public class JpaLogEntity extends 
AbstractLogEventWrapperEntity {
                 set to <code>false</code>).</td>
             </tr>
             <tr>
+              <td>connectTimeoutMillis</td>
+              <td>integer</td>
+              <td>The connect timeout in milliseconds. The default is 0 
(infinite timeout, like Socket.connect()
+                methods).</td>
+            </tr>
+            <tr>
               <td>ignoreExceptions</td>
               <td>boolean</td>
               <td>The default is <code>true</code>, causing exceptions 
encountered while appending events to be
@@ -2956,6 +2962,12 @@ public class JpaLogEntity extends 
AbstractLogEventWrapperEntity {
                 If not specified, the default system Charset will be used.</td>
             </tr>
             <tr>
+              <td>connectTimeoutMillis</td>
+              <td>integer</td>
+              <td>The connect timeout in milliseconds. The default is 0 
(infinite timeout, like Socket.connect()
+                methods).</td>
+            </tr>
+            <tr>
               <td>enterpriseNumber</td>
               <td>integer</td>
               <td>The IANA enterprise number as described in

Reply via email to