@@ -95,11 +95,11 @@ private void renderThrowable(
9595 buffer .append (']' );
9696 buffer .append (lineSeparator );
9797 } else {
98+ final Context .Metadata metadata = context .metadataByThrowable .get (throwable );
9899 renderThrowableMessage (buffer , throwable );
99100 buffer .append (lineSeparator );
100- renderStackTraceElements (buffer , throwable , context , prefix , lineSeparator );
101- renderSuppressed (
102- buffer , throwable .getSuppressed (), context , visitedThrowables , prefix + '\t' , lineSeparator );
101+ renderStackTraceElements (buffer , throwable , context , metadata , prefix , lineSeparator );
102+ renderSuppressed (buffer , metadata .suppressed , context , visitedThrowables , prefix + '\t' , lineSeparator );
103103 renderCause (buffer , throwable .getCause (), context , visitedThrowables , prefix , lineSeparator );
104104 }
105105 }
@@ -150,10 +150,10 @@ final void renderStackTraceElements(
150150 final StringBuilder buffer ,
151151 final Throwable throwable ,
152152 final C context ,
153+ final Context .Metadata metadata ,
153154 final String prefix ,
154155 final String lineSeparator ) {
155156 context .ignoredStackTraceElementCount = 0 ;
156- final Context .Metadata metadata = context .metadataByThrowable .get (throwable );
157157 final StackTraceElement [] stackTraceElements = throwable .getStackTrace ();
158158 for (int i = 0 ; i < metadata .stackLength ; i ++) {
159159 renderStackTraceElement (buffer , stackTraceElements [i ], context , prefix , lineSeparator );
@@ -268,9 +268,19 @@ static final class Metadata {
268268 */
269269 final int stackLength ;
270270
271- private Metadata (final int commonElementCount , final int stackLength ) {
271+ /**
272+ * The suppressed exceptions attached to this {@link Throwable}.
273+ * This needs to be captured separately since {@link Throwable#getSuppressed()} can change.
274+ *
275+ * @see <a href="https://github.com/apache/logging-log4j2/issues/3929">#3929</a>
276+ * @see <a href="https://github.com/apache/logging-log4j2/pull/3934">#3934</a>
277+ */
278+ final Throwable [] suppressed ;
279+
280+ private Metadata (final int commonElementCount , final int stackLength , final Throwable [] suppressed ) {
272281 this .commonElementCount = commonElementCount ;
273282 this .stackLength = stackLength ;
283+ this .suppressed = suppressed ;
274284 }
275285
276286 static Map <Throwable , Metadata > ofThrowable (final Throwable throwable ) {
@@ -288,11 +298,12 @@ private static void populateMetadata(
288298 // Populate metadata of the current throwable
289299 @ Nullable
290300 final StackTraceElement [] rootTrace = parentThrowable == null ? null : parentThrowable .getStackTrace ();
291- final Metadata metadata = populateMetadata (rootTrace , throwable .getStackTrace ());
301+ final Metadata metadata =
302+ populateMetadata (rootTrace , throwable .getStackTrace (), throwable .getSuppressed ());
292303 metadataByThrowable .put (throwable , metadata );
293304
294305 // Populate metadata of suppressed exceptions
295- for (final Throwable suppressed : throwable . getSuppressed () ) {
306+ for (final Throwable suppressed : metadata . suppressed ) {
296307 if (!visitedThrowables .contains (suppressed )) {
297308 visitedThrowables .add (suppressed );
298309 populateMetadata (metadataByThrowable , visitedThrowables , throwable , suppressed );
@@ -308,7 +319,9 @@ private static void populateMetadata(
308319 }
309320
310321 private static Metadata populateMetadata (
311- @ Nullable final StackTraceElement [] parentTrace , final StackTraceElement [] currentTrace ) {
322+ @ Nullable final StackTraceElement [] parentTrace ,
323+ final StackTraceElement [] currentTrace ,
324+ final Throwable [] suppressed ) {
312325 int commonElementCount ;
313326 int stackLength ;
314327 if (parentTrace != null ) {
@@ -326,7 +339,7 @@ private static Metadata populateMetadata(
326339 commonElementCount = 0 ;
327340 stackLength = currentTrace .length ;
328341 }
329- return new Metadata (commonElementCount , stackLength );
342+ return new Metadata (commonElementCount , stackLength , suppressed );
330343 }
331344 }
332345 }
0 commit comments