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.Iterator;
22 import java.util.List;
23
24 import org.apache.logging.log4j.Level;
25 import org.apache.logging.log4j.Marker;
26 import org.apache.logging.log4j.core.AbstractLifeCycle;
27 import org.apache.logging.log4j.core.Filter;
28 import org.apache.logging.log4j.core.LogEvent;
29 import org.apache.logging.log4j.core.Logger;
30 import org.apache.logging.log4j.core.config.Node;
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.core.util.ObjectArrayIterator;
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 Filter[] EMPTY_FILTERS = new Filter[0];
44 private final Filter[] filters;
45
46 private CompositeFilter() {
47 this.filters = EMPTY_FILTERS;
48 }
49
50 private CompositeFilter(final Filter[] filters) {
51 this.filters = filters == null ? EMPTY_FILTERS : filters;
52 }
53
54 public CompositeFilter addFilter(final Filter filter) {
55 if (filter == null) {
56
57 return this;
58 }
59 if (filter instanceof CompositeFilter) {
60 final int size = this.filters.length + ((CompositeFilter) filter).size();
61 final Filter[] copy = Arrays.copyOf(this.filters, size);
62 final int index = this.filters.length;
63 for (final Filter currentFilter : ((CompositeFilter) filter).filters) {
64 copy[index] = currentFilter;
65 }
66 return new CompositeFilter(copy);
67 } else {
68 final Filter[] copy = Arrays.copyOf(this.filters, this.filters.length + 1);
69 copy[this.filters.length] = filter;
70 return new CompositeFilter(copy);
71 }
72 }
73
74 public CompositeFilter removeFilter(final Filter filter) {
75 if (filter == null) {
76
77 return this;
78 }
79
80
81
82 final List<Filter> filterList = new ArrayList<>(Arrays.asList(this.filters));
83 if (filter instanceof CompositeFilter) {
84 for (final Filter currentFilter : ((CompositeFilter) filter).filters) {
85 filterList.remove(currentFilter);
86 }
87 } else {
88 filterList.remove(filter);
89 }
90 return new CompositeFilter(filterList.toArray(new Filter[this.filters.length - 1]));
91 }
92
93 @Override
94 public Iterator<Filter> iterator() {
95 return new ObjectArrayIterator<>(filters);
96 }
97
98
99
100
101
102
103
104 @Deprecated
105 public List<Filter> getFilters() {
106 return Arrays.asList(filters);
107 }
108
109 public Filter[] getFiltersArray() {
110 return filters;
111 }
112
113
114
115
116
117
118 public boolean isEmpty() {
119 return this.filters.length == 0;
120 }
121
122 public int size() {
123 return filters.length;
124 }
125
126 @Override
127 public void start() {
128 this.setStarting();
129 for (final Filter filter : filters) {
130 filter.start();
131 }
132 this.setStarted();
133 }
134
135 @Override
136 public void stop() {
137 this.setStopping();
138 for (final Filter filter : filters) {
139 filter.stop();
140 }
141 this.setStopped();
142 }
143
144
145
146
147
148
149 @Override
150 public Result getOnMismatch() {
151 return Result.NEUTRAL;
152 }
153
154
155
156
157
158
159 @Override
160 public Result getOnMatch() {
161 return Result.NEUTRAL;
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 String msg,
181 final Object... params) {
182 Result result = Result.NEUTRAL;
183 for (int i = 0; i < filters.length; i++) {
184 result = filters[i].filter(logger, level, marker, msg, params);
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 @Override
207 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
208 final Object p0) {
209 Result result = Result.NEUTRAL;
210 for (int i = 0; i < filters.length; i++) {
211 result = filters[i].filter(logger, level, marker, msg, p0);
212 if (result == Result.ACCEPT || result == Result.DENY) {
213 return result;
214 }
215 }
216 return result;
217 }
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234 @Override
235 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
236 final Object p0, final Object p1) {
237 Result result = Result.NEUTRAL;
238 for (int i = 0; i < filters.length; i++) {
239 result = filters[i].filter(logger, level, marker, msg, p0, p1);
240 if (result == Result.ACCEPT || result == Result.DENY) {
241 return result;
242 }
243 }
244 return result;
245 }
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263 @Override
264 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
265 final Object p0, final Object p1, final Object p2) {
266 Result result = Result.NEUTRAL;
267 for (int i = 0; i < filters.length; i++) {
268 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2);
269 if (result == Result.ACCEPT || result == Result.DENY) {
270 return result;
271 }
272 }
273 return result;
274 }
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293 @Override
294 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
295 final Object p0, final Object p1, final Object p2, final Object p3) {
296 Result result = Result.NEUTRAL;
297 for (int i = 0; i < filters.length; i++) {
298 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2, p3);
299 if (result == Result.ACCEPT || result == Result.DENY) {
300 return result;
301 }
302 }
303 return result;
304 }
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324 @Override
325 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
326 final Object p0, final Object p1, final Object p2, final Object p3,
327 final Object p4) {
328 Result result = Result.NEUTRAL;
329 for (int i = 0; i < filters.length; i++) {
330 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2, p3, p4);
331 if (result == Result.ACCEPT || result == Result.DENY) {
332 return result;
333 }
334 }
335 return result;
336 }
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357 @Override
358 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
359 final Object p0, final Object p1, final Object p2, final Object p3,
360 final Object p4, final Object p5) {
361 Result result = Result.NEUTRAL;
362 for (int i = 0; i < filters.length; i++) {
363 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5);
364 if (result == Result.ACCEPT || result == Result.DENY) {
365 return result;
366 }
367 }
368 return result;
369 }
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391 @Override
392 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
393 final Object p0, final Object p1, final Object p2, final Object p3,
394 final Object p4, final Object p5, final Object p6) {
395 Result result = Result.NEUTRAL;
396 for (int i = 0; i < filters.length; i++) {
397 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6);
398 if (result == Result.ACCEPT || result == Result.DENY) {
399 return result;
400 }
401 }
402 return result;
403 }
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426 @Override
427 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
428 final Object p0, final Object p1, final Object p2, final Object p3,
429 final Object p4, final Object p5, final Object p6,
430 final Object p7) {
431 Result result = Result.NEUTRAL;
432 for (int i = 0; i < filters.length; i++) {
433 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7);
434 if (result == Result.ACCEPT || result == Result.DENY) {
435 return result;
436 }
437 }
438 return result;
439 }
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463 @Override
464 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
465 final Object p0, final Object p1, final Object p2, final Object p3,
466 final Object p4, final Object p5, final Object p6,
467 final Object p7, final Object p8) {
468 Result result = Result.NEUTRAL;
469 for (int i = 0; i < filters.length; i++) {
470 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8);
471 if (result == Result.ACCEPT || result == Result.DENY) {
472 return result;
473 }
474 }
475 return result;
476 }
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501 @Override
502 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
503 final Object p0, final Object p1, final Object p2, final Object p3,
504 final Object p4, final Object p5, final Object p6,
505 final Object p7, final Object p8, final Object p9) {
506 Result result = Result.NEUTRAL;
507 for (int i = 0; i < filters.length; i++) {
508 result = filters[i].filter(logger, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
509 if (result == Result.ACCEPT || result == Result.DENY) {
510 return result;
511 }
512 }
513 return result;
514 }
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531 @Override
532 public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
533 final Throwable t) {
534 Result result = Result.NEUTRAL;
535 for (int i = 0; i < filters.length; i++) {
536 result = filters[i].filter(logger, level, marker, msg, t);
537 if (result == Result.ACCEPT || result == Result.DENY) {
538 return result;
539 }
540 }
541 return result;
542 }
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559 @Override
560 public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
561 final Throwable t) {
562 Result result = Result.NEUTRAL;
563 for (int i = 0; i < filters.length; i++) {
564 result = filters[i].filter(logger, level, marker, msg, t);
565 if (result == Result.ACCEPT || result == Result.DENY) {
566 return result;
567 }
568 }
569 return result;
570 }
571
572
573
574
575
576
577
578
579 @Override
580 public Result filter(final LogEvent event) {
581 Result result = Result.NEUTRAL;
582 for (int i = 0; i < filters.length; i++) {
583 result = filters[i].filter(event);
584 if (result == Result.ACCEPT || result == Result.DENY) {
585 return result;
586 }
587 }
588 return result;
589 }
590
591 @Override
592 public String toString() {
593 final StringBuilder sb = new StringBuilder();
594 for (int i = 0; i < filters.length; i++) {
595 if (sb.length() == 0) {
596 sb.append('{');
597 } else {
598 sb.append(", ");
599 }
600 sb.append(filters[i].toString());
601 }
602 if (sb.length() > 0) {
603 sb.append('}');
604 }
605 return sb.toString();
606 }
607
608
609
610
611
612
613
614
615 @PluginFactory
616 public static CompositeFilter createFilters(@PluginElement("Filters") final Filter[] filters) {
617 return new CompositeFilter(filters);
618 }
619
620 }