1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.layout;
18
19 import java.util.HashMap;
20 import java.util.List;
21 import java.util.Map;
22
23 import org.apache.logging.log4j.Logger;
24 import org.apache.logging.log4j.Marker;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.config.Configuration;
27 import org.apache.logging.log4j.core.config.Node;
28 import org.apache.logging.log4j.core.config.plugins.Plugin;
29 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
30 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
31 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
32 import org.apache.logging.log4j.core.config.plugins.PluginElement;
33 import org.apache.logging.log4j.core.pattern.PatternFormatter;
34 import org.apache.logging.log4j.core.pattern.PatternParser;
35 import org.apache.logging.log4j.status.StatusLogger;
36
37
38
39
40 @Plugin(name = "MarkerPatternSelector", category = Node.CATEGORY, elementType = PatternSelector.ELEMENT_TYPE, printObject = true)
41 public class MarkerPatternSelector implements PatternSelector {
42
43
44
45
46 public static class Builder implements org.apache.logging.log4j.core.util.Builder<MarkerPatternSelector> {
47
48 @PluginElement("PatternMatch")
49 private PatternMatch[] properties;
50
51 @PluginBuilderAttribute("defaultPattern")
52 private String defaultPattern;
53
54 @PluginBuilderAttribute(value = "alwaysWriteExceptions")
55 private boolean alwaysWriteExceptions = true;
56
57 @PluginBuilderAttribute(value = "disableAnsi")
58 private boolean disableAnsi;
59
60 @PluginBuilderAttribute(value = "noConsoleNoAnsi")
61 private boolean noConsoleNoAnsi;
62
63 @PluginConfiguration
64 private Configuration configuration;
65
66 @Override
67 public MarkerPatternSelector build() {
68 if (defaultPattern == null) {
69 defaultPattern = PatternLayout.DEFAULT_CONVERSION_PATTERN;
70 }
71 if (properties == null || properties.length == 0) {
72 LOGGER.warn("No marker patterns were provided with PatternMatch");
73 return null;
74 }
75 return new MarkerPatternSelector(properties, defaultPattern, alwaysWriteExceptions, disableAnsi,
76 noConsoleNoAnsi, configuration);
77 }
78
79 public Builder setProperties(final PatternMatch[] properties) {
80 this.properties = properties;
81 return this;
82 }
83
84 public Builder setDefaultPattern(final String defaultPattern) {
85 this.defaultPattern = defaultPattern;
86 return this;
87 }
88
89 public Builder setAlwaysWriteExceptions(final boolean alwaysWriteExceptions) {
90 this.alwaysWriteExceptions = alwaysWriteExceptions;
91 return this;
92 }
93
94 public Builder setDisableAnsi(final boolean disableAnsi) {
95 this.disableAnsi = disableAnsi;
96 return this;
97 }
98
99 public Builder setNoConsoleNoAnsi(final boolean noConsoleNoAnsi) {
100 this.noConsoleNoAnsi = noConsoleNoAnsi;
101 return this;
102 }
103
104 public Builder setConfiguration(final Configuration configuration) {
105 this.configuration = configuration;
106 return this;
107 }
108
109 }
110
111 private final Map<String, PatternFormatter[]> formatterMap = new HashMap<>();
112
113 private final Map<String, String> patternMap = new HashMap<>();
114
115 private final PatternFormatter[] defaultFormatters;
116
117 private final String defaultPattern;
118
119 private static Logger LOGGER = StatusLogger.getLogger();
120
121
122
123
124
125 @Deprecated
126 public MarkerPatternSelector(final PatternMatch[] properties, final String defaultPattern,
127 final boolean alwaysWriteExceptions, final boolean noConsoleNoAnsi,
128 final Configuration config) {
129 this(properties, defaultPattern, alwaysWriteExceptions, false, noConsoleNoAnsi, config);
130 }
131
132 private MarkerPatternSelector(final PatternMatch[] properties, final String defaultPattern,
133 final boolean alwaysWriteExceptions, final boolean disableAnsi,
134 final boolean noConsoleNoAnsi, final Configuration config) {
135 final PatternParser parser = PatternLayout.createPatternParser(config);
136 for (final PatternMatch property : properties) {
137 try {
138 final List<PatternFormatter> list = parser.parse(property.getPattern(), alwaysWriteExceptions,
139 disableAnsi, noConsoleNoAnsi);
140 formatterMap.put(property.getKey(), list.toArray(new PatternFormatter[list.size()]));
141 patternMap.put(property.getKey(), property.getPattern());
142 } catch (final RuntimeException ex) {
143 throw new IllegalArgumentException("Cannot parse pattern '" + property.getPattern() + "'", ex);
144 }
145 }
146 try {
147 final List<PatternFormatter> list = parser.parse(defaultPattern, alwaysWriteExceptions, disableAnsi,
148 noConsoleNoAnsi);
149 defaultFormatters = list.toArray(new PatternFormatter[list.size()]);
150 this.defaultPattern = defaultPattern;
151 } catch (final RuntimeException ex) {
152 throw new IllegalArgumentException("Cannot parse pattern '" + defaultPattern + "'", ex);
153 }
154 }
155
156 @Override
157 public PatternFormatter[] getFormatters(final LogEvent event) {
158 final Marker marker = event.getMarker();
159 if (marker == null) {
160 return defaultFormatters;
161 }
162 for (final String key : formatterMap.keySet()) {
163 if (marker.isInstanceOf(key)) {
164 return formatterMap.get(key);
165 }
166 }
167 return defaultFormatters;
168 }
169
170
171
172
173
174
175 @PluginBuilderFactory
176 public static Builder newBuilder() {
177 return new Builder();
178 }
179
180
181
182
183
184
185
186
187
188
189
190 @Deprecated
191 public static MarkerPatternSelector createSelector(
192 final PatternMatch[] properties,
193 final String defaultPattern,
194 final boolean alwaysWriteExceptions,
195 final boolean noConsoleNoAnsi,
196 final Configuration configuration) {
197 final Builder builder = newBuilder();
198 builder.setProperties(properties);
199 builder.setDefaultPattern(defaultPattern);
200 builder.setAlwaysWriteExceptions(alwaysWriteExceptions);
201 builder.setNoConsoleNoAnsi(noConsoleNoAnsi);
202 builder.setConfiguration(configuration);
203 return builder.build();
204 }
205
206 @Override
207 public String toString() {
208 final StringBuilder sb = new StringBuilder();
209 boolean first = true;
210 for (final Map.Entry<String, String> entry : patternMap.entrySet()) {
211 if (!first) {
212 sb.append(", ");
213 }
214 sb.append("key=\"").append(entry.getKey()).append("\", pattern=\"").append(entry.getValue()).append("\"");
215 first = false;
216 }
217 if (!first) {
218 sb.append(", ");
219 }
220 sb.append("default=\"").append(defaultPattern).append("\"");
221 return sb.toString();
222 }
223 }