View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements. See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache license, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License. You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the license for the specific language governing permissions and
15   * limitations under the license.
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   * Composes and invokes one or more filters.
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      * Returns the result that should be returned when the filter does not match the event.
114      * 
115      * @return the Result that should be returned when the filter does not match the event.
116      */
117     public Result getOnMismatch() {
118         return Result.NEUTRAL;
119     }
120 
121     /**
122      * Returns the result that should be returned when the filter matches the event.
123      * 
124      * @return the Result that should be returned when the filter matches the event.
125      */
126     public Result getOnMatch() {
127         return Result.NEUTRAL;
128     }
129 
130     /**
131      * Filter an event.
132      * 
133      * @param logger
134      *            The Logger.
135      * @param level
136      *            The event logging Level.
137      * @param marker
138      *            The Marker for the event or null.
139      * @param msg
140      *            String text to filter on.
141      * @param params
142      *            An array of parameters or null.
143      * @return the Result.
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      * Filter an event.
158      * 
159      * @param logger
160      *            The Logger.
161      * @param level
162      *            The event logging Level.
163      * @param marker
164      *            The Marker for the event or null.
165      * @param msg
166      *            Any Object.
167      * @param t
168      *            A Throwable or null.
169      * @return the Result.
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      * Filter an event.
184      * 
185      * @param logger
186      *            The Logger.
187      * @param level
188      *            The event logging Level.
189      * @param marker
190      *            The Marker for the event or null.
191      * @param msg
192      *            The Message
193      * @param t
194      *            A Throwable or null.
195      * @return the Result.
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      * Filter an event.
210      * 
211      * @param event
212      *            The Event to filter on.
213      * @return the Result.
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      * Create a CompositeFilter.
245      * 
246      * @param filters
247      *            An array of Filters to call.
248      * @return The CompositeFilter.
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 }