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.LogEvent;
23  import org.apache.logging.log4j.core.Logger;
24  import org.apache.logging.log4j.core.config.Node;
25  import org.apache.logging.log4j.core.config.plugins.Plugin;
26  import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
27  import org.apache.logging.log4j.core.config.plugins.PluginFactory;
28  import org.apache.logging.log4j.message.Message;
29  import org.apache.logging.log4j.util.PerformanceSensitive;
30  
31  /**
32   * This filter returns the onMatch result if the marker in the LogEvent is the same as or has the
33   * configured marker as a parent.
34   */
35  @Plugin(name = "MarkerFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
36  @PerformanceSensitive("allocation")
37  public final class MarkerFilter extends AbstractFilter {
38  
39      public static final String ATTR_MARKER = "marker";
40      private final String name;
41  
42      private MarkerFilter(final String name, final Result onMatch, final Result onMismatch) {
43          super(onMatch, onMismatch);
44          this.name = name;
45      }
46  
47      @Override
48      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
49                           final Object... params) {
50          return filter(marker);
51      }
52  
53      @Override
54      public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
55                           final Throwable t) {
56          return filter(marker);
57      }
58  
59      @Override
60      public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
61                           final Throwable t) {
62          return filter(marker);
63      }
64  
65      @Override
66      public Result filter(final LogEvent event) {
67          return filter(event.getMarker());
68      }
69  
70      private Result filter(final Marker marker) {
71          return marker != null && marker.isInstanceOf(name) ? onMatch : onMismatch;
72      }
73  
74      @Override
75      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
76              final Object p0) {
77          return filter(marker);
78      }
79  
80      @Override
81      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
82              final Object p0, final Object p1) {
83          return filter(marker);
84      }
85  
86      @Override
87      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
88              final Object p0, final Object p1, final Object p2) {
89          return filter(marker);
90      }
91  
92      @Override
93      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
94              final Object p0, final Object p1, final Object p2, final Object p3) {
95          return filter(marker);
96      }
97  
98      @Override
99      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
100             final Object p0, final Object p1, final Object p2, final Object p3,
101             final Object p4) {
102         return filter(marker);
103     }
104 
105     @Override
106     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
107             final Object p0, final Object p1, final Object p2, final Object p3,
108             final Object p4, final Object p5) {
109         return filter(marker);
110     }
111 
112     @Override
113     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
114             final Object p0, final Object p1, final Object p2, final Object p3,
115             final Object p4, final Object p5, final Object p6) {
116         return filter(marker);
117     }
118 
119     @Override
120     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
121             final Object p0, final Object p1, final Object p2, final Object p3,
122             final Object p4, final Object p5, final Object p6,
123             final Object p7) {
124         return filter(marker);
125     }
126 
127     @Override
128     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
129             final Object p0, final Object p1, final Object p2, final Object p3,
130             final Object p4, final Object p5, final Object p6,
131             final Object p7, final Object p8) {
132         return filter(marker);
133     }
134 
135     @Override
136     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
137             final Object p0, final Object p1, final Object p2, final Object p3,
138             final Object p4, final Object p5, final Object p6,
139             final Object p7, final Object p8, final Object p9) {
140         return filter(marker);
141     }
142 
143     @Override
144     public String toString() {
145         return name;
146     }
147 
148     /**
149      * Creates the MarkerFilter.
150      * @param marker The Marker name to match.
151      * @param match The action to take if a match occurs.
152      * @param mismatch The action to take if no match occurs.
153      * @return A MarkerFilter.
154      */
155     // TODO Consider refactoring to use AbstractFilter.AbstractFilterBuilder
156     @PluginFactory
157     public static MarkerFilter createFilter(
158             @PluginAttribute(ATTR_MARKER) final String marker,
159             @PluginAttribute(AbstractFilterBuilder.ATTR_ON_MATCH) final Result match,
160             @PluginAttribute(AbstractFilterBuilder.ATTR_ON_MISMATCH) final Result mismatch) {
161 
162         if (marker == null) {
163             LOGGER.error("A marker must be provided for MarkerFilter");
164             return null;
165         }
166         return new MarkerFilter(marker, match, mismatch);
167     }
168 
169 }