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