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());