1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.filter;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Collections;
22 import java.util.Iterator;
23 import java.util.List;
24
25 import org.apache.logging.log4j.Level;
26 import org.apache.logging.log4j.Marker;
27 import org.apache.logging.log4j.core.AbstractLifeCycle;
28 import org.apache.logging.log4j.core.Filter;
29 import org.apache.logging.log4j.core.LogEvent;
30 import org.apache.logging.log4j.core.Logger;
31 import org.apache.logging.log4j.core.config.Node;
32 import org.apache.logging.log4j.core.config.plugins.Plugin;
33 import org.apache.logging.log4j.core.config.plugins.PluginElement;
34 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
35 import org.apache.logging.log4j.message.Message;
36
37
38
39
40 @Plugin(name = "filters", category = Node.CATEGORY, printObject = true)
41 public final class CompositeFilter extends AbstractLifeCycle implements Iterable<Filter>, Filter {
42
43 private static final long serialVersionUID = 1L;
44
45 private final List<Filter> filters;
46
47 private CompositeFilter() {
48 this.filters = new ArrayList<Filter>();
49 }
50
51 private CompositeFilter(final List<Filter> filters) {
52 if (filters == null) {
53 this.filters = Collections.unmodifiableList(new ArrayList<Filter>());
54 return;
55 }
56 this.filters = Collections.unmodifiableList(filters);
57 }
58
59 public CompositeFilter addFilter(final Filter filter) {
60 if (filter == null) {
61
62 return this;
63 }
64 final List<Filter> filterList = new ArrayList<Filter>(this.filters);
65 filterList.add(filter);
66 return new CompositeFilter(Collections.unmodifiableList(filterList));
67 }
68
69 public CompositeFilter removeFilter(final Filter filter) {
70 if (filter == null) {
71
72 return this;
73 }
74 final List<Filter> filterList = new ArrayList<Filter>(this.filters);
75 filterList.remove(filter);
76 return new CompositeFilter(Collections.unmodifiableList(filterList));
77 }
78
79 @Override
80 public Iterator<Filter> iterator() {
81 return filters.iterator();
82 }
83
84 public List<Filter> getFilters() {
85 return filters;
86 }
87
88
89
90
91
92
93 public boolean isEmpty() {
94 return this.filters.isEmpty();
95 }
96
97 public int size() {
98 return filters.size();
99 }
100
101 @Override
102 public void start() {
103 this.setStarting();
104 for (final Filter filter : filters) {
105 filter.start();
106 }
107 this.setStarted();
108 }
109
110 @Override
111 public void stop() {
112 this.setStopping();
113 for (final Filter filter : filters) {
114 filter.stop();
115 }
116 this.setStopped();
117 }
118
119
120
121
122
123
124 @Override
125 public Result getOnMismatch() {
126 return Result.NEUTRAL;
127 }
128
129
130
131
132
133
134 @Override
135 public Result getOnMatch() {
136 return Result.NEUTRAL;
137 }
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154 @Override
155 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
156 final Object... params) {
157 Result result = Result.NEUTRAL;
158 for (final Filter filter : filters) {
159 result = filter.filter(logger, level, marker, msg, params);
160 if (result == Result.ACCEPT || result == Result.DENY) {
161 return result;
162 }
163 }
164 return result;
165 }
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182 @Override
183 public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
184 final Throwable t) {
185 Result result = Result.NEUTRAL;
186 for (final Filter filter : filters) {
187 result = filter.filter(logger, level, marker, msg, t);
188 if (result == Result.ACCEPT || result == Result.DENY) {
189 return result;
190 }
191 }
192 return result;
193 }
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210 @Override
211 public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
212 final Throwable t) {
213 Result result = Result.NEUTRAL;
214 for (final Filter filter : filters) {
215 result = filter.filter(logger, level, marker, msg, t);
216 if (result == Result.ACCEPT || result == Result.DENY) {
217 return result;
218 }
219 }
220 return result;
221 }
222
223
224
225
226
227
228
229
230 @Override
231 public Result filter(final LogEvent event) {
232 Result result = Result.NEUTRAL;
233 for (final Filter filter : filters) {
234 result = filter.filter(event);
235 if (result == Result.ACCEPT || result == Result.DENY) {
236 return result;
237 }
238 }
239 return result;
240 }
241
242 @Override
243 public String toString() {
244 final StringBuilder sb = new StringBuilder();
245 for (final Filter filter : filters) {
246 if (sb.length() == 0) {
247 sb.append('{');
248 } else {
249 sb.append(", ");
250 }
251 sb.append(filter.toString());
252 }
253 if (sb.length() > 0) {
254 sb.append('}');
255 }
256 return sb.toString();
257 }
258
259
260
261
262
263
264
265
266 @PluginFactory
267 public static CompositeFilter createFilters(@PluginElement("Filters") final Filter[] filters) {
268 final List<Filter> filterList = filters == null || filters.length == 0 ?
269 new ArrayList<Filter>() : Arrays.asList(filters);
270 return new CompositeFilter(filterList);
271 }
272
273 }