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

[15/23] logging-log4j2 git commit: LOG4J2-1343 TcpSocketManager cannot use the garbage-free Layout methods since it needs the write() method to be called.

LOG4J2-1343 TcpSocketManager cannot use the garbage-free Layout methods since it needs the write() method to be called.

TcpSocketManger overrides the write() method to manage the socket connection, but when Layout.encode() writes to a ByteBufferDestination, the write() method is not called. For now the best solution is to just use the previous mechanism with the writeByteArrayToManager() method


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

Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 36a87baec0b78f12ee00c302bcc174aaecdbe9b9
Parents: 8c175c5
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 23:14:06 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 23:14:06 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/appender/SocketAppender.java     | 25 +++++++++++++++-----
 .../log4j/core/net/TcpSocketManager.java        |  6 +++--
 2 files changed, 23 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/36a87bae/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 4a97189..b807cdb 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
@@ -22,6 +22,7 @@ import java.util.Map;
 
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAliases;
@@ -47,6 +48,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
 
     private final Object advertisement;
     private final Advertiser advertiser;
+    private final boolean isUDP;
 
     protected SocketAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
             final AbstractSocketManager manager, final boolean ignoreExceptions, final boolean immediateFlush,
@@ -62,6 +64,17 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
             this.advertisement = null;
         }
         this.advertiser = advertiser;
+        this.isUDP = manager instanceof DatagramSocketManager;
+    }
+
+    @Override
+    protected void tryAppend(final LogEvent event) {
+        if (isUDP) {
+            super.tryAppend(event);
+        } else {
+            // for non-UDP sockets, the TcpSocketManager.write() method *must* be called
+            writeByteArrayToManager(event);
+        }
     }
 
     @Override
@@ -74,7 +87,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
 
     /**
      * Creates a socket appender.
-     * 
+     *
      * @param host
      *            The name of the host to connect to.
      * @param port
@@ -122,10 +135,10 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
             @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions,
             @PluginElement("Layout") Layout<? extends Serializable> layout,
             @PluginElement("Filter") final Filter filter,
-            @PluginAttribute(value = "advertise", defaultBoolean = false) final boolean advertise, 
+            @PluginAttribute(value = "advertise", defaultBoolean = false) final boolean advertise,
             @PluginConfiguration final Configuration config) {
             // @formatter:on
-        
+
         if (layout == null) {
             layout = SerializedLayout.createLayout();
         }
@@ -149,7 +162,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
 
     /**
      * Creates a socket appender.
-     * 
+     *
      * @param host
      *            The name of the host to connect to.
      * @param portNum
@@ -200,7 +213,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
             final String ignore,
             Layout<? extends Serializable> layout,
             final Filter filter,
-            final String advertise, 
+            final String advertise,
             final Configuration config) {
             // @formatter:on
         boolean isFlush = Booleans.parseBoolean(immediateFlush, true);
@@ -216,7 +229,7 @@ public class SocketAppender extends AbstractOutputStreamAppender<AbstractSocketM
 
     /**
      * Creates an AbstractSocketManager for TCP, UDP, and SSL.
-     * 
+     *
      * @throws IllegalArgumentException
      *             if the protocol cannot be handled.
      */

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/36a87bae/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 d518aee..fafba07 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
@@ -59,7 +59,7 @@ public class TcpSocketManager extends AbstractSocketManager {
     private final boolean retry;
 
     private final boolean immediateFail;
-    
+
     private final int connectTimeoutMillis;
 
     /**
@@ -117,6 +117,8 @@ public class TcpSocketManager extends AbstractSocketManager {
 
     @Override
     protected void write(final byte[] bytes, final int offset, final int length, boolean immediateFlush)  {
+        // currently this method is not called with direct encoders (the Layout.encode() method),
+        // so we cannot use direct encoders with the TcpSocketManager...
         if (socket == null) {
             if (connector != null && !immediateFail) {
                 connector.latch();
@@ -166,7 +168,7 @@ public class TcpSocketManager extends AbstractSocketManager {
      * <li>Key: "protocol" Value: "tcp"</li>
      * <li>Key: "direction" Value: "out"</li>
      * </ul>
-     * 
+     *
      * @return Map of content format keys supporting TcpSocketManager
      */
     @Override