Repository: logging-log4j2
Updated Branches:
  refs/heads/release-2.x 73306cd08 -> e4d9b0d65


LOG4J2-2252 Reusable LogEvents should pass along the original format string

This allows custom layouts to group logged messages parameterized
values without creating new single-use messages for each event.

This slightly modifies the getFormat implementation of some
message types to avoid doing unnecessary work to load the
format string.


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

Branch: refs/heads/release-2.x
Commit: ac614e85e59d9e89033eda703ec43dcd2b2b4fc7
Parents: 73306cd
Author: Carter Kozak <c4kof...@gmail.com>
Authored: Tue Feb 13 11:28:17 2018 -0500
Committer: Carter Kozak <c4kof...@gmail.com>
Committed: Mon Feb 26 09:04:14 2018 -0800

----------------------------------------------------------------------
 .../log4j/message/ReusableObjectMessage.java    |  2 +-
 .../log4j/message/ReusableSimpleMessage.java    |  2 +-
 .../logging/log4j/message/SimpleMessage.java    |  5 ++--
 .../message/ReusableObjectMessageTest.java      |  4 +--
 .../message/ReusableSimpleMessageTest.java      |  2 +-
 .../log4j/core/async/RingBufferLogEvent.java    |  5 +++-
 .../log4j/core/impl/MutableLogEvent.java        |  5 +++-
 .../log4j/core/impl/MutableLogEventTest.java    | 28 ++++++++++++++++++++
 8 files changed, 44 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
