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