logging-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rpo...@apache.org
Subject svn commit: r1617291 - in /logging/log4j/log4j2/trunk: log4j-api/src/main/java/org/apache/logging/log4j/message/ log4j-api/src/test/java/org/apache/logging/log4j/message/ log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ log4j-core/src/m...
Date Mon, 11 Aug 2014 14:16:22 GMT
Author: rpopma
Date: Mon Aug 11 14:16:22 2014
New Revision: 1617291

URL: http://svn.apache.org/r1617291
Log:
LOG4J2-763: use different mechanism to solve this problem: instead of initializing the formatted
message string in the message constructor, postpone this as long as possible until getFormattedMessage()
is called. Async loggers and AsyncAppender now call message.getFormattedMessage() before passing
the log event to the background thread. Added more tests.

Modified:
    logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java
    logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java
    logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java
    logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java
    logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java
    logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java
    logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java
    logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java
    logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMessageTest.java
    logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
    logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
    logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
    logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigHelper.java
    logging/log4j/log4j2/trunk/src/changes/changes.xml

Modified: logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java
Mon Aug 11 14:16:22 2014
@@ -46,7 +46,6 @@ public class FormattedMessage implements
         this.messagePattern = messagePattern;
         this.argArray = arguments;
         this.throwable = throwable;
-        getFormattedMessage(); // LOG4J2-763 take snapshot of parameters at message construction
time
     }
 
     public FormattedMessage(final String messagePattern, final Object[] arguments) {

Modified: logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java
Mon Aug 11 14:16:22 2014
@@ -78,7 +78,6 @@ public class LocalizedMessage implements
         this.baseName = baseName;
         this.resourceBundle = null;
         this.locale = locale;
-        getFormattedMessage(); // LOG4J2-763 take snapshot of parameters at message construction
time
     }
 
     public LocalizedMessage(final ResourceBundle bundle, final Locale locale, final String
key,
@@ -89,7 +88,6 @@ public class LocalizedMessage implements
         this.baseName = null;
         this.resourceBundle = bundle;
         this.locale = locale;
-        getFormattedMessage(); // LOG4J2-763 take snapshot of parameters at message construction
time
     }
 
     public LocalizedMessage(final Locale locale, final String key, final Object[] arguments)
{

Modified: logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java
Mon Aug 11 14:16:22 2014
@@ -49,7 +49,6 @@ public class MessageFormatMessage implem
         if (arguments != null && arguments.length > 0 && arguments[arguments.length
- 1] instanceof Throwable) {
             this.throwable = (Throwable) arguments[arguments.length - 1];
         }
-        getFormattedMessage(); // LOG4J2-763 take snapshot of parameters at message construction
time
     }
 
     /**

Modified: logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java
Mon Aug 11 14:16:22 2014
@@ -29,7 +29,7 @@ public class ObjectMessage implements Me
     private static final long serialVersionUID = -5903272448334166185L;
 
     private transient Object obj;
-    private final String objectString;
+    private transient String objectString;
 
     /**
      * Create the ObjectMessage.
@@ -40,9 +40,6 @@ public class ObjectMessage implements Me
             obj = "null";
         }
         this.obj = obj;
-        
-        // LOG4J2-763: take snapshot of parameters at message construction time
-        objectString = String.valueOf(obj);
     }
 
     /**
@@ -51,6 +48,10 @@ public class ObjectMessage implements Me
      */
     @Override
     public String getFormattedMessage() {
+        // LOG4J2-763: cache formatted string in case obj changes later
+        if (objectString == null) {
+            objectString = String.valueOf(obj);
+        }
         return objectString;
     }
 
@@ -60,7 +61,7 @@ public class ObjectMessage implements Me
      */
     @Override
     public String getFormat() {
-        return objectString;
+        return getFormattedMessage();
     }
 
     /**
@@ -69,7 +70,7 @@ public class ObjectMessage implements Me
      */
     @Override
     public Object[] getParameters() {
-        return new Object[]{obj};
+        return new Object[] { obj };
     }
 
     @Override
