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.