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
22 import java.io.PrintWriter;
23 import java.io.StringWriter;
24
25
26
27
28
29
30
31 @Plugin(name = "ThrowablePatternConverter", type = "Converter")
32 @ConverterKeys({"ex", "throwable", "exception" })
33 public class ThrowablePatternConverter extends LogEventPatternConverter {
34
35
36
37
38 protected static final String NONE = "none";
39
40
41
42 protected static final String FULL = "full";
43
44
45
46 protected static final String SHORT = "short";
47
48
49
50
51
52 protected final String option;
53
54
55
56
57 protected final int lines;
58
59
60
61
62
63
64
65 protected ThrowablePatternConverter(final String name, final String style, final String[] options) {
66 super(name, style);
67 int count = Integer.MAX_VALUE;
68 if (options != null && options.length > 0) {
69 option = options[0];
70 if (option == null) {
71 } else if (option.equalsIgnoreCase(NONE)) {
72 count = 0;
73 } else if (option.equalsIgnoreCase(SHORT)) {
74 count = 2;
75 } else if (!option.equalsIgnoreCase(FULL)) {
76 count = Integer.parseInt(option);
77 }
78
79 } else {
80 option = null;
81 }
82 lines = count;
83 }
84
85
86
87
88
89
90
91
92 public static ThrowablePatternConverter newInstance(final String[] options) {
93 return new ThrowablePatternConverter("Throwable", "throwable", options);
94 }
95
96
97
98
99 @Override
100 public void format(final LogEvent event, final StringBuilder toAppendTo) {
101 final Throwable t = event.getThrown();
102
103 if (t != null && lines > 0) {
104 final StringWriter w = new StringWriter();
105 t.printStackTrace(new PrintWriter(w));
106 final int len = toAppendTo.length();
107 if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
108 toAppendTo.append(" ");
109 }
110 if (lines != Integer.MAX_VALUE) {
111 final StringBuilder sb = new StringBuilder();
112 final String[] array = w.toString().split("\n");
113 final int limit = lines > array.length ? array.length : lines;
114 for (int i = 0; i < limit; ++i) {
115 sb.append(array[i]).append("\n");
116 }
117 toAppendTo.append(sb.toString());
118
119 } else {
120 toAppendTo.append(w.toString());
121 }
122 }
123 }
124
125
126
127
128
129
130 @Override
131 public boolean handlesThrowable() {
132 return true;
133 }
134 }