index 950a35e..b973e5a 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
@@ -55,7 +55,7 @@ public class ReusableObjectMessage implements 
ReusableMessage, ParameterVisitabl
      */
     @Override
     public String getFormat() {
-        return getFormattedMessage();
+        return obj instanceof String ? (String) obj : null;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
index 1bd1732..49b0d7f 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
@@ -43,7 +43,7 @@ public class ReusableSimpleMessage implements 
ReusableMessage, CharSequence, Par
 
     @Override
     public String getFormat() {
-        return getFormattedMessage();
+        return charSequence instanceof String ? (String) charSequence : null;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java
index 8a2fc72..d33f3b9 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java
@@ -16,10 +16,11 @@
  */
 package org.apache.logging.log4j.message;
 
+import org.apache.logging.log4j.util.StringBuilderFormattable;
+
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
 
 /**
  * The simplest possible implementation of Message. It just returns the String 
given as the constructor argument.
@@ -75,7 +76,7 @@ public class SimpleMessage implements Message, 
StringBuilderFormattable, CharSeq
      */
     @Override
     public String getFormat() {
-        return getFormattedMessage();
+        return message;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
 
b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
index d4f87a7..614d54c 100644
--- 
a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
+++ 
b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableObjectMessageTest.java
@@ -49,8 +49,8 @@ public class ReusableObjectMessageTest {
     }
 
     @Test
-    public void testGetFormat_InitiallyNullString() throws Exception {
-        assertEquals("null", new ReusableObjectMessage().getFormat());
+    public void testGetFormat_InitiallyNull() throws Exception {
+        assertNull(new ReusableObjectMessage().getFormat());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
 
b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
index 3a56b64..1070a53 100644
--- 
a/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
+++ 
b/log4j-api/src/test/java/org/apache/logging/log4j/message/ReusableSimpleMessageTest.java
@@ -50,7 +50,7 @@ public class ReusableSimpleMessageTest {
 
     @Test
     public void testGetFormat_InitiallyStringNull() throws Exception {
-        assertEquals("null", new ReusableSimpleMessage().getFormat());
+        assertNull(new ReusableSimpleMessage().getFormat());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/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 a631083..ff74a91 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
@@ -77,6 +77,7 @@ public class RingBufferLogEvent implements LogEvent, 
ReusableMessage, CharSequen
     private String threadName;
     private String loggerName;
     private Message message;
+    private String messageFormat;
     private StringBuilder messageText;
     private Object[] parameters;
     private transient Throwable thrown;
@@ -129,6 +130,7 @@ public class RingBufferLogEvent implements LogEvent, 
ReusableMessage, CharSequen
         if (msg instanceof ReusableMessage) {
             final ReusableMessage reusable = (ReusableMessage) msg;
             reusable.formatTo(getMessageTextForWriting());
+            messageFormat = reusable.getFormat();
             if (parameters != null) {
                 parameters = reusable.swapParameters(parameters);
                 parameterCount = reusable.getParameterCount();
@@ -229,7 +231,7 @@ public class RingBufferLogEvent implements LogEvent, 
ReusableMessage, CharSequen
      */
     @Override
     public String getFormat() {
-        return null;
+        return messageFormat;
     }
 
     /**
@@ -405,6 +407,7 @@ public class RingBufferLogEvent implements LogEvent, 
ReusableMessage, CharSequen
         this.fqcn = null;
         this.level = null;
         this.message = null;
+        this.messageFormat = null;
         this.thrown = null;
         this.thrownProxy = null;
         this.contextStack = null;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
index 58895b9..fe171b4 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
@@ -54,6 +54,7 @@ public class MutableLogEvent implements LogEvent, 
ReusableMessage, ParameterVisi
     private String threadName;
     private String loggerName;
     private Message message;
+    private String messageFormat;
     private StringBuilder messageText;
     private Object[] parameters;
     private Throwable thrown;
@@ -124,6 +125,7 @@ public class MutableLogEvent implements LogEvent, 
ReusableMessage, ParameterVisi
         level = null;
         loggerName = null;
         message = null;
+        messageFormat = null;
         thrown = null;
         thrownProxy = null;
         source = null;
@@ -209,6 +211,7 @@ public class MutableLogEvent implements LogEvent, 
ReusableMessage, ParameterVisi
         if (msg instanceof ReusableMessage) {
             final ReusableMessage reusable = (ReusableMessage) msg;
             reusable.formatTo(getMessageTextForWriting());
+            this.messageFormat = msg.getFormat();
             if (parameters != null) {
                 parameters = reusable.swapParameters(parameters);
                 parameterCount = reusable.getParameterCount();
@@ -241,7 +244,7 @@ public class MutableLogEvent implements LogEvent, 
ReusableMessage, ParameterVisi
      */
     @Override
     public String getFormat() {
-        return null;
+        return messageFormat;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/ac614e85/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
index 1e4c8cc..2bee6fb 100644
--- 
a/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
+++ 
b/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/MutableLogEventTest.java
@@ -28,7 +28,9 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ParameterizedMessage;
+import org.apache.logging.log4j.message.ReusableMessageFactory;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.util.FilteredObjectInputStream;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
@@ -113,6 +115,32 @@ public class MutableLogEventTest {
     }
 
     @Test
+    public void testInitFromReusableCopiesFormatString() {
+        Message message = ReusableMessageFactory.INSTANCE.newMessage("msg in a 
{}", "bottle");
+        final Log4jLogEvent source = Log4jLogEvent.newBuilder() //
+                .setContextData(CONTEXT_DATA) //
+                .setContextStack(STACK) //
+                .setEndOfBatch(true) //
+                .setIncludeLocation(true) //
+                .setLevel(Level.FATAL) //
+                .setLoggerFqcn("a.b.c.d.e") //
+                .setLoggerName("my name is Logger") //
+                .setMarker(MarkerManager.getMarker("on your marks")) //
+                .setMessage(message) //
+                .setNanoTime(1234567) //
+                .setSource(new StackTraceElement("myclass", "mymethod", 
"myfile", 123)) //
+                
.setThreadId(100).setThreadName("threadname").setThreadPriority(10) //
+                .setThrown(new RuntimeException("run")) //
+                .setTimeMillis(987654321)
+                .build();
+        final MutableLogEvent mutable = new MutableLogEvent();
+        mutable.initFrom(source);
+        assertEquals("format", "msg in a {}", mutable.getFormat());
+        assertEquals("formatted", "msg in a bottle", 
mutable.getFormattedMessage());
+        assertEquals("parameters", new String[] {"bottle"}, 
mutable.getParameters());
+    }
+
+    @Test
     public void testClear() {
         final MutableLogEvent mutable = new MutableLogEvent();
         assertEquals("context data", 0, mutable.getContextData().size());

Reply via email to