@@ -208,22 +208,21 @@ public static void serializeException(StringBuilder builder, Throwable thrown, b
208
208
if (thrown != null ) {
209
209
builder .append ("\" error.type\" :\" " );
210
210
JsonUtils .quoteAsString (thrown .getClass ().getName (), builder );
211
- builder .append (" \" ," );
211
+ builder .append ('\"' );
212
212
213
213
String message = thrown .getMessage ();
214
214
if (message != null ) {
215
- builder .append ("\" error.message\" :\" " );
215
+ builder .append (", \" error.message\" :\" " );
216
216
JsonUtils .quoteAsString (message , builder );
217
- builder .append (" \" ," );
217
+ builder .append ('\"' );
218
218
}
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 ? ']' : '\"' );
223
224
} 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
227
226
}
228
227
}
229
228
}
@@ -249,30 +248,38 @@ public static void serializeException(StringBuilder builder, String exceptionCla
249
248
}
250
249
}
251
250
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 ) {
261
252
final StringBuilder buffer = getMessageStringBuilder ();
253
+ final int initialLength = jsonBuilder .length ();
262
254
final PrintWriter pw = new PrintWriter (new StringBuilderWriter (buffer ), true ) {
255
+ private int lines = 0 ;
256
+
263
257
@ Override
264
258
public void println () {
265
259
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
+ }
270
269
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
+ }
271
278
}
272
279
};
273
280
throwable .printStackTrace (pw );
274
- removeIfEndsWith ( jsonBuilder , NEW_LINE );
275
- removeIfEndsWith ( jsonBuilder , "," ) ;
281
+ pw . close ( );
282
+ return jsonBuilder . length () > initialLength ;
276
283
}
277
284
278
285
private static void formatStackTraceAsArray (StringBuilder builder , CharSequence stackTrace ) {
0 commit comments