@@ -208,22 +208,21 @@ public static void serializeException(StringBuilder builder, Throwable thrown, b
208208 if (thrown != null ) {
209209 builder .append ("\" error.type\" :\" " );
210210 JsonUtils .quoteAsString (thrown .getClass ().getName (), builder );
211- builder .append (" \" ," );
211+ builder .append ('\"' );
212212
213213 String message = thrown .getMessage ();
214214 if (message != null ) {
215- builder .append ("\" error.message\" :\" " );
215+ builder .append (", \" error.message\" :\" " );
216216 JsonUtils .quoteAsString (message , builder );
217- builder .append (" \" ," );
217+ builder .append ('\"' );
218218 }
219- if (stackTraceAsArray ) {
220- builder .append ("\" error.stack_trace\" :[" ).append (NEW_LINE );
221- formatThrowableAsArray (builder , thrown );
222- builder .append ("]" );
219+
220+ int prevLength = builder .length ();
221+ builder .append (",\" error.stack_trace\" :" ).append (stackTraceAsArray ? '[' : "\" " );
222+ if (formatThrowable (builder , thrown , stackTraceAsArray )) {
223+ builder .append (stackTraceAsArray ? ']' : '\"' );
223224 } else {
224- builder .append ("\" error.stack_trace\" :\" " );
225- JsonUtils .quoteAsString (formatThrowable (thrown ), builder );
226- builder .append ("\" " );
225+ builder .setLength (prevLength ); // reset if no stacktrace was written
227226 }
228227 }
229228 }
@@ -249,30 +248,38 @@ public static void serializeException(StringBuilder builder, String exceptionCla
249248 }
250249 }
251250
252- private static CharSequence formatThrowable (final Throwable throwable ) {
253- StringBuilder buffer = getMessageStringBuilder ();
254- final PrintWriter pw = new PrintWriter (new StringBuilderWriter (buffer ));
255- throwable .printStackTrace (pw );
256- pw .flush ();
257- return buffer ;
258- }
259-
260- private static void formatThrowableAsArray (final StringBuilder jsonBuilder , final Throwable throwable ) {
251+ private static boolean formatThrowable (final StringBuilder jsonBuilder , final Throwable throwable , final boolean stackTraceAsArray ) {
261252 final StringBuilder buffer = getMessageStringBuilder ();
253+ final int initialLength = jsonBuilder .length ();
262254 final PrintWriter pw = new PrintWriter (new StringBuilderWriter (buffer ), true ) {
255+ private int lines = 0 ;
256+
263257 @ Override
264258 public void println () {
265259 flush ();
266- jsonBuilder .append ("\t \" " );
267- JsonUtils .quoteAsString (buffer , jsonBuilder );
268- jsonBuilder .append ("\" ," );
269- jsonBuilder .append (NEW_LINE );
260+ if (stackTraceAsArray ) {
261+ if (lines > 0 ) jsonBuilder .append (',' );
262+ jsonBuilder .append (NEW_LINE ).append ("\t \" " );
263+ JsonUtils .quoteAsString (buffer , jsonBuilder );
264+ jsonBuilder .append ('\"' );
265+ } else {
266+ JsonUtils .quoteAsString (buffer , jsonBuilder );
267+ JsonUtils .quoteAsString (NEW_LINE , jsonBuilder );
268+ }
270269 buffer .setLength (0 );
270+ lines ++;
271+ }
272+
273+ @ Override
274+ public void close () {
275+ if (lines <= 1 ) {
276+ jsonBuilder .setLength (initialLength ); // skip the first line (message) if no stacktrace follows
277+ }
271278 }
272279 };
273280 throwable .printStackTrace (pw );
274- removeIfEndsWith ( jsonBuilder , NEW_LINE );
275- removeIfEndsWith ( jsonBuilder , "," ) ;
281+ pw . close ( );
282+ return jsonBuilder . length () > initialLength ;
276283 }
277284
278285 private static void formatStackTraceAsArray (StringBuilder builder , CharSequence stackTrace ) {
0 commit comments