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