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/03 18:12:51 UTC
[2/3] logging-log4j2 git commit: LOG4J2-1343 initial gc-free version
LOG4J2-1343 initial gc-free version
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/7aa4dc5a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/7aa4dc5a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/7aa4dc5a
Branch: refs/heads/LOG4J2-1344-gc-free-fileappender
Commit: 7aa4dc5ae2b35309f2b84f2d17e4cb909848acc9
Parents: b7d7833
Author: rpopma <rp...@apache.org>
Authored: Mon Apr 4 01:12:02 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Mon Apr 4 01:12:02 2016 +0900
----------------------------------------------------------------------
.../appender/AbstractOutputStreamAppender.java | 21 +++++++++++++++-----
.../core/appender/OutputStreamManager.java | 18 +++++++++++++++++
2 files changed, 34 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7aa4dc5a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
index 7ed06d6..3b44efd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractOutputStreamAppender.java
@@ -20,10 +20,12 @@ import java.io.Serializable;
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.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.Constants;
/**
* Appends log events as bytes to a byte output stream. The stream encoding is defined in the layout.
- *
+ *
* @param <M> The kind of {@link OutputStreamManager} under management
*/
public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager> extends AbstractAppender {
@@ -41,7 +43,7 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
/**
* Instantiates a WriterAppender and set the output destination to a new {@link java.io.OutputStreamWriter}
* initialized with <code>os</code> as its {@link java.io.OutputStream}.
- *
+ *
* @param name The name of the Appender.
* @param layout The layout to format the message.
* @param manager The OutputStreamManager.
@@ -55,7 +57,7 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
/**
* Gets the immediate flush setting.
- *
+ *
* @return immediate flush.
*/
public boolean getImmediateFlush() {
@@ -64,7 +66,7 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
/**
* Gets the manager.
- *
+ *
* @return the manager.
*/
public M getManager() {
@@ -93,12 +95,21 @@ public abstract class AbstractOutputStreamAppender<M extends OutputStreamManager
* <p>
* Most subclasses of <code>AbstractOutputStreamAppender</code> will need to override this method.
* </p>
- *
+ *
* @param event The LogEvent.
*/
@Override
public void append(final LogEvent event) {
try {
+ if (Constants.ENABLE_THREADLOCALS) {
+ final ByteBufferDestination destination = manager.getByteBufferDestination();
+ getLayout().encode(event, destination);
+ if (this.immediateFlush || event.isEndOfBatch()) {
+ destination.drain(destination.getByteBuffer()); // write buffer to outputStream
+ manager.flush();
+ }
+ return;
+ }
final byte[] bytes = getLayout().toByteArray(event);
if (bytes != null && bytes.length > 0) {
manager.write(bytes, this.immediateFlush || event.isEndOfBatch());
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7aa4dc5a/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..433c2e0 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
@@ -18,8 +18,11 @@ package org.apache.logging.log4j.core.appender;
import java.io.IOException;
import java.io.OutputStream;
+import java.util.Objects;
import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.layout.ByteBufferDestination;
+import org.apache.logging.log4j.core.util.OutputStreamByteBufferDestinationAdapter;
/**
* Manages an OutputStream so that it can be shared by multiple Appenders and will
@@ -29,9 +32,15 @@ public class OutputStreamManager extends AbstractManager {
private volatile OutputStream os;
protected final Layout<?> layout;
+ protected final ByteBufferDestination byteBufferDestination;
protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
final boolean writeHeader) {
+ this(os, streamName, layout, writeHeader, new OutputStreamByteBufferDestinationAdapter(os));
+ }
+
+ protected OutputStreamManager(final OutputStream os, final String streamName, final Layout<?> layout,
+ final boolean writeHeader, final ByteBufferDestination byteBufferDestination) {
super(streamName);
this.os = os;
this.layout = layout;
@@ -45,6 +54,7 @@ public class OutputStreamManager extends AbstractManager {
}
}
}
+ this.byteBufferDestination = Objects.requireNonNull(byteBufferDestination, "byteBufferDestination");
}
/**
@@ -61,6 +71,10 @@ public class OutputStreamManager extends AbstractManager {
return AbstractManager.getManager(name, factory, data);
}
+ public ByteBufferDestination getByteBufferDestination() {
+ return byteBufferDestination;
+ }
+
/**
* Default hook to write footer during close.
*/
@@ -74,6 +88,10 @@ public class OutputStreamManager extends AbstractManager {
* Writes the footer.
*/
protected void writeFooter() {
+ // ensure all buffered data is written to the stream before writing footer
+ final ByteBufferDestination destination = getByteBufferDestination();
+ destination.drain(destination.getByteBuffer());
+
if (layout == null) {
return;
}