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/08 15:04:01 UTC

[2/2] logging-log4j2 git commit: LOG4J2-1296 when passing a Log4jLogEvent to another thread (AsyncAppender or AsyncLoggerDisruptor), ensure that the Message is immutable

LOG4J2-1296 when passing a Log4jLogEvent to another thread (AsyncAppender or AsyncLoggerDisruptor), ensure that the Message is immutable


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

Branch: refs/heads/master
Commit: 34f8538da67aaf413bad59c13fd82e05f26c9924
Parents: d2634e4
Author: rpopma <rp...@apache.org>
Authored: Wed Mar 9 01:03:54 2016 +1100
Committer: rpopma <rp...@apache.org>
Committed: Wed Mar 9 01:03:54 2016 +1100

----------------------------------------------------------------------
 .../core/async/AsyncLoggerConfigDisruptor.java      |  6 +++++-
 .../logging/log4j/core/impl/Log4jLogEvent.java      | 16 ++++++++++++++--
 2 files changed, 19 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/34f8538d/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
index 257e89a..f536d79 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
@@ -23,8 +23,10 @@ import java.util.concurrent.ThreadFactory;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.jmx.RingBufferAdmin;
 import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.status.StatusLogger;
 
 import com.lmax.disruptor.EventFactory;
@@ -264,7 +266,9 @@ public class AsyncLoggerConfigDisruptor implements AsyncLoggerConfigDelegate {
 
     private LogEvent prepareEvent(final LogEvent event) {
         final LogEvent logEvent = ensureImmutable(event);
-        if (!Constants.FORMAT_MESSAGES_IN_BACKGROUND) { // LOG4J2-898: user may choose
+        if (logEvent instanceof Log4jLogEvent && logEvent.getMessage() instanceof ReusableMessage) {
+            ((Log4jLogEvent) logEvent).makeMessageImmutable();
+        } else if (!Constants.FORMAT_MESSAGES_IN_BACKGROUND) { // LOG4J2-898: user may choose
             logEvent.getMessage().getFormattedMessage(); // LOG4J2-763: ask message to freeze parameters
         }
         return logEvent;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/34f8538d/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index d8ff470..3f8961a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -38,6 +38,8 @@ import org.apache.logging.log4j.core.util.DummyNanoClock;
 import org.apache.logging.log4j.core.util.NanoClock;
 import org.apache.logging.log4j.message.LoggerNameAwareMessage;
 import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.ReusableMessage;
+import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.message.TimestampMessage;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Strings;
@@ -54,7 +56,7 @@ public class Log4jLogEvent implements LogEvent {
     private final Marker marker;
     private final Level level;
     private final String loggerName;
-    private final Message message;
+    private Message message;
     private final long timeMillis;
     private final transient Throwable thrown;
     private ThrowableProxy thrownProxy;
@@ -465,6 +467,10 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
         return message;
     }
 
+    public void makeMessageImmutable() {
+        message = new SimpleMessage(message.getFormattedMessage());
+    }
+
     @Override
     public long getThreadId() {
         if (threadId == 0) {
@@ -789,7 +795,9 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
             this.marker = event.marker;
             this.level = event.level;
             this.loggerName = event.loggerName;
-            this.message = event.message;
+            this.message = event.message instanceof ReusableMessage
+                    ? memento((ReusableMessage) event.message)
+                    : event.message;
             this.timeMillis = event.timeMillis;
             this.thrown = event.thrown;
             this.thrownProxy = event.thrownProxy;
@@ -804,6 +812,10 @@ public Log4jLogEvent(final String loggerName, final Marker marker, final String
             this.nanoTime = event.nanoTime;
         }
 
+        private Message memento(final ReusableMessage message) {
+            return new SimpleMessage(message.getFormattedMessage());
+        }
+
         /**
          * Returns a Log4jLogEvent using the data in the proxy.
          * @return Log4jLogEvent.