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]
