@@ -95,11 +95,11 @@ private void renderThrowable(
95
95
buffer .append (']' );
96
96
buffer .append (lineSeparator );
97
97
} else {
98
+ final Context .Metadata metadata = context .metadataByThrowable .get (throwable );
98
99
renderThrowableMessage (buffer , throwable );
99
100
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 );
103
103
renderCause (buffer , throwable .getCause (), context , visitedThrowables , prefix , lineSeparator );
104
104
}
105
105
}
@@ -150,10 +150,10 @@ final void renderStackTraceElements(
150
150
final StringBuilder buffer ,
151
151
final Throwable throwable ,
152
152
final C context ,
153
+ final Context .Metadata metadata ,
153
154
final String prefix ,
154
155
final String lineSeparator ) {
155
156
context .ignoredStackTraceElementCount = 0 ;
156
- final Context .Metadata metadata = context .metadataByThrowable .get (throwable );
157
157
final StackTraceElement [] stackTraceElements = throwable .getStackTrace ();
158
158
for (int i = 0 ; i < metadata .stackLength ; i ++) {
159
159
renderStackTraceElement (buffer , stackTraceElements [i ], context , prefix , lineSeparator );
@@ -268,9 +268,19 @@ static final class Metadata {
268
268
*/
269
269
final int stackLength ;
270
270
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 ) {
272
281
this .commonElementCount = commonElementCount ;
273
282
this .stackLength = stackLength ;
283
+ this .suppressed = suppressed ;
274
284
}
275
285
276
286
static Map <Throwable , Metadata > ofThrowable (final Throwable throwable ) {
@@ -288,11 +298,12 @@ private static void populateMetadata(
288
298
// Populate metadata of the current throwable
289
299
@ Nullable
290
300
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 ());
292
303
metadataByThrowable .put (throwable , metadata );
293
304
294
305
// Populate metadata of suppressed exceptions
295
- for (final Throwable suppressed : throwable . getSuppressed () ) {
306
+ for (final Throwable suppressed : metadata . suppressed ) {
296
307
if (!visitedThrowables .contains (suppressed )) {
297
308
visitedThrowables .add (suppressed );
298
309
populateMetadata (metadataByThrowable , visitedThrowables , throwable , suppressed );
@@ -308,7 +319,9 @@ private static void populateMetadata(
308
319
}
309
320
310
321
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 ) {
312
325
int commonElementCount ;
313
326
int stackLength ;
314
327
if (parentTrace != null ) {
@@ -326,7 +339,7 @@ private static Metadata populateMetadata(
326
339
commonElementCount = 0 ;
327
340
stackLength = currentTrace .length ;
328
341
}
329
- return new Metadata (commonElementCount , stackLength );
342
+ return new Metadata (commonElementCount , stackLength , suppressed );
330
343
}
331
344
}
332
345
}
0 commit comments