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/04 18:41:28 UTC
[3/7] logging-log4j2 git commit: LOG4J2-1343,
LOG4J2-1344 Let all OutputStream Managers wrap their OutputStream in
a ByteBufferDestinationOutputStream,
to be used by the Appender to participate in the new garbage-free Layout
mechanism
LOG4J2-1343, LOG4J2-1344 Let all OutputStream Managers wrap their OutputStream in a ByteBufferDestinationOutputStream, to be used by the Appender to participate in the new garbage-free Layout mechanism
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6df053ac
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6df053ac
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6df053ac
Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 6df053ac756f469efc6a9e9cf662767c5e5cbe43
Parents: 112aff6
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:35:58 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:35:58 2016 +0900
----------------------------------------------------------------------
.../core/appender/OutputStreamManager.java | 29 ++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6df053ac/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 cb1813e..428ef7e 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
@@ -16,10 +16,15 @@
*/
package org.apache.logging.log4j.core.appender;
+import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.ByteBufferDestinationOutputStream;
+import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.NullOutputStream;
/**
* Manages an OutputStream so that it can be shared by multiple Appenders and will
@@ -33,7 +38,7 @@ public class OutputStreamManager extends AbstractManager {
protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
final boolean writeHeader) {
super(streamName);
- this.os = os;
+ this.os = adaptForDirectEncoding(os);
this.layout = layout;
if (writeHeader && layout != null) {
final byte[] header = layout.getHeader();
@@ -47,6 +52,13 @@ public class OutputStreamManager extends AbstractManager {
}
}
+ // LOG4J2-1343 enable all OutputStreamAppenders to use new garbage-free layout mechanism.
+ // Appenders that control buffer size have already wrapped the output stream or give us a dummy stream.
+ private static OutputStream adaptForDirectEncoding(final OutputStream os) {
+ final boolean SHOULD_WRAP = !(os instanceof ByteBufferDestination) && !(os instanceof NullOutputStream);
+ return Constants.ENABLE_DIRECT_ENCODERS && SHOULD_WRAP ? new ByteBufferDestinationOutputStream(os) : os;
+ }
+
/**
* Creates a Manager.
*
@@ -62,6 +74,18 @@ public class OutputStreamManager extends AbstractManager {
}
/**
+ * Returns the {@code ByteBufferDestination} for the Layout to directly encode the LogEvent into.
+ * @return the {@code ByteBufferDestination} for the Layout to directly encode the LogEvent into
+ */
+ public ByteBufferDestination getByteBufferDestination() {
+ if (Constants.ENABLE_DIRECT_ENCODERS) {
+ return (ByteBufferDestination) os;
+ }
+ throw new UnsupportedOperationException(
+ "ByteBufferDestination not available unless direct encoders are enabled");
+ }
+
+ /**
* Default hook to write footer during close.
*/
@Override
@@ -95,7 +119,8 @@ public class OutputStreamManager extends AbstractManager {
return os;
}
- protected void setOutputStream(final OutputStream os) {
+ protected void setOutputStream(final OutputStream original) {
+ final OutputStream os = adaptForDirectEncoding(original);
final byte[] header = layout.getHeader();
if (header != null) {
try {