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