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