diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java index 3897721..2357093 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverter.java @@ -64,7 +64,7 @@ public final class ExtendedThrowablePatternConverter extends ThrowablePatternCon proxy = ((Log4jLogEvent) event).getThrownProxy(); } final Throwable throwable = event.getThrown(); - if (throwable != null && options.anyLines()) { + if ((throwable != null || proxy != null) && options.anyLines()) { if (proxy == null) { super.format(event, toAppendTo); return; diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverterTest.java index 9edc98a..703a5b6 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverterTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/ExtendedThrowablePatternConverterTest.java @@ -22,6 +22,7 @@ import java.io.StringWriter; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.impl.Log4jLogEvent; +import org.apache.logging.log4j.core.impl.ThrowableProxy; import org.apache.logging.log4j.message.SimpleMessage; import org.apache.logging.log4j.util.Strings; import org.junit.Test; @@ -65,4 +66,21 @@ public class ExtendedThrowablePatternConverterTest { final String result = sb.toString(); assertTrue("No suppressed lines", result.contains(" suppressed ")); } + + @Test + public void testDeserializedLogEventWithThrowableProxyButNoThrowable() { + final ExtendedThrowablePatternConverter converter = ExtendedThrowablePatternConverter.newInstance(null); + final Throwable originalThrowable = new Exception("something bad happened"); + final ThrowableProxy throwableProxy = new ThrowableProxy(originalThrowable); + final Throwable deserializedThrowable = null; + final LogEvent event = Log4jLogEvent.createEvent( + "testLogger", null, this.getClass().getName(), Level.DEBUG, + new SimpleMessage(""), deserializedThrowable, throwableProxy, + null, null, null, null, 0); + final StringBuilder sb = new StringBuilder(); + converter.format(event, sb); + String result = sb.toString(); + assertTrue(result.contains(originalThrowable.getMessage())); + assertTrue(result.contains(originalThrowable.getStackTrace()[0].getMethodName())); + } }