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:27 UTC
[2/7] logging-log4j2 git commit: LOG4J2-1343,
LOG4J2-1344 Let all OutputStream-based appenders use the new
garbage-free layout mechanism if enabled
LOG4J2-1343, LOG4J2-1344 Let all OutputStream-based appenders use the new garbage-free layout mechanism if enabled
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/112aff6b
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/112aff6b
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/112aff6b
Branch: refs/heads/LOG4J2-1343-no-gc-outputstreamappenders
Commit: 112aff6b006ca37149fe6ba232236096c1b57458
Parents: 054c4f9
Author: rpopma <rp...@apache.org>
Authored: Tue Apr 5 01:34:09 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Tue Apr 5 01:34:09 2016 +0900
----------------------------------------------------------------------
.../appender/AbstractOutputStreamAppender.java | 43 ++++++++++++++++----
1 file changed, 35 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/112aff6b/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..62f09c6 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,20 +95,45 @@ 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 {
+ tryAppend(event);
+ } catch (final AppenderLoggingException alex) {
+ reportAppendError(alex);
+ throw alex;
+ } catch (final Exception ex) {
+ reportAppendError(ex);
+ throw new AppenderLoggingException(ex);
+ }
+ }
+
+ private void tryAppend(final LogEvent event) {
+ if (Constants.ENABLE_DIRECT_ENCODERS) {
+ directEncodeEvent(event);
+ } else {
final byte[] bytes = getLayout().toByteArray(event);
if (bytes != null && bytes.length > 0) {
manager.write(bytes, this.immediateFlush || event.isEndOfBatch());
}
- } catch (final AppenderLoggingException ex) {
- error("Unable to write to stream " + manager.getName() + " for appender " + getName());
- throw ex;
}
}
+ private void directEncodeEvent(final LogEvent event) {
+ synchronized (manager) {
+ final ByteBufferDestination destination = manager.getByteBufferDestination();
+ getLayout().encode(event, destination);
+ if (this.immediateFlush || event.isEndOfBatch()) {
+ destination.drain(destination.getByteBuffer()); // write buffer to outputStream
+ manager.flush();
+ }
+ }
+ }
+
+ private void reportAppendError(final Exception ex) {
+ error("Unable to write to stream " + manager.getName() + " for appender " + getName() + ": " + ex);
+ }
}