1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.pattern;
18
19 import org.apache.logging.log4j.core.LogEvent;
20 import org.apache.logging.log4j.core.config.plugins.Plugin;
21 import org.apache.logging.log4j.core.impl.ThrowableProxy;
22
23
24
25
26
27
28
29
30
31 @Plugin(name = "ExtendedThrowablePatternConverter", type = "Converter")
32 @ConverterKeys({"xEx", "xThrowable", "xException" })
33 public final class ExtendedThrowablePatternConverter extends ThrowablePatternConverter {
34
35
36
37
38
39 private ExtendedThrowablePatternConverter(final String[] options) {
40 super("ExtendedThrowable", "throwable", options);
41 }
42
43
44
45
46
47
48
49
50 public static ExtendedThrowablePatternConverter newInstance(
51 final String[] options) {
52 return new ExtendedThrowablePatternConverter(options);
53 }
54
55
56
57
58 public void format(final LogEvent event, final StringBuilder toAppendTo) {
59 Throwable throwable = event.getThrown();
60 if (throwable != null) {
61 if (!(throwable instanceof ThrowableProxy)) {
62 super.format(event, toAppendTo);
63 return;
64 }
65 ThrowableProxy t = (ThrowableProxy) throwable;
66 String trace = t.getExtendedStackTrace();
67 int len = toAppendTo.length();
68 if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
69 toAppendTo.append(" ");
70 }
71 if (lines > 0) {
72 StringBuilder sb = new StringBuilder();
73 String[] array = trace.split("\n");
74 for (int i = 0; i < lines; ++i) {
75 sb.append(array[i]).append("\n");
76 }
77 toAppendTo.append(sb.toString());
78
79 } else {
80 toAppendTo.append(trace);
81 }
82 }
83 }
84 }