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 java.util.List;
20
21 import org.apache.logging.log4j.core.LogEvent;
22 import org.apache.logging.log4j.core.config.Configuration;
23 import org.apache.logging.log4j.core.config.plugins.Plugin;
24 import org.apache.logging.log4j.core.layout.PatternLayout;
25 import org.apache.logging.log4j.util.PerformanceSensitive;
26
27
28
29
30 @Plugin(name = "notEmpty", category = PatternConverter.CATEGORY)
31 @ConverterKeys({ "notEmpty", "varsNotEmpty", "variablesNotEmpty", })
32 @PerformanceSensitive("allocation")
33 public final class VariablesNotEmptyReplacementConverter extends LogEventPatternConverter {
34
35 private final List<PatternFormatter> formatters;
36
37
38
39
40
41
42
43 private VariablesNotEmptyReplacementConverter(final List<PatternFormatter> formatters) {
44 super("notEmpty", "notEmpty");
45 this.formatters = formatters;
46 }
47
48
49
50
51
52
53
54
55
56
57 public static VariablesNotEmptyReplacementConverter newInstance(final Configuration config,
58 final String[] options) {
59 if (options.length != 1) {
60 LOGGER.error("Incorrect number of options on varsNotEmpty. Expected 1 received " + options.length);
61 return null;
62 }
63 if (options[0] == null) {
64 LOGGER.error("No pattern supplied on varsNotEmpty");
65 return null;
66 }
67 final PatternParser parser = PatternLayout.createPatternParser(config);
68 final List<PatternFormatter> formatters = parser.parse(options[0]);
69 return new VariablesNotEmptyReplacementConverter(formatters);
70 }
71
72
73
74
75 @Override
76 public void format(final LogEvent event, final StringBuilder toAppendTo) {
77 final int start = toAppendTo.length();
78 boolean allVarsEmpty = true;
79 boolean hasVars = false;
80 for (int i = 0; i < formatters.size(); i++) {
81 final PatternFormatter formatter = formatters.get(i);
82 final int formatterStart = toAppendTo.length();
83 formatter.format(event, toAppendTo);
84 if (formatter.getConverter().isVariable()) {
85 hasVars = true;
86 allVarsEmpty = allVarsEmpty && (toAppendTo.length() == formatterStart);
87 }
88 }
89 if (!hasVars || allVarsEmpty) {
90 toAppendTo.setLength(start);
91 }
92 }
93 }