Author: rgoers
Date: Sun Oct 28 23:24:41 2012
New Revision: 1403125
URL: http://svn.apache.org/viewvc?rev=1403125&view=rev
Log:
Fix LOG4J2-103 - The LogEvent was wrapping a ThrowableProxy with another
ThrowableProxy when deserializing.
Added:
logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
Modified:
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
logging/log4j/log4j2/trunk/src/changes/changes.xml
Modified:
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java?rev=1403125&r1=1403124&r2=1403125&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
(original)
+++
logging/log4j/log4j2/trunk/core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
Sun Oct 28 23:24:41 2012
@@ -103,7 +103,7 @@ public class Log4jLogEvent implements Lo
this.fqcnOfLogger = fqcn;
this.level = level;
this.message = message;
- this.throwable = t == null ? null : new ThrowableProxy(t);
+ this.throwable = (t == null ? null : (t instanceof ThrowableProxy ?
(ThrowableProxy)t : new ThrowableProxy(t)));
this.mdc = mdc;
this.ndc = ndc;
this.timestamp = message instanceof TimestampMessage ?
((TimestampMessage) message).getTimestamp() : timestamp;
Added:
logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java?rev=1403125&view=auto
==============================================================================
---
logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
(added)
+++
logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/core/appender/rewrite/MapRewritePolicyTest.java
Sun Oct 28 23:24:41 2012
@@ -0,0 +1,134 @@
+package org.apache.logging.log4j.core.appender.rewrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.MarkerManager;
+import org.apache.logging.log4j.ThreadContext;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.appender.rewrite.MapRewritePolicy;
+import org.apache.logging.log4j.core.helpers.KeyValuePair;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.core.impl.ThrowableProxy;
+import org.apache.logging.log4j.message.MapMessage;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.message.StructuredDataMessage;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+public class MapRewritePolicyTest {
+ private static Map<String, String> map = new HashMap<String, String>();
+ private static KeyValuePair[] rewrite;
+ private static LogEvent logEvent0, logEvent1, logEvent2, logEvent3;
+
+ @BeforeClass
+ public static void setupClass() {
+ map.put("test1", "one");
+ map.put("test2", "two");
+ logEvent0 = new Log4jLogEvent("test", null,
"MapRewritePolicyTest.setupClass()", Level.ERROR,
+ new SimpleMessage("Test"), new RuntimeException("test"), map, null,
"none",
+ new StackTraceElement("MapRewritePolicyTest", "setupClass",
"MapRewritePolicyTest", 28), 2);
+ logEvent1 = new Log4jLogEvent("test", null,
"MapRewritePolicyTest.setupClass()", Level.ERROR,
+ new MapMessage(map), null, map, null, "none",
+ new StackTraceElement("MapRewritePolicyTest", "setupClass",
"MapRewritePolicyTest", 29), 2);
+ logEvent2 = new Log4jLogEvent("test",
MarkerManager.getMarker("test"), "MapRewritePolicyTest.setupClass()",
+ Level.TRACE, new StructuredDataMessage("test", "Nothing", "test",
map), new RuntimeException("test"), null,
+ new ThreadContext.ImmutableStack(map.values()), "none", new
StackTraceElement("MapRewritePolicyTest",
+ "setupClass", "MapRewritePolicyTest", 30), 20000000);
+ logEvent3 = new Log4jLogEvent("test", null,
"MapRewritePolicyTest.setupClass()", Level.ALL, new MapMessage(map),
+ null, map, new ThreadContext.ImmutableStack(map.values()), null, new
StackTraceElement("MapRewritePolicyTest",
+ "setupClass", "MapRewritePolicyTest", 31), Long.MAX_VALUE);
+ rewrite = new KeyValuePair[] {new KeyValuePair("test2", "2"),
new KeyValuePair("test3", "three")};
+ }
+
+ @Test
+ public void addTest() {
+ MapRewritePolicy addPolicy =
MapRewritePolicy.createPolicy("Add", rewrite);
+ LogEvent rewritten = addPolicy.rewrite(logEvent0);
+ compareLogEvents(logEvent0, rewritten);
+ Assert.assertEquals("Simple log message changed",
logEvent0.getMessage(), rewritten.getMessage());
+
+ rewritten = addPolicy.rewrite(logEvent1);
+ compareLogEvents(logEvent1, rewritten);
+ checkAdded(((MapMessage)rewritten.getMessage()).getData());
+
+ rewritten = addPolicy.rewrite(logEvent2);
+ compareLogEvents(logEvent2, rewritten);
+ checkAdded(((MapMessage)rewritten.getMessage()).getData());
+
+ rewritten = addPolicy.rewrite(logEvent3);
+ compareLogEvents(logEvent3, rewritten);
+ checkAdded(((MapMessage)rewritten.getMessage()).getData());
+ }
+
+ @Test
+ public void updateTest() {
+ MapRewritePolicy updatePolicy =
MapRewritePolicy.createPolicy("Update", rewrite);
+ LogEvent rewritten = updatePolicy.rewrite(logEvent0);
+ compareLogEvents(logEvent0, rewritten);
+ Assert.assertEquals("Simple log message changed",
logEvent0.getMessage(), rewritten.getMessage());
+
+ rewritten = updatePolicy.rewrite(logEvent1);
+ compareLogEvents(logEvent1, rewritten);
+ checkUpdated(((MapMessage)rewritten.getMessage()).getData());
+
+ rewritten = updatePolicy.rewrite(logEvent2);
+ compareLogEvents(logEvent2, rewritten);
+ checkUpdated(((MapMessage)rewritten.getMessage()).getData());
+
+ rewritten = updatePolicy.rewrite(logEvent3);
+ compareLogEvents(logEvent3, rewritten);
+ checkUpdated(((MapMessage)rewritten.getMessage()).getData());
+ }
+
+ @Test
+ public void defaultIsAdd() {
+ MapRewritePolicy addPolicy =
MapRewritePolicy.createPolicy(null, rewrite);
+ LogEvent rewritten = addPolicy.rewrite(logEvent0);
+ compareLogEvents(logEvent0, rewritten);
+ Assert.assertEquals("Simple log message changed",
logEvent0.getMessage(), rewritten.getMessage());
+
+ rewritten = addPolicy.rewrite(logEvent1);
+ compareLogEvents(logEvent1, rewritten);
+ checkAdded(((MapMessage)rewritten.getMessage()).getData());
+
+ rewritten = addPolicy.rewrite(logEvent2);
+ compareLogEvents(logEvent2, rewritten);
+ checkAdded(((MapMessage)rewritten.getMessage()).getData());
+
+ rewritten = addPolicy.rewrite(logEvent3);
+ compareLogEvents(logEvent3, rewritten);
+ checkAdded(((MapMessage)rewritten.getMessage()).getData());
+ }
+
+ private void checkAdded(Map<String, String> addedMap) {
+ Assert.assertEquals("unwanted entry change", "one",
addedMap.get("test1"));
+ Assert.assertEquals("existing entry not updated", "2",
addedMap.get("test2"));
+ Assert.assertEquals("new entry not added", "three",
addedMap.get("test3"));
+ Assert.assertEquals("wrong size", 3, addedMap.size());
+ }
+
+ private void checkUpdated(Map<String, String> updatedMap) {
+ Assert.assertEquals("unwanted entry change", "one",
updatedMap.get("test1"));
+ Assert.assertEquals("existing entry not updated", "2",
updatedMap.get("test2"));
+ Assert.assertEquals("wrong size", 2, updatedMap.size());
+ }
+
+ private void compareLogEvents(LogEvent orig, LogEvent changed) {
+ // Ensure that everything but the Mapped Data is still the same
+ Assert.assertEquals("LoggerName changed", orig.getLoggerName(),
changed.getLoggerName());
+ Assert.assertEquals("Marker changed", orig.getMarker(),
changed.getMarker());
+ Assert.assertEquals("FQCN changed", orig.getFQCN(),
changed.getFQCN());
+ Assert.assertEquals("Level changed", orig.getLevel(),
changed.getLevel());
+ Assert.assertEquals("Thrown changed", (orig.getThrown() == null
? null : ((ThrowableProxy)orig.getThrown()).getExtendedStackTrace()),
+ (changed.getThrown() == null ? null :
((ThrowableProxy)changed.getThrown()).getExtendedStackTrace()));
+ Assert.assertEquals("ContextMap changed", orig.getContextMap(),
changed.getContextMap());
+ Assert.assertEquals("ContextStack changed",
orig.getContextStack(), changed.getContextStack());
+ Assert.assertEquals("ThreadName changed", orig.getThreadName(),
changed.getThreadName());
+ Assert.assertEquals("Source changed", orig.getSource(),
changed.getSource());
+ Assert.assertEquals("Millis changed", orig.getMillis(),
changed.getMillis());
+ }
+}
Modified: logging/log4j/log4j2/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/src/changes/changes.xml?rev=1403125&r1=1403124&r2=1403125&view=diff
==============================================================================
--- logging/log4j/log4j2/trunk/src/changes/changes.xml (original)
+++ logging/log4j/log4j2/trunk/src/changes/changes.xml Sun Oct 28 23:24:41 2012
@@ -23,6 +23,9 @@
<body>
<release version="2.0-beta3" date="TBD" description= "Bug fixes and
enhancements">
+ <action issue="LOG4J2-103" dev="rgoers" type="fix" due-to="Das Archive">
+ The LogEvent was wrapping a ThrowableProxy with another ThrowableProxy
when deserializing.
+ </action>
<action dev="rgoers" type="update">
Created combined jar to combine API and Core contents for users who
only want the Log4j implementation.
</action>