|
24 | 24 | */
|
25 | 25 | package co.elastic.logging;
|
26 | 26 |
|
27 |
| -import java.io.PrintWriter; |
28 |
| -import java.io.Writer; |
29 | 27 | import java.util.Map;
|
30 |
| -import java.util.regex.Pattern; |
31 | 28 |
|
32 | 29 | public class EcsJsonSerializer {
|
33 | 30 |
|
34 | 31 | private static final TimestampSerializer TIMESTAMP_SERIALIZER = new TimestampSerializer();
|
35 | 32 | private static final ThreadLocal<StringBuilder> messageStringBuilder = new ThreadLocal<StringBuilder>();
|
36 |
| - private static final String NEW_LINE = System.getProperty("line.separator"); |
37 |
| - private static final Pattern NEW_LINE_PATTERN = Pattern.compile("\\n"); |
38 | 33 |
|
39 | 34 | public static CharSequence toNullSafeString(final CharSequence s) {
|
40 | 35 | return s == null ? "" : s;
|
@@ -166,79 +161,21 @@ public static void serializeMDC(StringBuilder builder, Map<String, ?> properties
|
166 | 161 | }
|
167 | 162 |
|
168 | 163 | public static void serializeException(StringBuilder builder, Throwable thrown, boolean stackTraceAsArray) {
|
169 |
| - if (thrown != null) { |
170 |
| - builder.append("\"error.type\":\""); |
171 |
| - JsonUtils.quoteAsString(thrown.getClass().getName(), builder); |
172 |
| - builder.append("\","); |
173 |
| - |
174 |
| - String message = thrown.getMessage(); |
175 |
| - if (message != null) { |
176 |
| - builder.append("\"error.message\":\""); |
177 |
| - JsonUtils.quoteAsString(message, builder); |
178 |
| - builder.append("\","); |
179 |
| - } |
180 |
| - if (stackTraceAsArray) { |
181 |
| - builder.append("\"error.stack_trace\":[").append(NEW_LINE); |
182 |
| - formatThrowableAsArray(builder, thrown); |
183 |
| - builder.append("]"); |
184 |
| - } else { |
185 |
| - builder.append("\"error.stack_trace\":\""); |
186 |
| - JsonUtils.quoteAsString(formatThrowable(thrown), builder); |
187 |
| - builder.append("\""); |
188 |
| - } |
189 |
| - } |
| 164 | + serializeException(builder, thrown, stackTraceAsArray, DefaultThrowableSerializer.getInstance()); |
190 | 165 | }
|
191 | 166 |
|
192 |
| - public static void serializeException(StringBuilder builder, String exceptionClassName, String exceptionMessage, String stackTrace, boolean stackTraceAsArray) { |
193 |
| - builder.append("\"error.type\":\""); |
194 |
| - JsonUtils.quoteAsString(exceptionClassName, builder); |
195 |
| - builder.append("\","); |
196 |
| - builder.append("\"error.message\":\""); |
197 |
| - JsonUtils.quoteAsString(exceptionMessage, builder); |
198 |
| - builder.append("\","); |
199 |
| - if (stackTraceAsArray) { |
200 |
| - builder.append("\"error.stack_trace\":[").append(NEW_LINE); |
201 |
| - for (String line : NEW_LINE_PATTERN.split(stackTrace)) { |
202 |
| - appendQuoted(builder, line); |
203 |
| - } |
204 |
| - builder.append("]"); |
205 |
| - } else { |
206 |
| - builder.append("\"error.stack_trace\":\""); |
207 |
| - JsonUtils.quoteAsString(stackTrace, builder); |
208 |
| - builder.append("\""); |
| 167 | + public static void serializeException(StringBuilder builder, Throwable thrown, boolean stackTraceAsArray, ThrowableSerializer throwableSerializer) { |
| 168 | + if (thrown != null) { |
| 169 | + throwableSerializer.serialize(builder, thrown, stackTraceAsArray); |
209 | 170 | }
|
210 | 171 | }
|
211 | 172 |
|
212 |
| - private static void appendQuoted(StringBuilder builder, CharSequence content) { |
213 |
| - builder.append('"'); |
214 |
| - JsonUtils.quoteAsString(content, builder); |
215 |
| - builder.append('"'); |
216 |
| - } |
217 |
| - |
218 |
| - private static CharSequence formatThrowable(final Throwable throwable) { |
219 |
| - StringBuilder buffer = getMessageStringBuilder(); |
220 |
| - final PrintWriter pw = new PrintWriter(new StringBuilderWriter(buffer)); |
221 |
| - throwable.printStackTrace(pw); |
222 |
| - pw.flush(); |
223 |
| - return buffer; |
| 173 | + public static void serializeException(StringBuilder builder, String exceptionClassName, String exceptionMessage, String stackTrace, boolean stackTraceAsArray) { |
| 174 | + serializeException(builder, exceptionClassName, exceptionMessage, stackTrace, stackTraceAsArray, DefaultThrowableSerializer.getInstance()); |
224 | 175 | }
|
225 | 176 |
|
226 |
| - private static void formatThrowableAsArray(final StringBuilder jsonBuilder, final Throwable throwable) { |
227 |
| - final StringBuilder buffer = getMessageStringBuilder(); |
228 |
| - final PrintWriter pw = new PrintWriter(new StringBuilderWriter(buffer), true) { |
229 |
| - @Override |
230 |
| - public void println() { |
231 |
| - flush(); |
232 |
| - jsonBuilder.append("\t\""); |
233 |
| - JsonUtils.quoteAsString(buffer, jsonBuilder); |
234 |
| - jsonBuilder.append("\","); |
235 |
| - jsonBuilder.append(NEW_LINE); |
236 |
| - buffer.setLength(0); |
237 |
| - } |
238 |
| - }; |
239 |
| - throwable.printStackTrace(pw); |
240 |
| - removeIfEndsWith(jsonBuilder, NEW_LINE); |
241 |
| - removeIfEndsWith(jsonBuilder, ","); |
| 177 | + public static void serializeException(StringBuilder builder, String exceptionClassName, String exceptionMessage, String stackTrace, boolean stackTraceAsArray, ThrowableSerializer throwableSerializer) { |
| 178 | + throwableSerializer.serialize(builder, exceptionClassName, exceptionMessage, stackTrace, stackTraceAsArray); |
242 | 179 | }
|
243 | 180 |
|
244 | 181 | public static void removeIfEndsWith(StringBuilder sb, String ending) {
|
@@ -277,61 +214,4 @@ public static String computeEventDataset(String eventDataset, String serviceName
|
277 | 214 | }
|
278 | 215 | return eventDataset;
|
279 | 216 | }
|
280 |
| - |
281 |
| - private static class StringBuilderWriter extends Writer { |
282 |
| - |
283 |
| - private final StringBuilder buffer; |
284 |
| - |
285 |
| - StringBuilderWriter(StringBuilder buffer) { |
286 |
| - this.buffer = buffer; |
287 |
| - } |
288 |
| - |
289 |
| - @Override |
290 |
| - public Writer append(CharSequence csq) { |
291 |
| - buffer.append(csq); |
292 |
| - return this; |
293 |
| - } |
294 |
| - |
295 |
| - @Override |
296 |
| - public void write(String str) { |
297 |
| - buffer.append(str); |
298 |
| - } |
299 |
| - |
300 |
| - @Override |
301 |
| - public void write(String str, int off, int len) { |
302 |
| - buffer.append(str, off, len); |
303 |
| - } |
304 |
| - |
305 |
| - @Override |
306 |
| - public Writer append(CharSequence csq, int start, int end) { |
307 |
| - buffer.append(csq, start, end); |
308 |
| - return this; |
309 |
| - } |
310 |
| - |
311 |
| - @Override |
312 |
| - public Writer append(char c) { |
313 |
| - buffer.append(c); |
314 |
| - return this; |
315 |
| - } |
316 |
| - |
317 |
| - @Override |
318 |
| - public void write(int c) { |
319 |
| - buffer.append((char) c); |
320 |
| - } |
321 |
| - |
322 |
| - @Override |
323 |
| - public void write(char[] cbuf, int off, int len) { |
324 |
| - buffer.append(cbuf, off, len); |
325 |
| - } |
326 |
| - |
327 |
| - @Override |
328 |
| - public void flush() { |
329 |
| - |
330 |
| - } |
331 |
| - |
332 |
| - @Override |
333 |
| - public void close() { |
334 |
| - |
335 |
| - } |
336 |
| - } |
337 | 217 | }
|
0 commit comments