@@ -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