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(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(Filter filter) {
63 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(Filter filter) {
69 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 (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 (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(Logger logger, Level level, Marker marker, String msg, Object... params) {
146 Result result = Result.NEUTRAL;
147 for (Filter filter : filters) {
148 result = filter.filter(logger, level, marker, msg, params);
149 if (result == Result.ACCEPT || result == Result.DENY) {
150 return result;
151 }
152 }
153 return result;
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171 public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) {
172 Result result = Result.NEUTRAL;
173 for (Filter filter : filters) {
174 result = filter.filter(logger, level, marker, msg, t);
175 if (result == Result.ACCEPT || result == Result.DENY) {
176 return result;
177 }
178 }
179 return result;
180 }
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197 public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) {
198 Result result = Result.NEUTRAL;
199 for (Filter filter : filters) {
200 result = filter.filter(logger, level, marker, msg, t);
201 if (result == Result.ACCEPT || result == Result.DENY) {
202 return result;
203 }
204 }
205 return result;
206 }
207
208
209
210
211
212
213
214
215 public Result filter(LogEvent event) {
216 Result result = Result.NEUTRAL;
217 for (Filter filter : filters) {
218 result = filter.filter(event);
219 if (result == Result.ACCEPT || result == Result.DENY) {
220 return result;
221 }
222 }
223 return result;
224 }
225
226 @Override
227 public String toString() {
228 StringBuilder sb = new StringBuilder();
229 for (Filter filter : filters) {
230 if (sb.length() == 0) {
231 sb.append("{");
232 } else {
233 sb.append(", ");
234 }
235 sb.append(filter.toString());
236 }
237 if (sb.length() > 0) {
238 sb.append("}");
239 }
240 return sb.toString();
241 }
242
243
244
245
246
247
248
249
250 @PluginFactory
251 public static CompositeFilter createFilters(@PluginElement("filters") Filter[] filters) {
252 List<Filter> f = filters == null || filters.length == 0 ? new ArrayList<Filter>() : Arrays.asList(filters);
253 return new CompositeFilter(f);
254 }
255
256 }