@@ -82,8 +83,7 @@ public class ObjectMessage implements Me
         }
 
         final ObjectMessage that = (ObjectMessage) o;
-
-        return !(obj != null ? !obj.equals(that.obj) : that.obj != null);
+        return obj == null ? that.obj == null : obj.equals(that.obj);
     }
 
     @Override
@@ -93,7 +93,7 @@ public class ObjectMessage implements Me
 
     @Override
     public String toString() {
-        return "ObjectMessage[obj=" + objectString + ']';
+        return "ObjectMessage[obj=" + getFormattedMessage() + ']';
     }
 
     private void writeObject(final ObjectOutputStream out) throws IOException {
@@ -101,7 +101,7 @@ public class ObjectMessage implements Me
         if (obj instanceof Serializable) {
             out.writeObject(obj);
         } else {
-            out.writeObject(obj.toString());
+            out.writeObject(String.valueOf(obj));
         }
     }
 

Modified: logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java
Mon Aug 11 14:16:22 2014
@@ -48,7 +48,6 @@ public class StringFormattedMessage impl
         if (arguments != null && arguments.length > 0 && arguments[arguments.length
- 1] instanceof Throwable) {
             this.throwable = (Throwable) arguments[arguments.length - 1];
         }
-        getFormattedMessage(); // LOG4J2-763 take snapshot of parameters at message construction
time
     }
 
     /**

Modified: logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java
Mon Aug 11 14:16:22 2014
@@ -85,14 +85,27 @@ public class FormattedMessageTest {
     }
 
     @Test
-    public void testSafeWithMutableParams() { // LOG4J2-763
+    public void testUnsafeWithMutableParams() { // LOG4J2-763
         final String testMsg = "Test message %s";
         final Mutable param = new Mutable().set("abc");
-        FormattedMessage msg = new FormattedMessage(testMsg, param);
+        final FormattedMessage msg = new FormattedMessage(testMsg, param);
 
         // modify parameter before calling msg.getFormattedMessage
         param.set("XYZ");
-        String actual = msg.getFormattedMessage();
+        final String actual = msg.getFormattedMessage();
+        assertEquals("Expected most recent param value", "Test message XYZ", actual);
+    }
+
+    @Test
+    public void testSafeAfterGetFormattedMessageIsCalled() { // LOG4J2-763
+        final String testMsg = "Test message %s";
+        final Mutable param = new Mutable().set("abc");
+        final FormattedMessage msg = new FormattedMessage(testMsg, param);
+
+        // modify parameter after calling msg.getFormattedMessage
+        msg.getFormattedMessage(); // freeze the formatted message
+        param.set("XYZ");
+        final String actual = msg.getFormattedMessage();
         assertEquals("Should use initial param value", "Test message abc", actual);
     }
 }

Modified: logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/LocalizedMessageTest.java
Mon Aug 11 14:16:22 2014
@@ -65,15 +65,27 @@ public class LocalizedMessageTest {
     }
 
     @Test
-    public void testSafeWithMutableParams() { // LOG4J2-763
+    public void testUnsafeWithMutableParams() { // LOG4J2-763
         final String testMsg = "Test message %s";
         final Mutable param = new Mutable().set("abc");
-        LocalizedMessage msg = new LocalizedMessage(testMsg, param);
+        final LocalizedMessage msg = new LocalizedMessage(testMsg, param);
 
         // modify parameter before calling msg.getFormattedMessage
         param.set("XYZ");
-        String actual = msg.getFormattedMessage();
-        assertEquals("Should use initial param value", "Test message abc", actual);
+        final String actual = msg.getFormattedMessage();
+        assertEquals("Expected most recent param value", "Test message XYZ", actual);
     }
 
+    @Test
+    public void testSafeAfterGetFormattedMessageIsCalled() { // LOG4J2-763
+        final String testMsg = "Test message %s";
+        final Mutable param = new Mutable().set("abc");
+        final LocalizedMessage msg = new LocalizedMessage(testMsg, param);
+
+        // modify parameter after calling msg.getFormattedMessage
+        msg.getFormattedMessage();
+        param.set("XYZ");
+        final String actual = msg.getFormattedMessage();
+        assertEquals("Should use initial param value", "Test message abc", actual);
+    }
 }

Modified: logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java
Mon Aug 11 14:16:22 2014
@@ -63,14 +63,27 @@ public class MessageFormatMessageTest {
     }
 
     @Test
-    public void testSafeWithMutableParams() { // LOG4J2-763
+    public void testUnsafeWithMutableParams() { // LOG4J2-763
         final String testMsg = "Test message {0}";
         final Mutable param = new Mutable().set("abc");
-        MessageFormatMessage msg = new MessageFormatMessage(testMsg, param);
+        final MessageFormatMessage msg = new MessageFormatMessage(testMsg, param);
 
         // modify parameter before calling msg.getFormattedMessage
         param.set("XYZ");
-        String actual = msg.getFormattedMessage();
+        final String actual = msg.getFormattedMessage();
+        assertEquals("Expected most recent param value", "Test message XYZ", actual);
+    }
+
+    @Test
+    public void testSafeAfterGetFormattedMessageIsCalled() { // LOG4J2-763
+        final String testMsg = "Test message {0}";
+        final Mutable param = new Mutable().set("abc");
+        final MessageFormatMessage msg = new MessageFormatMessage(testMsg, param);
+
+        // modify parameter after calling msg.getFormattedMessage
+        msg.getFormattedMessage();
+        param.set("XYZ");
+        final String actual = msg.getFormattedMessage();
         assertEquals("Should use initial param value", "Test message abc", actual);
     }
 }

Modified: logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMessageTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMessageTest.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMessageTest.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMessageTest.java
Mon Aug 11 14:16:22 2014
@@ -41,13 +41,25 @@ public class ObjectMessageTest {
     }
 
     @Test
-    public void testSafeWithMutableParams() { // LOG4J2-763
+    public void testUnsafeWithMutableParams() { // LOG4J2-763
         final Mutable param = new Mutable().set("abc");
-        ObjectMessage msg = new ObjectMessage(param);
+        final ObjectMessage msg = new ObjectMessage(param);
 
         // modify parameter before calling msg.getFormattedMessage
         param.set("XYZ");
-        String actual = msg.getFormattedMessage();
+        final String actual = msg.getFormattedMessage();
+        assertEquals("Expected most recent param value", "XYZ", actual);
+    }
+
+    @Test
+    public void testSafeAfterGetFormattedMessageIsCalled() { // LOG4J2-763
+        final Mutable param = new Mutable().set("abc");
+        final ObjectMessage msg = new ObjectMessage(param);
+
+        // modify parameter after calling msg.getFormattedMessage
+        msg.getFormattedMessage();
+        param.set("XYZ");
+        final String actual = msg.getFormattedMessage();
         assertEquals("Should use initial param value", "abc", actual);
     }
 }

Modified: logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-api/src/test/java/org/apache/logging/log4j/message/StringFormattedMessageTest.java
Mon Aug 11 14:16:22 2014
@@ -62,14 +62,27 @@ public class StringFormattedMessageTest 
     }
 
     @Test
-    public void testSafeWithMutableParams() { // LOG4J2-763
+    public void testUnsafeWithMutableParams() { // LOG4J2-763
         final String testMsg = "Test message %s";
         final Mutable param = new Mutable().set("abc");
-        StringFormattedMessage msg = new StringFormattedMessage(testMsg, param);
+        final StringFormattedMessage msg = new StringFormattedMessage(testMsg, param);
 
         // modify parameter before calling msg.getFormattedMessage
         param.set("XYZ");
-        String actual = msg.getFormattedMessage();
+        final String actual = msg.getFormattedMessage();
+        assertEquals("Should use initial param value", "Test message XYZ", actual);
+    }
+
+    @Test
+    public void testSafeAfterGetFormattedMessageIsCalled() { // LOG4J2-763
+        final String testMsg = "Test message %s";
+        final Mutable param = new Mutable().set("abc");
+        final StringFormattedMessage msg = new StringFormattedMessage(testMsg, param);
+
+        // modify parameter after calling msg.getFormattedMessage
+        msg.getFormattedMessage();
+        param.set("XYZ");
+        final String actual = msg.getFormattedMessage();
         assertEquals("Should use initial param value", "Test message abc", actual);
     }
 }

Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AsyncAppender.java
Mon Aug 11 14:16:22 2014
@@ -138,6 +138,7 @@ public final class AsyncAppender extends
             }
             logEvent = ((RingBufferLogEvent) logEvent).createMemento();
         }
+        logEvent.getMessage().getFormattedMessage(); // LOG4J2-763: ask message to freeze
parameters
         final Log4jLogEvent coreEvent = (Log4jLogEvent) logEvent;
         boolean appendSuccessful = false;
         if (blocking) {

Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
Mon Aug 11 14:16:22 2014
@@ -226,6 +226,7 @@ public class AsyncLogger extends Logger 
 
     @Override
     public void logMessage(final String fqcn, final Level level, final Marker marker, final
Message message, final Throwable thrown) {
+        // TODO refactor to reduce size to <= 35 bytecodes to allow JVM to inline it
         Info info = threadlocalInfo.get();
         if (info == null) {
             info = new Info(new RingBufferLogEventTranslator(), Thread.currentThread().getName(),
false);
@@ -245,6 +246,7 @@ public class AsyncLogger extends Logger 
             config.loggerConfig.log(getName(), fqcn, marker, level, message, thrown);
             return;
         }
+        message.getFormattedMessage(); // LOG4J2-763: ask message to freeze parameters
         final boolean includeLocation = config.loggerConfig.isIncludeLocation();
         info.translator.setValues(this, getName(), marker, fqcn, level, message, //
                 // don't construct ThrowableProxy until required

Modified: logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigHelper.java
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigHelper.java?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigHelper.java
(original)
+++ logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigHelper.java
Mon Aug 11 14:16:22 2014
@@ -316,6 +316,7 @@ class AsyncLoggerConfigHelper {
      *          calling thread needs to process the event itself
      */
     public boolean callAppendersFromAnotherThread(final LogEvent event) {
+        // TODO refactor to reduce size to <= 35 bytecodes to allow JVM to inline it
         final Disruptor<Log4jEventWrapper> temp = disruptor;
         if (temp == null) { // LOG4J2-639
             LOGGER.fatal("Ignoring log event after log4j was shut down");
@@ -336,6 +337,8 @@ class AsyncLoggerConfigHelper {
             if (event instanceof RingBufferLogEvent) {
                 logEvent = ((RingBufferLogEvent) event).createMemento();
             }
+            logEvent.getMessage().getFormattedMessage(); // LOG4J2-763: ask message to freeze
parameters
+
             // Note: do NOT use the temp variable above!
             // That could result in adding a log event to the disruptor after it was shut
down,
             // which could cause the publishEvent method to hang and never return.

Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1617291&r1=1617290&r2=1617291&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Mon Aug 11 14:16:22 2014
@@ -29,8 +29,7 @@
         Startup takes a long time if you have empty packages attribute.
       </action>
       <action issue="LOG4J2-763" dev="rpopma" type="fix" due-to="Stephen Connolly">
-        Improved FormattedMessage, StringFormattedMessage, LocalizedMessage, MessageFormatMessage
and
-        ObjectMessage for asynchronous logging to ensure the formatted message does not change
even if
+        Improved asynchronous loggers and appenders to ensure the formatted message does
not change even if
         parameters are modified by the application. (ParameterizedMessage was already safe.)
         Improved documentation.
       </action>



Mime
View raw message