logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Remko Popma <remko.po...@gmail.com>
Subject Re: svn commit: r1597291 - in /logging/log4j/log4j2/trunk: log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/ log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ log4j-core/src/test/java/org/apache/logging/log4j/core/impl/ lo...
Date Sat, 24 May 2014 16:51:25 GMT
And... yup! There was a bug lurking there. LogEventProxy's throwable also
needs to be transient.

I've added tests to ThrowableProxyTest and Log4jLogEventTest where I
serialize an instance with an exception and then delete the exception.
I keep the serialized form in base64 in the test, and commented out the
code to generate the base64 serialized form.

Everybody, please don't delete that commented out code!
Not pretty, but the best I could think of.



On Sun, May 25, 2014 at 12:20 AM, Ralph Goers <rgoers@apache.org> wrote:

> No problem.  There is a test for that, but it requires making a
> TheowabeProxy with an exception, serializing that and then deleting the
> exception class.  Off the top of my head I can't remember the test - it may
> just be ThrowableProxyTest.  You should redo that to verify it works.  If
> you can figure out a better way to do that test that would be good.
>
> Sent from my iPad
>
> On May 24, 2014, at 7:47 AM, Remko Popma <remko.popma@gmail.com> wrote:
>
> Thanks for checking, Ralph!
>
>
> On Sat, May 24, 2014 at 11:37 PM, Remko Popma <remko.popma@gmail.com>wrote:
>
>> Sorry, I wasn't thinking this through. My mistake.
>> I will make the Throwable field transient in Log4jLogEvent.
>>
>>
>>
>> On Sat, May 24, 2014 at 11:32 PM, Remko Popma <remko.popma@gmail.com>wrote:
>>
>>> Do you mean it should be transient?
>>> I thought the receiver has the option of getting the deserialized
>>> Throwable (which may not work if they don't have that class)
>>> but they also have the option of getting the ThrowableProxy which will
>>> always work.
>>>
>>> So it is a matter of how the client code uses the received LogEvent,
>>> IMHO.
>>>
>>>
>>>
>>>
>>> On Sat, May 24, 2014 at 11:28 PM, Ralph Goers <rgoers@apache.org> wrote:
>>>
>>>> I think this breaks serialization - the fix I did for LOG4J2-542.  The
>>>> Throwable must be volatile as it may not exist on the remote system, so you
>>>> cannot rely on it for deserialization.
>>>>
>>>> Sent from my iPad
>>>>
>>>> > On May 24, 2014, at 6:54 AM, rpopma@apache.org wrote:
>>>> >
>>>> > Author: rpopma
>>>> > Date: Sat May 24 13:54:16 2014
>>>> > New Revision: 1597291
>>>> >
>>>> > URL: http://svn.apache.org/r1597291
>>>> > Log:
>>>> > LOG4J2-250: Refactor Log4jLogEvent to lazily create ThrowableProxy
>>>> >
>>>> > Modified:
>>>> >
>>>>  logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
>>>> >
>>>>  logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
>>>> >
>>>>  logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
>>>> >
>>>>  logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java
>>>> >
>>>>  logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/LogEventFixtures.java
>>>> >
>>>>  logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XmlLayoutTest.java
>>>> >    logging/log4j/log4j2/trunk/src/changes/changes.xml
>>>> >
>>>> > Modified:
>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java?rev=1597291&r1=1597290&r2=1597291&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
>>>> (original)
>>>> > +++
>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicy.java
>>>> Sat May 24 13:54:16 2014
>>>> > @@ -81,8 +81,8 @@ public final class MapRewritePolicy impl
>>>> >         if (source instanceof Log4jLogEvent) {
>>>> >             Log4jLogEvent event = (Log4jLogEvent) source;
>>>> >             return Log4jLogEvent.createEvent(event.getLoggerName(),
>>>> event.getMarker(), event.getLoggerFqcn(),
>>>> > -                event.getLevel(), message, event.getThrownProxy(),
>>>> event.getContextMap(), event.getContextStack(),
>>>> > -                event.getThreadName(), event.getSource(),
>>>> event.getTimeMillis());
>>>> > +                event.getLevel(), message, event.getThrown(),
>>>> event.getThrownProxy(), event.getContextMap(),
>>>> > +                event.getContextStack(), event.getThreadName(),
>>>> event.getSource(), event.getTimeMillis());
>>>> >         }
>>>> >         return new Log4jLogEvent(source.getLoggerName(),
>>>> source.getMarker(), source.getLoggerFqcn(), source.getLevel(),
>>>> >             message, source.getThrown(), source.getContextMap(),
>>>> source.getContextStack(), source.getThreadName(),
>>>> >
>>>> > Modified:
>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java?rev=1597291&r1=1597290&r2=1597291&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
>>>> (original)
>>>> > +++
>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
>>>> Sat May 24 13:54:16 2014
>>>> > @@ -49,7 +49,8 @@ public class Log4jLogEvent implements Lo
>>>> >     private final String loggerName;
>>>> >     private final Message message;
>>>> >     private final long timeMillis;
>>>> > -    private final ThrowableProxy thrownProxy;
>>>> > +    private final Throwable thrown;
>>>> > +    private ThrowableProxy thrownProxy;
>>>> >     private final Map<String, String> contextMap;
>>>> >     private final ThreadContext.ContextStack contextStack;
>>>> >     private String threadName = null;
>>>> > @@ -65,7 +66,7 @@ public class Log4jLogEvent implements Lo
>>>> >      *
>>>> >      */
>>>> >     public Log4jLogEvent(final long timestamp) {
>>>> > -        this(Strings.EMPTY, null, Strings.EMPTY, null, null,
>>>> (ThrowableProxy) null, null, null, null, null, timestamp);
>>>> > +        this(Strings.EMPTY, null, Strings.EMPTY, null, null,
>>>> (Throwable) null, null, null, null, null, timestamp);
>>>> >     }
>>>> >
>>>> >     /**
>>>> > @@ -115,11 +116,11 @@ public class Log4jLogEvent implements Lo
>>>> >      * @param timestamp The timestamp of the event.
>>>> >      */
>>>> >     public Log4jLogEvent(final String loggerName, final Marker
>>>> marker, final String loggerFQCN, final Level level,
>>>> > -                         final Message message, final Throwable t,
>>>> > -                         final Map<String, String> mdc, final
>>>> ThreadContext.ContextStack ndc, final String threadName,
>>>> > +                         final Message message, final Throwable t,
>>>> final Map<String, String> mdc,
>>>> > +                         final ThreadContext.ContextStack ndc, final
>>>> String threadName,
>>>> >                          final StackTraceElement location, final long
>>>> timestamp) {
>>>> > -        this(loggerName, marker, loggerFQCN, level, message, t ==
>>>> null ? null : new ThrowableProxy(t), mdc, ndc, threadName,
>>>> > -            location, timestamp);
>>>> > +        this(loggerName, marker, loggerFQCN, level, message, t,
>>>> null, mdc, ndc, threadName,
>>>> > +                location, timestamp);
>>>> >     }
>>>> >
>>>> >     /**
>>>> > @@ -129,7 +130,8 @@ public class Log4jLogEvent implements Lo
>>>> >      * @param loggerFQCN The fully qualified class name of the caller.
>>>> >      * @param level The logging Level.
>>>> >      * @param message The Message.
>>>> > -     * @param t A ThrowableProxy or null.
>>>> > +     * @param thrown A Throwable or null.
>>>> > +     * @param thrownProxy A ThrowableProxy or null.
>>>> >      * @param mdc The mapped diagnostic context.
>>>> >      * @param ndc the nested diagnostic context.
>>>> >      * @param threadName The name of the thread.
>>>> > @@ -137,11 +139,14 @@ public class Log4jLogEvent implements Lo
>>>> >      * @param timestamp The timestamp of the event.
>>>> >      */
>>>> >     public static Log4jLogEvent createEvent(final String loggerName,
>>>> final Marker marker, final String loggerFQCN,
>>>> > -                                            final Level level, final
>>>> Message message, final ThrowableProxy t,
>>>> > +                                            final Level level, final
>>>> Message message, final Throwable thrown,
>>>> > +                                            final ThrowableProxy
>>>> thrownProxy,
>>>> >                                             final Map<String, String>
>>>> mdc, final ThreadContext.ContextStack ndc,
>>>> >                                             final String threadName,
>>>> final StackTraceElement location,
>>>> >                                             final long timestamp) {
>>>> > -     return new Log4jLogEvent(loggerName, marker, loggerFQCN, level,
>>>> message, t, mdc, ndc, threadName, location, timestamp);
>>>> > +        final Log4jLogEvent result = new Log4jLogEvent(loggerName,
>>>> marker, loggerFQCN, level, message, thrown,
>>>> > +                thrownProxy, mdc, ndc, threadName, location,
>>>> timestamp);
>>>> > +        return result;
>>>> >     }
>>>> >
>>>> >     /**
>>>> > @@ -151,6 +156,7 @@ public class Log4jLogEvent implements Lo
>>>> >      * @param loggerFQCN The fully qualified class name of the caller.
>>>> >      * @param level The logging Level.
>>>> >      * @param message The Message.
>>>> > +     * @param thrown A Throwable or null.
>>>> >      * @param thrownProxy A ThrowableProxy or null.
>>>> >      * @param contextMap The mapped diagnostic context.
>>>> >      * @param contextStack the nested diagnostic context.
>>>> > @@ -159,14 +165,15 @@ public class Log4jLogEvent implements Lo
>>>> >      * @param timestamp The timestamp of the event.
>>>> >      */
>>>> >     private Log4jLogEvent(final String loggerName, final Marker
>>>> marker, final String loggerFQCN, final Level level,
>>>> > -                         final Message message, final ThrowableProxy
>>>> thrownProxy,
>>>> > -                         final Map<String, String> contextMap,
final
>>>> ThreadContext.ContextStack contextStack, final String threadName,
>>>> > -                         final StackTraceElement source, final long
>>>> timestamp) {
>>>> > +            final Message message, final Throwable thrown,
>>>> ThrowableProxy thrownProxy,
>>>> > +            final Map<String, String> contextMap, final
>>>> ThreadContext.ContextStack contextStack,
>>>> > +            final String threadName, final StackTraceElement source,
>>>> final long timestamp) {
>>>> >         this.loggerName = loggerName;
>>>> >         this.marker = marker;
>>>> >         this.loggerFqcn = loggerFQCN;
>>>> >         this.level = (level == null) ? Level.OFF : level; //
>>>> LOG4J2-462, LOG4J2-465
>>>> >         this.message = message;
>>>> > +        this.thrown = thrown;
>>>> >         this.thrownProxy = thrownProxy;
>>>> >         this.contextMap = contextMap == null ?
>>>> ThreadContext.EMPTY_MAP : contextMap;
>>>> >         this.contextStack = contextStack == null ?
>>>> ThreadContext.EMPTY_STACK : contextStack;
>>>> > @@ -250,7 +257,7 @@ public class Log4jLogEvent implements Lo
>>>> >      */
>>>> >     @Override
>>>> >     public Throwable getThrown() {
>>>> > -        return thrownProxy == null ? null :
>>>> thrownProxy.getThrowable();
>>>> > +        return thrown;
>>>> >     }
>>>> >
>>>> >     /**
>>>> > @@ -259,6 +266,9 @@ public class Log4jLogEvent implements Lo
>>>> >      */
>>>> >     @Override
>>>> >     public ThrowableProxy getThrownProxy() {
>>>> > +        if (thrownProxy == null && thrown != null) {
>>>> > +            thrownProxy = new ThrowableProxy(thrown);
>>>> > +        }
>>>> >         return thrownProxy;
>>>> >     }
>>>> >
>>>> > @@ -377,7 +387,7 @@ public class Log4jLogEvent implements Lo
>>>> >             final LogEventProxy proxy = (LogEventProxy) event;
>>>> >             final Log4jLogEvent result = new
>>>> Log4jLogEvent(proxy.loggerName, proxy.marker,
>>>> >                     proxy.loggerFQCN, proxy.level, proxy.message,
>>>> > -                    proxy.thrownProxy, proxy.contextMap,
>>>> proxy.contextStack, proxy.threadName,
>>>> > +                    proxy.thrown, proxy.thrownProxy,
>>>> proxy.contextMap, proxy.contextStack, proxy.threadName,
>>>> >                     proxy.source, proxy.timeMillis);
>>>> >             result.setEndOfBatch(proxy.isEndOfBatch);
>>>> >             result.setIncludeLocation(proxy.isLocationRequired);
>>>> > @@ -447,6 +457,9 @@ public class Log4jLogEvent implements Lo
>>>> >         if (threadName != null ? !threadName.equals(that.threadName)
>>>> : that.threadName != null) {
>>>> >             return false;
>>>> >         }
>>>> > +        if (thrown != null ? !thrown.equals(that.thrown) :
>>>> that.thrown != null) {
>>>> > +            return false;
>>>> > +        }
>>>> >         if (thrownProxy != null ?
>>>> !thrownProxy.equals(that.thrownProxy) : that.thrownProxy != null) {
>>>> >             return false;
>>>> >         }
>>>> > @@ -462,6 +475,7 @@ public class Log4jLogEvent implements Lo
>>>> >         result = 31 * result + loggerName.hashCode();
>>>> >         result = 31 * result + message.hashCode();
>>>> >         result = 31 * result + (int) (timeMillis ^ (timeMillis >>>
>>>> 32));
>>>> > +        result = 31 * result + (thrown != null ? thrown.hashCode()
:
>>>> 0);
>>>> >         result = 31 * result + (thrownProxy != null ?
>>>> thrownProxy.hashCode() : 0);
>>>> >         result = 31 * result + (contextMap != null ?
>>>> contextMap.hashCode() : 0);
>>>> >         result = 31 * result + (contextStack != null ?
>>>> contextStack.hashCode() : 0);
>>>> > @@ -484,6 +498,7 @@ public class Log4jLogEvent implements Lo
>>>> >         private final String loggerName;
>>>> >         private final Message message;
>>>> >         private final long timeMillis;
>>>> > +        private final Throwable thrown;
>>>> >         private final ThrowableProxy thrownProxy;
>>>> >         private final Map<String, String> contextMap;
>>>> >         private final ThreadContext.ContextStack contextStack;
>>>> > @@ -499,6 +514,7 @@ public class Log4jLogEvent implements Lo
>>>> >             this.loggerName = event.loggerName;
>>>> >             this.message = event.message;
>>>> >             this.timeMillis = event.timeMillis;
>>>> > +            this.thrown = event.thrown;
>>>> >             this.thrownProxy = event.thrownProxy;
>>>> >             this.contextMap = event.contextMap;
>>>> >             this.contextStack = event.contextStack;
>>>> > @@ -513,9 +529,8 @@ public class Log4jLogEvent implements Lo
>>>> >          * @return Log4jLogEvent.
>>>> >          */
>>>> >         protected Object readResolve() {
>>>> > -            final Log4jLogEvent result = new
>>>> Log4jLogEvent(loggerName, marker, loggerFQCN,
>>>> > -                    level, message, thrownProxy, contextMap,
>>>> contextStack, threadName, source,
>>>> > -                    timeMillis);
>>>> > +            final Log4jLogEvent result = new
>>>> Log4jLogEvent(loggerName, marker, loggerFQCN, level, message, thrown,
>>>> > +                    thrownProxy, contextMap, contextStack,
>>>> threadName, source, timeMillis);
>>>> >             result.setEndOfBatch(isEndOfBatch);
>>>> >             result.setIncludeLocation(isLocationRequired);
>>>> >             return result;
>>>> >
>>>> > Modified:
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java?rev=1597291&r1=1597290&r2=1597291&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
>>>> (original)
>>>> > +++
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/impl/Log4jLogEventTest.java
>>>> Sat May 24 13:54:16 2014
>>>> > @@ -83,6 +83,37 @@ public class Log4jLogEventTest {
>>>> >         assertEquals(evt.isEndOfBatch(), evt2.isEndOfBatch());
>>>> >         assertEquals(evt.isIncludeLocation(),
>>>> evt2.isIncludeLocation());
>>>> >     }
>>>> > +
>>>> > +    @Test
>>>> > +    public void testJavaIoSerializableWithThrown() throws Exception
{
>>>> > +        final Error thrown = new InternalError("test error");
>>>> > +        final Log4jLogEvent evt = new Log4jLogEvent("some.test",
>>>> null, Strings.EMPTY,
>>>> > +                Level.INFO, new SimpleMessage("abc"), thrown);
>>>> > +
>>>> > +        final ByteArrayOutputStream arr = new
>>>> ByteArrayOutputStream();
>>>> > +        final ObjectOutputStream out = new ObjectOutputStream(arr);
>>>> > +        out.writeObject(evt);
>>>> > +
>>>> > +        final ByteArrayInputStream inArr = new
>>>> ByteArrayInputStream(arr.toByteArray());
>>>> > +        final ObjectInputStream in = new ObjectInputStream(inArr);
>>>> > +        final Log4jLogEvent evt2 = (Log4jLogEvent) in.readObject();
>>>> > +
>>>> > +        assertEquals(evt.getTimeMillis(), evt2.getTimeMillis());
>>>> > +        assertEquals(evt.getLoggerFqcn(), evt2.getLoggerFqcn());
>>>> > +        assertEquals(evt.getLevel(), evt2.getLevel());
>>>> > +        assertEquals(evt.getLoggerName(), evt2.getLoggerName());
>>>> > +        assertEquals(evt.getMarker(), evt2.getMarker());
>>>> > +        assertEquals(evt.getContextMap(), evt2.getContextMap());
>>>> > +        assertEquals(evt.getContextStack(), evt2.getContextStack());
>>>> > +        assertEquals(evt.getMessage(), evt2.getMessage());
>>>> > +        assertEquals(evt.getSource(), evt2.getSource());
>>>> > +        assertEquals(evt.getThreadName(), evt2.getThreadName());
>>>> > +        assertEquals(evt.getThrown().getClass(),
>>>> evt2.getThrown().getClass());
>>>> > +        assertEquals(evt.getThrown().getMessage(),
>>>> evt2.getThrown().getMessage());
>>>> > +        assertEquals(evt.getThrownProxy(), evt2.getThrownProxy());
>>>> > +        assertEquals(evt.isEndOfBatch(), evt2.isEndOfBatch());
>>>> > +        assertEquals(evt.isIncludeLocation(),
>>>> evt2.isIncludeLocation());
>>>> > +    }
>>>> >
>>>> >     @Test
>>>> >     public void testNullLevelReplacedWithOFF() throws Exception {
>>>> >
>>>> > Modified:
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java?rev=1597291&r1=1597290&r2=1597291&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java
>>>> (original)
>>>> > +++
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/JsonLayoutTest.java
>>>> Sat May 24 13:54:16 2014
>>>> > @@ -100,10 +100,11 @@ public class JsonLayoutTest {
>>>> >         assertTrue(str, str.contains(DQUOTE + name + DQUOTE +
>>>> propSep));
>>>> >     }
>>>> >
>>>> > -    private void testAllFeatures(final boolean includeSource, final
>>>> boolean compact, final boolean includeContext) throws Exception {
>>>> > +    private void testAllFeatures(final boolean includeSource, final
>>>> boolean compact, final boolean includeContext)
>>>> > +            throws Exception {
>>>> >         final Log4jLogEvent expected =
>>>> LogEventFixtures.createLogEvent();
>>>> > -        final AbstractJacksonLayout layout =
>>>> JsonLayout.createLayout(Boolean.toString(includeSource),
>>>> Boolean.toString(includeContext),
>>>> > -                "false", Boolean.toString(compact), "UTF-8");
>>>> > +        final AbstractJacksonLayout layout =
>>>> JsonLayout.createLayout(Boolean.toString(includeSource),
>>>> > +                Boolean.toString(includeContext), "false",
>>>> Boolean.toString(compact), "UTF-8");
>>>> >         final String str = layout.toSerializable(expected);
>>>> >         // System.out.println(str);
>>>> >         final String propSep = this.toPropertySeparator(compact);
>>>> > @@ -251,8 +252,8 @@ public class JsonLayoutTest {
>>>> >     @Test
>>>> >     public void testLayoutLoggerName() throws Exception {
>>>> >         final AbstractJacksonLayout layout =
>>>> JsonLayout.createLayout("false", null, "false", "true", "UTF-8");
>>>> > -        final Log4jLogEvent expected =
>>>> Log4jLogEvent.createEvent("a.B", null, "f.q.c.n", Level.DEBUG, new
>>>> SimpleMessage("M"), null, null,
>>>> > -                null, "threadName", null, 1);
>>>> > +        final Log4jLogEvent expected =
>>>> Log4jLogEvent.createEvent("a.B", null, "f.q.c.n", Level.DEBUG,
>>>> > +                new SimpleMessage("M"), null, null, null, null,
>>>> "threadName", null, 1);
>>>> >         final String str = layout.toSerializable(expected);
>>>> >         assertTrue(str, str.contains("\"loggerName\":\"a.B\""));
>>>> >         final Log4jLogEvent actual = new
>>>> Log4jJsonObjectMapper().readValue(str, Log4jLogEvent.class);
>>>> >
>>>> > Modified:
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/LogEventFixtures.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/LogEventFixtures.java?rev=1597291&r1=1597290&r2=1597291&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/LogEventFixtures.java
>>>> (original)
>>>> > +++
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/LogEventFixtures.java
>>>> Sat May 24 13:54:16 2014
>>>> > @@ -56,7 +56,7 @@ class LogEventFixtures {
>>>> >         final IOException ioException = new IOException("testIOEx",
>>>> cause);
>>>> >         Throwables.addSuppressed(ioException, new
>>>> IndexOutOfBoundsException("I am suppressed exception 1"));
>>>> >         Throwables.addSuppressed(ioException, new
>>>> IndexOutOfBoundsException("I am suppressed exception 2"));
>>>> > -        final ThrowableProxy throwable = new
>>>> ThrowableProxy(ioException);
>>>> > +        final ThrowableProxy throwableProxy = new
>>>> ThrowableProxy(ioException);
>>>> >         final Map<String, String> contextMap = new HashMap<String,
>>>> String>();
>>>> >         contextMap.put("MDC.A", "A_Value");
>>>> >         contextMap.put("MDC.B", "B_Value");
>>>> > @@ -64,13 +64,15 @@ class LogEventFixtures {
>>>> >         contextStack.clear();
>>>> >         contextStack.push("stack_msg1");
>>>> >         contextStack.add("stack_msg2");
>>>> > -        final Log4jLogEvent expected =
>>>> Log4jLogEvent.createEvent("a.B", cMarker, "f.q.c.n", Level.DEBUG, new
>>>> SimpleMessage("Msg"),
>>>> > -                throwable, contextMap, contextStack, "MyThreadName",
>>>> source, 1);
>>>> > +        final Log4jLogEvent expected =
>>>> Log4jLogEvent.createEvent("a.B", cMarker, "f.q.c.n", Level.DEBUG,
>>>> > +                new SimpleMessage("Msg"), ioException,
>>>> throwableProxy, contextMap, contextStack, "MyThreadName", source,
>>>> > +                1);
>>>> >         // validate event?
>>>> >         return expected;
>>>> >     }
>>>> >
>>>> > -    static void assertEqualLogEvents(final LogEvent expected, final
>>>> LogEvent actual, final boolean includeSource, final boolean includeContext)
>>>> {
>>>> > +    static void assertEqualLogEvents(final LogEvent expected, final
>>>> LogEvent actual, final boolean includeSource,
>>>> > +            final boolean includeContext) {
>>>> >         assertEquals(expected.getClass(), actual.getClass());
>>>> >         assertEquals(includeContext ? expected.getContextMap() :
>>>> Collections.EMPTY_MAP, actual.getContextMap());
>>>> >         assertEquals(expected.getContextStack(),
>>>> actual.getContextStack());
>>>> > @@ -82,13 +84,16 @@ class LogEventFixtures {
>>>> >         assertEquals(expected.getTimeMillis(),
>>>> actual.getTimeMillis());
>>>> >         assertEquals(includeSource ? expected.getSource() : null,
>>>> actual.getSource());
>>>> >         assertEquals(expected.getThreadName(),
>>>> actual.getThreadName());
>>>> > +        assertNotNull("original should have an exception",
>>>> expected.getThrown());
>>>> > +        assertNull("exception should not be serialized",
>>>> actual.getThrown());
>>>> >         assertEquals(expected.getThrownProxy(),
>>>> actual.getThrownProxy());
>>>> >         assertEquals(expected.isEndOfBatch(), actual.isEndOfBatch());
>>>> >         assertEquals(expected.isIncludeLocation(),
>>>> actual.isIncludeLocation());
>>>> > -        if (includeSource) {
>>>> > -            assertEquals(expected.hashCode(), actual.hashCode());
>>>> > -            assertEquals(expected, actual);
>>>> > -        }
>>>> > +
>>>> > +        // original: non-null thrown & null thrownProxy
>>>> > +        // deserialized: null thrown & non-null thrownProxy
>>>> > +        assertNotEquals(expected.hashCode(), actual.hashCode());
>>>> > +        assertNotEquals(expected, actual);
>>>> >     }
>>>> >
>>>> > }
>>>> >
>>>> > Modified:
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XmlLayoutTest.java
>>>> > URL:
>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XmlLayoutTest.java?rev=1597291&r1=1597290&r2=1597291&view=diff
>>>> >
>>>> ==============================================================================
>>>> > ---
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XmlLayoutTest.java
>>>> (original)
>>>> > +++
>>>> logging/log4j/log4j2/trunk/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/XmlLayoutTest.java
>>>> Sat May 24 13:54:16 2014
>>>> > @@ -256,8 +256,8 @@ public class XmlLayoutTest {
>>>> >     @Test
>>>> >     public void testLayoutLoggerName() {
>>>> >         final XmlLayout layout = XmlLayout.createLayout("false",
>>>> "true", "true", null, null);
>>>> > -        final Log4jLogEvent event = Log4jLogEvent.createEvent("a.B",
>>>> null, "f.q.c.n", Level.DEBUG, new SimpleMessage("M"), null, null,
>>>> > -                null, "threadName", null, 1);
>>>> > +        final Log4jLogEvent event = Log4jLogEvent.createEvent("a.B",
>>>> null, "f.q.c.n", Level.DEBUG,
>>>> > +                new SimpleMessage("M"), null, null, null, null,
>>>> "threadName", null, 1);
>>>> >         final String str = layout.toSerializable(event);
>>>> >         assertTrue(str, str.contains("loggerName=\"a.B\""));
>>>> >     }
>>>> >
>>>> > Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
>>>> > URL:
>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1597291&r1=1597290&r2=1597291&view=diff
>>>> >
>>>> ==============================================================================
>>>> > --- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
>>>> > +++ logging/log4j/log4j2/trunk/src/changes/changes.xml Sat May 24
>>>> 13:54:16 2014
>>>> > @@ -22,6 +22,9 @@
>>>> >   </properties>
>>>> >   <body>
>>>> >     <release version="2.0-rc2" date="2014-MM-DD" description="Bug
>>>> fixes and enhancements">
>>>> > +      <action issue="LOG4J2-250" dev="rpopma" type="update">
>>>> > +        Refactor Log4jLogEvent to lazily create ThrowableProxy.
>>>> > +      </action>
>>>> >       <action issue="LOG4J2-647" dev="ggregory" type="update">
>>>> >         Upgrade to Flume 1.5.0.
>>>> >       </action>
>>>> >
>>>> >
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
>>>> For additional commands, e-mail: log4j-dev-help@logging.apache.org
>>>>
>>>>
>>>
>>
>

Mime
View raw message