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/03/24 17:16:37 UTC

[10/11] logging-log4j2 git commit: LOG4J2-1296 simplify RingBufferLogEvent: remove inner class StringBuilderWrapperMessage and implement the Message interface directly

LOG4J2-1296 simplify RingBufferLogEvent: remove inner class StringBuilderWrapperMessage and implement the Message interface directly


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

Branch: refs/heads/LOG4J2-1278-gc-free-logger
Commit: 29a4e87d1636e1f3473a850f68e005b4dbe44695
Parents: f41322b
Author: rpopma <rp...@apache.org>
Authored: Fri Mar 25 01:15:17 2016 +0900
Committer: rpopma <rp...@apache.org>
Committed: Fri Mar 25 01:15:17 2016 +0900

----------------------------------------------------------------------
 .../log4j/core/async/RingBufferLogEvent.java    | 97 +++++++++-----------
 1 file changed, 44 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/29a4e87d/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
index a241f0a..399c7a5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
@@ -41,7 +41,7 @@ import com.lmax.disruptor.EventFactory;
  * When the Disruptor is started, the RingBuffer is populated with event objects. These objects are then re-used during
  * the life of the RingBuffer.
  */
-public class RingBufferLogEvent implements LogEvent {
+public class RingBufferLogEvent implements LogEvent, ReusableMessage {
 
     /** The {@code EventFactory} for {@code RingBufferLogEvent}s. */
     public static final Factory FACTORY = new Factory();
@@ -49,6 +49,8 @@ public class RingBufferLogEvent implements LogEvent {
     private static final long serialVersionUID = 8462119088943934758L;
     private static final int INITIAL_REUSABLE_MESSAGE_SIZE = size("log4j.initialReusableMsgSize", 128);
     private static final int MAX_REUSABLE_MESSAGE_SIZE = size("log4j.maxReusableMsgSize", (128 * 2 + 2) * 2 + 2);
+    private static final Object[] PARAMS = new Object[0];
+    private static final Message EMPTY = new SimpleMessage(Strings.EMPTY);
 
     private static int size(final String property, final int defaultValue) {
         return PropertiesUtil.getProperties().getIntegerProperty(property, defaultValue);
@@ -69,53 +71,6 @@ public class RingBufferLogEvent implements LogEvent {
         }
     }
 
-    private static class StringBuilderWrapperMessage implements ReusableMessage {
-        static final StringBuilderWrapperMessage INSTANCE = new StringBuilderWrapperMessage();
-        private static final Object[] PARAMS = new Object[0];
-        private StringBuilder stringBuilder;
-
-        @Override
-        public String getFormattedMessage() {
-            final String result = stringBuilder.toString();
-            trim(stringBuilder, MAX_REUSABLE_MESSAGE_SIZE);
-            return result;
-        }
-
-        @Override
-        public String getFormat() {
-            return null;
-        }
-
-        @Override
-        public Object[] getParameters() {
-            return PARAMS;
-        }
-
-        @Override
-        public Throwable getThrowable() {
-            return null;
-        }
-
-        @Override
-        public void formatTo(final StringBuilder buffer) {
-            buffer.append(stringBuilder);
-            trim(stringBuilder, MAX_REUSABLE_MESSAGE_SIZE);
-        }
-
-        // ensure that excessively long char[] arrays are not kept in memory forever
-        private static void trim(final StringBuilder sb, final int maxReusableMessageSize) {
-            if (sb.length() > maxReusableMessageSize) {
-                sb.setLength(maxReusableMessageSize);
-                sb.trimToSize();
-            }
-        }
-
-        public Message setFormattedMessage(final StringBuilder messageText) {
-            this.stringBuilder = messageText;
-            return this;
-        }
-    }
-
     private transient AsyncLogger asyncLogger;
     private String loggerName;
     private Marker marker;
@@ -241,15 +196,51 @@ public class RingBufferLogEvent implements LogEvent {
     @Override
     public Message getMessage() {
         if (message == null) {
-            if (messageText == null) {
-                message = new SimpleMessage(Strings.EMPTY);
-            } else {
-                message = StringBuilderWrapperMessage.INSTANCE.setFormattedMessage(messageText);
-            }
+            return (messageText == null) ? EMPTY : this;
         }
         return message;
     }
 
+    /**
+     * @see ReusableMessage#getFormattedMessage()
+     */
+    @Override
+    public String getFormattedMessage() {
+        return messageText.toString();
+    }
+
+    /**
+     * @see ReusableMessage#getFormat()
+     */
+    @Override
+    public String getFormat() {
+        return null;
+    }
+
+    /**
+     * @see ReusableMessage#getParameters()
+     */
+    @Override
+    public Object[] getParameters() {
+        return PARAMS;
+    }
+
+    /**
+     * @see ReusableMessage#getThrowable()
+     */
+    @Override
+    public Throwable getThrowable() {
+        return getThrown();
+    }
+
+    /**
+     * @see ReusableMessage#formatTo(StringBuilder)
+     */
+    @Override
+    public void formatTo(final StringBuilder buffer) {
+        buffer.append(messageText);
+    }
+
     private Message getNonNullImmutableMessage() {
         return message != null ? message : new SimpleMessage(String.valueOf(messageText));
     }