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.helpers.Constants;
22 import org.apache.logging.log4j.core.impl.ThrowableFormatOptions;
23
24 import java.io.PrintWriter;
25 import java.io.StringWriter;
26
27
28
29
30
31
32
33 @Plugin(name = "ThrowablePatternConverter", category = "Converter")
34 @ConverterKeys({"ex", "throwable", "exception" })
35 public class ThrowablePatternConverter extends LogEventPatternConverter {
36
37
38
39
40 protected final ThrowableFormatOptions options;
41
42
43
44
45
46
47
48 protected ThrowablePatternConverter(final String name, final String style, final String[] options) {
49 super(name, style);
50 this.options = ThrowableFormatOptions.newInstance(options);
51 }
52
53
54
55
56
57
58
59
60 public static ThrowablePatternConverter newInstance(final String[] options) {
61 return new ThrowablePatternConverter("Throwable", "throwable", options);
62 }
63
64
65
66
67 @Override
68 public void format(final LogEvent event, final StringBuilder toAppendTo) {
69 final Throwable t = event.getThrown();
70
71 if (t != null && options.anyLines()) {
72 final StringWriter w = new StringWriter();
73 t.printStackTrace(new PrintWriter(w));
74 final int len = toAppendTo.length();
75 if (len > 0 && !Character.isWhitespace(toAppendTo.charAt(len - 1))) {
76 toAppendTo.append(" ");
77 }
78 if (!options.allLines() || !Constants.LINE_SEP.equals(options.getSeparator())) {
79 final StringBuilder sb = new StringBuilder();
80 final String[] array = w.toString().split(Constants.LINE_SEP);
81 final int limit = options.minLines(array.length) - 1;
82 for (int i = 0; i <= limit; ++i) {
83 sb.append(array[i]);
84 if (i < limit) {
85 sb.append(options.getSeparator());
86 }
87 }
88 toAppendTo.append(sb.toString());
89
90 } else {
91 toAppendTo.append(w.toString());
92 }
93 }
94 }
95
96
97
98
99
100
101 @Override
102 public boolean handlesThrowable() {
103 return true;
104 }
105 }