23
23
import org .slf4j .Marker ;
24
24
import org .slf4j .event .KeyValuePair ;
25
25
26
+ import java .util .Arrays ;
26
27
import java .util .List ;
27
28
import java .util .Map ;
28
29
import java .util .Set ;
@@ -108,7 +109,6 @@ public class JsonEncoder extends EncoderBase<ILoggingEvent> {
108
109
private boolean withTimestamp = true ;
109
110
private boolean withNanoseconds = true ;
110
111
111
-
112
112
private boolean withLevel = true ;
113
113
private boolean withThreadName = true ;
114
114
private boolean withLoggerName = true ;
@@ -121,7 +121,6 @@ public class JsonEncoder extends EncoderBase<ILoggingEvent> {
121
121
private boolean withThrowable = true ;
122
122
private boolean withFormattedMessage = false ;
123
123
124
-
125
124
@ Override
126
125
public byte [] headerBytes () {
127
126
return EMPTY_BYTES ;
@@ -135,39 +134,40 @@ public byte[] encode(ILoggingEvent event) {
135
134
136
135
if (withSequenceNumber ) {
137
136
appenderMemberWithLongValue (sb , SEQUENCE_NUMBER_ATTR_NAME , event .getSequenceNumber ());
138
- sb .append (VALUE_SEPARATOR );
139
137
}
140
138
141
139
if (withTimestamp ) {
140
+ appendValueSeparator (sb , withSequenceNumber );
142
141
appenderMemberWithLongValue (sb , TIMESTAMP_ATTR_NAME , event .getTimeStamp ());
143
- sb .append (VALUE_SEPARATOR );
144
142
}
145
143
146
144
if (withNanoseconds ) {
145
+ appendValueSeparator (sb , withSequenceNumber , withTimestamp );
147
146
appenderMemberWithLongValue (sb , NANOSECONDS_ATTR_NAME , event .getNanoseconds ());
148
- sb .append (VALUE_SEPARATOR );
149
147
}
150
148
151
149
if (withLevel ) {
150
+ appendValueSeparator (sb , withNanoseconds , withSequenceNumber , withTimestamp );
152
151
String levelStr = event .getLevel () != null ? event .getLevel ().levelStr : NULL_STR ;
153
152
appenderMember (sb , LEVEL_ATTR_NAME , levelStr );
154
- sb .append (VALUE_SEPARATOR );
155
153
}
156
154
157
155
if (withThreadName ) {
156
+ appendValueSeparator (sb , withLevel , withNanoseconds , withSequenceNumber , withTimestamp );
158
157
appenderMember (sb , THREAD_NAME_ATTR_NAME , jsonEscape (event .getThreadName ()));
159
- sb .append (VALUE_SEPARATOR );
160
158
}
161
159
162
160
if (withLoggerName ) {
161
+ appendValueSeparator (sb , withThreadName , withLevel , withNanoseconds , withSequenceNumber , withTimestamp );
163
162
appenderMember (sb , LOGGER_ATTR_NAME , event .getLoggerName ());
164
- sb .append (VALUE_SEPARATOR );
165
163
}
166
164
167
165
if (withContext ) {
168
- appendLoggerContext ( sb , event . getLoggerContextVO ());
166
+ // at this stage we assume that at least one field was written
169
167
sb .append (VALUE_SEPARATOR );
168
+ appendLoggerContext (sb , event .getLoggerContextVO ());
170
169
}
170
+
171
171
if (withMarkers )
172
172
appendMarkers (sb , event );
173
173
@@ -178,17 +178,18 @@ public byte[] encode(ILoggingEvent event) {
178
178
appendKeyValuePairs (sb , event );
179
179
180
180
if (withMessage ) {
181
- appenderMember (sb , MESSAGE_ATTR_NAME , jsonEscape (event .getMessage ()));
182
181
sb .append (VALUE_SEPARATOR );
182
+ appenderMember (sb , MESSAGE_ATTR_NAME , jsonEscape (event .getMessage ()));
183
183
}
184
184
185
185
if (withFormattedMessage ) {
186
- appenderMember (sb , FORMATTED_MESSAGE_ATTR_NAME , jsonEscape (event .getFormattedMessage ()));
187
186
sb .append (VALUE_SEPARATOR );
187
+ appenderMember (sb , FORMATTED_MESSAGE_ATTR_NAME , jsonEscape (event .getFormattedMessage ()));
188
188
}
189
189
190
- if (withArguments )
190
+ if (withArguments ) {
191
191
appendArgumentArray (sb , event );
192
+ }
192
193
193
194
if (withThrowable )
194
195
appendThrowableProxy (sb , THROWABLE_ATTR_NAME , event .getThrowableProxy ());
@@ -198,6 +199,19 @@ public byte[] encode(ILoggingEvent event) {
198
199
return sb .toString ().getBytes (UTF_8_CHARSET );
199
200
}
200
201
202
+ void appendValueSeparator (StringBuilder sb , boolean ... subsequentConditionals ) {
203
+ boolean enabled = false ;
204
+ for (boolean subsequent : subsequentConditionals ) {
205
+ if (subsequent ) {
206
+ enabled = true ;
207
+ break ;
208
+ }
209
+ }
210
+
211
+ if (enabled )
212
+ sb .append (VALUE_SEPARATOR );
213
+ }
214
+
201
215
private void appendLoggerContext (StringBuilder sb , LoggerContextVO loggerContextVO ) {
202
216
203
217
sb .append (QUOTE ).append (CONTEXT_ATTR_NAME ).append (QUOTE_COL );
@@ -240,6 +254,13 @@ private void appendMap(StringBuilder sb, String attrName, Map<String, String> ma
240
254
}
241
255
242
256
private void appendThrowableProxy (StringBuilder sb , String attributeName , IThrowableProxy itp ) {
257
+ appendThrowableProxy (sb , attributeName , itp , true );
258
+ }
259
+
260
+ private void appendThrowableProxy (StringBuilder sb , String attributeName , IThrowableProxy itp , boolean appendValueSeparator ) {
261
+
262
+ if (appendValueSeparator )
263
+ sb .append (VALUE_SEPARATOR );
243
264
244
265
// in the nominal case, attributeName != null. However, attributeName will be null for suppressed
245
266
// IThrowableProxy array, in which case no attribute name is needed
@@ -273,7 +294,6 @@ private void appendThrowableProxy(StringBuilder sb, String attributeName, IThrow
273
294
274
295
IThrowableProxy cause = itp .getCause ();
275
296
if (cause != null ) {
276
- sb .append (VALUE_SEPARATOR );
277
297
appendThrowableProxy (sb , CAUSE_ATTR_NAME , cause );
278
298
}
279
299
@@ -282,14 +302,12 @@ private void appendThrowableProxy(StringBuilder sb, String attributeName, IThrow
282
302
sb .append (VALUE_SEPARATOR );
283
303
sb .append (QUOTE ).append (SUPPRESSED_ATTR_NAME ).append (QUOTE_COL );
284
304
sb .append (OPEN_ARRAY );
305
+
285
306
boolean first = true ;
286
307
for (IThrowableProxy suppressedITP : suppressedArray ) {
287
- if (first ) {
308
+ appendThrowableProxy (sb , null , suppressedITP , !first );
309
+ if (first )
288
310
first = false ;
289
- } else {
290
- sb .append (VALUE_SEPARATOR );
291
- }
292
- appendThrowableProxy (sb , null , suppressedITP );
293
311
}
294
312
sb .append (CLOSE_ARRAY );
295
313
}
@@ -350,6 +368,7 @@ private void appendKeyValuePairs(StringBuilder sb, ILoggingEvent event) {
350
368
if (kvpList == null || kvpList .isEmpty ())
351
369
return ;
352
370
371
+ sb .append (VALUE_SEPARATOR );
353
372
sb .append (QUOTE ).append (KEY_VALUE_PAIRS_ATTR_NAME ).append (QUOTE_COL ).append (SP ).append (OPEN_ARRAY );
354
373
final int len = kvpList .size ();
355
374
for (int i = 0 ; i < len ; i ++) {
@@ -361,14 +380,14 @@ private void appendKeyValuePairs(StringBuilder sb, ILoggingEvent event) {
361
380
sb .append (CLOSE_OBJ );
362
381
}
363
382
sb .append (CLOSE_ARRAY );
364
- sb .append (VALUE_SEPARATOR );
365
383
}
366
384
367
385
private void appendArgumentArray (StringBuilder sb , ILoggingEvent event ) {
368
386
Object [] argumentArray = event .getArgumentArray ();
369
387
if (argumentArray == null )
370
388
return ;
371
389
390
+ sb .append (VALUE_SEPARATOR );
372
391
sb .append (QUOTE ).append (ARGUMENT_ARRAY_ATTR_NAME ).append (QUOTE_COL ).append (SP ).append (OPEN_ARRAY );
373
392
final int len = argumentArray .length ;
374
393
for (int i = 0 ; i < len ; i ++) {
@@ -378,14 +397,14 @@ private void appendArgumentArray(StringBuilder sb, ILoggingEvent event) {
378
397
379
398
}
380
399
sb .append (CLOSE_ARRAY );
381
- sb .append (VALUE_SEPARATOR );
382
400
}
383
401
384
402
private void appendMarkers (StringBuilder sb , ILoggingEvent event ) {
385
403
List <Marker > markerList = event .getMarkerList ();
386
404
if (markerList == null )
387
405
return ;
388
406
407
+ sb .append (VALUE_SEPARATOR );
389
408
sb .append (QUOTE ).append (MARKERS_ATTR_NAME ).append (QUOTE_COL ).append (SP ).append (OPEN_ARRAY );
390
409
final int len = markerList .size ();
391
410
for (int i = 0 ; i < len ; i ++) {
@@ -395,8 +414,6 @@ private void appendMarkers(StringBuilder sb, ILoggingEvent event) {
395
414
396
415
}
397
416
sb .append (CLOSE_ARRAY );
398
- sb .append (VALUE_SEPARATOR );
399
-
400
417
}
401
418
402
419
private String jsonEscapedToString (Object o ) {
@@ -419,7 +436,7 @@ private String jsonEscape(String s) {
419
436
420
437
private void appendMDC (StringBuilder sb , ILoggingEvent event ) {
421
438
Map <String , String > map = event .getMDCPropertyMap ();
422
-
439
+ sb . append ( VALUE_SEPARATOR );
423
440
sb .append (QUOTE ).append (MDC_ATTR_NAME ).append (QUOTE_COL ).append (SP ).append (OPEN_OBJ );
424
441
if (isNotEmptyMap (map )) {
425
442
Set <Map .Entry <String , String >> entrySet = map .entrySet ();
@@ -433,8 +450,6 @@ private void appendMDC(StringBuilder sb, ILoggingEvent event) {
433
450
434
451
}
435
452
sb .append (CLOSE_OBJ );
436
- sb .append (VALUE_SEPARATOR );
437
-
438
453
}
439
454
440
455
boolean isNotEmptyMap (Map map ) {
0 commit comments