Serialization does:
if (obj instanceof Serializable) {
out.writeObject(obj);
} else {
out.writeObject(String.valueOf(obj));
}
Deserialization does:
in.defaultReadObject();
obj = in.readObject();
So if obj is not Serializable a String will be written. Upon deserialization
obj will be set to either the the deserialized version of the object or to the
String. I guess this will work.
Ralph
On Aug 11, 2014, at 2:46 PM, Remko Popma <[email protected]> wrote:
> I didn't change the serialization behavior. I only changed
> obj.toString()
> to
> String.valueOf(obj)
>
> The stringValue field wasn't there originally (I incorrectly added it as
> non-transient in my first attempt). It is now transient so serialized form
> should be the same as pre-change.
>
> The serialization behavior of ObjectMessage has always been to serialize as
> Object if possible (Serializable), otherwise as String. Deserialization will
> just read whatever was serialized. That may not be the same object field but
> is the best we can do.
>
> Or did I miss something? (away from PC)
>
> Sent from my iPhone
>
>> On 2014/08/12, at 2:38, Ralph Goers <[email protected]> wrote:
>>
>> I believe this breaks deserialization of ObjectMessage. It is being
>> serialized as either the serialized form of the Object or as a String.
>> Deserialization doesn't account for this.
>>
>> Ralph
>>
>>> On Aug 11, 2014, at 7:16 AM, [email protected] wrote:
>>>
>>> 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>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]