LOG4J2-1271 Message.getThrowable() is called immediately after creation... 
Cache the resulting message.


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

Branch: refs/heads/LOG4J2-1278-gc-free-logger
Commit: 5945be323dcbf953c5bf7c1e029bf2d4bc287167
Parents: 4bd5161
Author: rpopma <[email protected]>
Authored: Wed Feb 24 22:03:27 2016 +0900
Committer: rpopma <[email protected]>
Committed: Wed Feb 24 22:03:27 2016 +0900

----------------------------------------------------------------------
 .../log4j/message/ParameterizedMessage.java     | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5945be32/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
index 2e37f73..bb37e23 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
@@ -77,9 +77,9 @@ public class ParameterizedMessage implements ReusableMessage {
 
     private String messagePattern;
     private int argCount;
-    private StringBuilder formattedMessage;
     private transient Object[] argArray;
 
+    private boolean isThreadLocalMessageInitialized;
     private boolean isThrowableInitialized;
     private transient Throwable throwable;
     private boolean reused;
@@ -166,12 +166,13 @@ public class ParameterizedMessage implements 
ReusableMessage {
         this.reused = reused;
     }
 
-    void set(String messagePattern, Object... arguments) {
+    ParameterizedMessage set(String messagePattern, Object... arguments) {
         this.messagePattern = messagePattern;
         this.argArray = arguments;
         this.argCount = arguments == null ? 0 : arguments.length;
         this.isThrowableInitialized = false;
-        this.formattedMessage = null;
+        this.isThreadLocalMessageInitialized = false;
+        return this;
     }
 
     private static Object[] unrolledArgs() {
@@ -231,16 +232,16 @@ public class ParameterizedMessage implements 
ReusableMessage {
      */
     @Override
     public String getFormattedMessage() {
-        if (formattedMessage == null) {
+        if (!isThreadLocalMessageInitialized) {
             initFormattedMessage();
         }
-        return formattedMessage.toString();
+        return threadLocalStringBuilder.get().toString();
     }
 
     private void initFormattedMessage() {
         final StringBuilder buffer = getThreadLocalStringBuilder();
         formatTo(buffer);
-        formattedMessage = buffer;
+        isThreadLocalMessageInitialized = true;
     }
 
     private static StringBuilder getThreadLocalStringBuilder() {
@@ -255,6 +256,13 @@ public class ParameterizedMessage implements 
ReusableMessage {
 
     @Override
     public void formatTo(final StringBuilder buffer) {
+        if (isThreadLocalMessageInitialized) {
+            final StringBuilder msg = threadLocalStringBuilder.get();
+            if (msg != buffer) {
+                buffer.append(msg);
+            }
+            return;
+        }
         final Throwable t = formatMessage(buffer, messagePattern, 
getParameters(), argCount, throwable);
         initThrowable(t);
         clearUnrolledArgs();

Reply via email to