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.AbstractLifeCycle;
22  import org.apache.logging.log4j.core.Filter;
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.PluginBuilderAttribute;
26  import org.apache.logging.log4j.message.Message;
27  
28  /**
29   * Users should extend this class to implement filters. Filters can be either context wide or attached to
30   * an appender. A filter may choose to support being called only from the context or only from an appender in
31   * which case it will only implement the required method(s). The rest will default to return {@link org.apache.logging.log4j.core.Filter.Result#NEUTRAL}.
32   * <p>
33   * Garbage-free note: the methods with unrolled varargs by default delegate to the
34   * {@link #filter(Logger, Level, Marker, String, Object...) filter method with vararg parameters}.
35   * Subclasses that want to be garbage-free should override these methods to implement the appropriate filtering
36   * without creating a vararg array.
37   * </p>
38   */
39  public abstract class AbstractFilter extends AbstractLifeCycle implements Filter {
40  
41      public static abstract class AbstractFilterBuilder<B extends AbstractFilterBuilder<B>>  {
42  
43          public static final String ATTR_ON_MISMATCH = "onMismatch";
44          public static final String ATTR_ON_MATCH = "onMatch";
45  
46          @PluginBuilderAttribute(ATTR_ON_MATCH)
47          private Result onMatch = Result.NEUTRAL;
48  
49          @PluginBuilderAttribute(ATTR_ON_MISMATCH)
50          private Result onMismatch = Result.DENY;
51  
52          public Result getOnMatch() {
53              return onMatch;
54          }
55  
56          public Result getOnMismatch() {
57              return onMismatch;
58          }
59  
60          /**
61           * Sets the Result to return when the filter matches. Defaults to Result.NEUTRAL.
62           * @param onMatch the Result to return when the filter matches.
63           * @return this
64           */
65          public B setOnMatch(final Result onMatch) {
66              this.onMatch = onMatch;
67              return asBuilder();
68          }
69  
70          /**
71           * Sets the Result to return when the filter does not match. The default is Result.DENY.
72           * @param onMismatch the Result to return when the filter does not match.
73           * @return this
74           */
75          public B setOnMismatch(final Result onMismatch) {
76              this.onMismatch = onMismatch;
77              return asBuilder();
78          }
79  
80          @SuppressWarnings("unchecked")
81          public B asBuilder() {
82              return (B) this;
83          }
84  
85      }
86  
87      /**
88       * The onMatch Result.
89       */
90      protected final Result onMatch;
91  
92      /**
93       * The onMismatch Result.
94       */
95      protected final Result onMismatch;
96  
97      /**
98       * The default constructor.
99       */
100     protected AbstractFilter() {
101         this(null, null);
102     }
103 
104     /**
105      * Constructor that allows the onMatch and onMismatch actions to be set.
106      * @param onMatch The result to return when a match occurs.
107      * @param onMismatch The result to return when a match dos not occur.
108      */
109     protected AbstractFilter(final Result onMatch, final Result onMismatch) {
110         this.onMatch = onMatch == null ? Result.NEUTRAL : onMatch;
111         this.onMismatch = onMismatch == null ? Result.DENY : onMismatch;
112     }
113 
114     @Override
115     protected boolean equalsImpl(final Object obj) {
116         if (this == obj) {
117             return true;
118         }
119         if (!super.equalsImpl(obj)) {
120             return false;
121         }
122         if (getClass() != obj.getClass()) {
123             return false;
124         }
125         final AbstractFilter other = (AbstractFilter) obj;
126         if (onMatch != other.onMatch) {
127             return false;
128         }
129         if (onMismatch != other.onMismatch) {
130             return false;
131         }
132         return true;
133     }
134 
135     /**
136      * Context Filter method. The default returns NEUTRAL.
137      * @param event The LogEvent.
138      * @return The Result of filtering.
139      */
140     @Override
141     public Result filter(final LogEvent event) {
142         return Result.NEUTRAL;
143     }
144 
145     /**
146      * Appender Filter method. The default returns NEUTRAL.
147      * @param logger the Logger.
148      * @param level The logging Level.
149      * @param marker The Marker, if any.
150      * @param msg The message, if present.
151      * @param t A throwable or null.
152      * @return The Result of filtering.
153      */
154     @Override
155     public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
156                          final Throwable t) {
157         return Result.NEUTRAL;
158     }
159 
160     /**
161      * Appender Filter method. The default returns NEUTRAL.
162      * @param logger the Logger.
163      * @param level The logging Level.
164      * @param marker The Marker, if any.
165      * @param msg The message, if present.
166      * @param t A throwable or null.
167      * @return The Result of filtering.
168      */
169     @Override
170     public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
171                          final Throwable t) {
172         return Result.NEUTRAL;
173     }
174 
175     /**
176      * Appender Filter method. The default returns NEUTRAL.
177      * @param logger the Logger.
178      * @param level The logging Level.
179      * @param marker The Marker, if any.
180      * @param msg The message, if present.
181      * @param params An array of parameters or null.
182      * @return The Result of filtering.
183      */
184     @Override
185     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
186                          final Object... params) {
187         return Result.NEUTRAL;
188     }
189 
190     /**
191      * Appender Filter method. The default returns NEUTRAL.
192      * @param logger the Logger.
193      * @param level The logging Level.
194      * @param marker The Marker, if any.
195      * @param msg The message, if present.
196      * @param p0 the message parameters
197      * @return The Result of filtering.
198      * @since 2.7
199      */
200     @Override
201     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
202             final Object p0) {
203         return filter(logger, level, marker, msg, new Object[] {p0});
204     }
205 
206     /**
207      * Appender Filter method. The default returns NEUTRAL.
208      * @param logger the Logger.
209      * @param level The logging Level.
210      * @param marker The Marker, if any.
211      * @param msg The message, if present.
212      * @param p0 the message parameters
213      * @param p1 the message parameters
214      * @return The Result of filtering.
215      * @since 2.7
216      */
217     @Override
218     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
219             final Object p0, final Object p1) {
220         return filter(logger, level, marker, msg, new Object[] {p0, p1});
221     }
222 
223     /**
224      * Appender Filter method. The default returns NEUTRAL.
225      * @param logger the Logger.
226      * @param level The logging Level.
227      * @param marker The Marker, if any.
228      * @param msg The message, if present.
229      * @param p0 the message parameters
230      * @param p1 the message parameters
231      * @param p2 the message parameters
232      * @return The Result of filtering.
233      * @since 2.7
234      */
235     @Override
236     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
237             final Object p0, final Object p1, final Object p2) {
238         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2});
239     }
240 
241     /**
242      * Appender Filter method. The default returns NEUTRAL.
243      * @param logger the Logger.
244      * @param level The logging Level.
245      * @param marker The Marker, if any.
246      * @param msg The message, if present.
247      * @param p0 the message parameters
248      * @param p1 the message parameters
249      * @param p2 the message parameters
250      * @param p3 the message parameters
251      * @return The Result of filtering.
252      * @since 2.7
253      */
254     @Override
255     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
256             final Object p0, final Object p1, final Object p2, final Object p3) {
257         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2, p3});
258     }
259 
260     /**
261      * Appender Filter method. The default returns NEUTRAL.
262      * @param logger the Logger.
263      * @param level The logging Level.
264      * @param marker The Marker, if any.
265      * @param msg The message, if present.
266      * @param p0 the message parameters
267      * @param p1 the message parameters
268      * @param p2 the message parameters
269      * @param p3 the message parameters
270      * @param p4 the message parameters
271      * @return The Result of filtering.
272      * @since 2.7
273      */
274     @Override
275     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
276             final Object p0, final Object p1, final Object p2, final Object p3,
277             final Object p4) {
278         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2, p3, p4});
279     }
280 
281     /**
282      * Appender Filter method. The default returns NEUTRAL.
283      * @param logger the Logger.
284      * @param level The logging Level.
285      * @param marker The Marker, if any.
286      * @param msg The message, if present.
287      * @param p0 the message parameters
288      * @param p1 the message parameters
289      * @param p2 the message parameters
290      * @param p3 the message parameters
291      * @param p4 the message parameters
292      * @param p5 the message parameters
293      * @return The Result of filtering.
294      * @since 2.7
295      */
296     @Override
297     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
298             final Object p0, final Object p1, final Object p2, final Object p3,
299             final Object p4, final Object p5) {
300         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2, p3, p4, p5});
301     }
302 
303     /**
304      * Appender Filter method. The default returns NEUTRAL.
305      * @param logger the Logger.
306      * @param level The logging Level.
307      * @param marker The Marker, if any.
308      * @param msg The message, if present.
309      * @param p0 the message parameters
310      * @param p1 the message parameters
311      * @param p2 the message parameters
312      * @param p3 the message parameters
313      * @param p4 the message parameters
314      * @param p5 the message parameters
315      * @param p6 the message parameters
316      * @return The Result of filtering.
317      * @since 2.7
318      */
319     @Override
320     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
321             final Object p0, final Object p1, final Object p2, final Object p3,
322             final Object p4, final Object p5, final Object p6) {
323         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2, p3, p4, p5, p6});
324     }
325 
326     /**
327      * Appender Filter method. The default returns NEUTRAL.
328      * @param logger the Logger.
329      * @param level The logging Level.
330      * @param marker The Marker, if any.
331      * @param msg The message, if present.
332      * @param p0 the message parameters
333      * @param p1 the message parameters
334      * @param p2 the message parameters
335      * @param p3 the message parameters
336      * @param p4 the message parameters
337      * @param p5 the message parameters
338      * @param p6 the message parameters
339      * @param p7 the message parameters
340      * @return The Result of filtering.
341      * @since 2.7
342      */
343     @Override
344     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
345             final Object p0, final Object p1, final Object p2, final Object p3,
346             final Object p4, final Object p5, final Object p6,
347             final Object p7) {
348         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2, p3, p4, p5, p6, p7});
349     }
350 
351     /**
352      * Appender Filter method. The default returns NEUTRAL.
353      * @param logger the Logger.
354      * @param level The logging Level.
355      * @param marker The Marker, if any.
356      * @param msg The message, if present.
357      * @param p0 the message parameters
358      * @param p1 the message parameters
359      * @param p2 the message parameters
360      * @param p3 the message parameters
361      * @param p4 the message parameters
362      * @param p5 the message parameters
363      * @param p6 the message parameters
364      * @param p7 the message parameters
365      * @param p8 the message parameters
366      * @return The Result of filtering.
367      * @since 2.7
368      */
369     @Override
370     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
371             final Object p0, final Object p1, final Object p2, final Object p3,
372             final Object p4, final Object p5, final Object p6,
373             final Object p7, final Object p8) {
374         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2, p3, p4, p5, p6, p7, p8});
375     }
376 
377     /**
378      * Appender Filter method. The default returns NEUTRAL.
379      * @param logger the Logger.
380      * @param level The logging Level.
381      * @param marker The Marker, if any.
382      * @param msg The message, if present.
383      * @param p0 the message parameters
384      * @param p1 the message parameters
385      * @param p2 the message parameters
386      * @param p3 the message parameters
387      * @param p4 the message parameters
388      * @param p5 the message parameters
389      * @param p6 the message parameters
390      * @param p7 the message parameters
391      * @param p8 the message parameters
392      * @param p9 the message parameters
393      * @return The Result of filtering.
394      * @since 2.7
395      */
396     @Override
397     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
398             final Object p0, final Object p1, final Object p2, final Object p3,
399             final Object p4, final Object p5, final Object p6,
400             final Object p7, final Object p8, final Object p9) {
401         return filter(logger, level, marker, msg, new Object[] {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9});
402     }
403 
404     /**
405      * Returns the Result to be returned when a match occurs.
406      * @return the onMatch Result.
407      */
408     @Override
409     public final Result getOnMatch() {
410         return onMatch;
411     }
412 
413     /**
414      * Returns the Result to be returned when a match does not occur.
415      * @return the onMismatch Result.
416      */
417     @Override
418     public final Result getOnMismatch() {
419         return onMismatch;
420     }
421 
422     @Override
423     protected int hashCodeImpl() {
424         final int prime = 31;
425         int result = super.hashCodeImpl();
426         result = prime * result + ((onMatch == null) ? 0 : onMatch.hashCode());
427         result = prime * result + ((onMismatch == null) ? 0 : onMismatch.hashCode());
428         return result;
429     }
430 
431     @Override
432     public String toString() {
433         return this.getClass().getSimpleName();
434     }
435 }