1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.logging.log4j.core.pattern;
19
20 import java.util.List;
21
22 import org.apache.logging.log4j.core.LogEvent;
23 import org.apache.logging.log4j.core.appender.AbstractAppender;
24 import org.apache.logging.log4j.core.config.Configuration;
25 import org.apache.logging.log4j.core.config.plugins.Plugin;
26 import org.apache.logging.log4j.core.layout.PatternLayout;
27 import org.apache.logging.log4j.util.PerformanceSensitive;
28
29
30
31
32
33
34
35
36
37
38 @Plugin(name = "maxLength", category = PatternConverter.CATEGORY)
39 @ConverterKeys({"maxLength", "maxLen"})
40 @PerformanceSensitive("allocation")
41 public final class MaxLengthConverter extends LogEventPatternConverter {
42
43
44
45
46
47
48
49
50 public static MaxLengthConverter newInstance(final Configuration config, final String[] options) {
51 if (options.length != 2) {
52 LOGGER.error("Incorrect number of options on maxLength: expected 2 received {}: {}", options.length,
53 options);
54 return null;
55 }
56 if (options[0] == null) {
57 LOGGER.error("No pattern supplied on maxLength");
58 return null;
59 }
60 if (options[1] == null) {
61 LOGGER.error("No length supplied on maxLength");
62 return null;
63 }
64 final PatternParser parser = PatternLayout.createPatternParser(config);
65 final List<PatternFormatter> formatters = parser.parse(options[0]);
66 return new MaxLengthConverter(formatters, AbstractAppender.parseInt(options[1], 100));
67 }
68
69
70 private final List<PatternFormatter> formatters;
71 private final int maxLength;
72
73
74
75
76
77
78
79 private MaxLengthConverter(final List<PatternFormatter> formatters, final int maxLength) {
80 super("MaxLength", "maxLength");
81 this.maxLength = maxLength;
82 this.formatters = formatters;
83 LOGGER.trace("new MaxLengthConverter with {}", maxLength);
84 }
85
86
87 @Override
88 public void format(final LogEvent event, final StringBuilder toAppendTo) {
89 final int initialLength = toAppendTo.length();
90 for (int i = 0; i < formatters.size(); i++) {
91 final PatternFormatter formatter = formatters.get(i);
92 formatter.format(event, toAppendTo);
93 if (toAppendTo.length() > initialLength + maxLength) {
94 break;
95 }
96 }
97 if (toAppendTo.length() > initialLength + maxLength) {
98 toAppendTo.setLength(initialLength + maxLength);
99 if (maxLength > 20) {
100 toAppendTo.append("...");
101 }
102 }
103 }
104 }