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 {@code onMatch} result if the level in the {@code LogEvent} is in the range of the configured
33   * min and max levels, otherwise it returns {@code onMismatch} value . For example, if the filter is configured with
34   * {@link Level#ERROR} and {@link Level#INFO} and the LogEvent contains {@link Level#WARN} then the onMatch value will
35   * be returned since {@link Level#WARN WARN} events are in between {@link Level#ERROR ERROR} and {@link Level#INFO
36   * INFO}.
37   * <p>
38   * The default Levels are both {@link Level#ERROR ERROR}.
39   * </p>
40   */
41  @Plugin(name = "LevelRangeFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
42  @PerformanceSensitive("allocation")
43  public final class LevelRangeFilter extends AbstractFilter {
44  
45      /**
46       * Creates a ThresholdFilter.
47       *
48       * @param minLevel
49       *            The minimum log Level.
50       * @param maxLevel
51       *            The maximum log Level.
52       * @param match
53       *            The action to take on a match.
54       * @param mismatch
55       *            The action to take on a mismatch.
56       * @return The created ThresholdFilter.
57       */
58      // TODO Consider refactoring to use AbstractFilter.AbstractFilterBuilder
59      @PluginFactory
60      public static LevelRangeFilter createFilter(
61              // @formatter:off
62              @PluginAttribute("minLevel") final Level minLevel,
63              @PluginAttribute("maxLevel") final Level maxLevel,
64              @PluginAttribute("onMatch") final Result match,
65              @PluginAttribute("onMismatch") final Result mismatch) {
66              // @formatter:on
67          final Level actualMinLevel = minLevel == null ? Level.ERROR : minLevel;
68          final Level actualMaxLevel = maxLevel == null ? Level.ERROR : maxLevel;
69          final Result onMatch = match == null ? Result.NEUTRAL : match;
70          final Result onMismatch = mismatch == null ? Result.DENY : mismatch;
71          return new LevelRangeFilter(actualMinLevel, actualMaxLevel, onMatch, onMismatch);
72      }
73      private final Level maxLevel;
74  
75      private final Level minLevel;
76  
77      private LevelRangeFilter(final Level minLevel, final Level maxLevel, final Result onMatch, final Result onMismatch) {
78          super(onMatch, onMismatch);
79          this.minLevel = minLevel;
80          this.maxLevel = maxLevel;
81      }
82  
83      private Result filter(final Level level) {
84          return level.isInRange(this.minLevel, this.maxLevel) ? onMatch : onMismatch;
85      }
86  
87      @Override
88      public Result filter(final LogEvent event) {
89          return filter(event.getLevel());
90      }
91  
92      @Override
93      public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
94              final Throwable t) {
95          return filter(level);
96      }
97  
98      @Override
99      public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
100             final Throwable t) {
101         return filter(level);
102     }
103 
104     @Override
105     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
106             final Object... params) {
107         return filter(level);
108     }
109 
110     @Override
111     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
112             final Object p0) {
113         return filter(level);
114     }
115 
116     @Override
117     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
118             final Object p0, final Object p1) {
119         return filter(level);
120     }
121 
122     @Override
123     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
124             final Object p0, final Object p1, final Object p2) {
125         return filter(level);
126     }
127 
128     @Override
129     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
130             final Object p0, final Object p1, final Object p2, final Object p3) {
131         return filter(level);
132     }
133 
134     @Override
135     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
136             final Object p0, final Object p1, final Object p2, final Object p3,
137             final Object p4) {
138         return filter(level);
139     }
140 
141     @Override
142     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
143             final Object p0, final Object p1, final Object p2, final Object p3,
144             final Object p4, final Object p5) {
145         return filter(level);
146     }
147 
148     @Override
149     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
150             final Object p0, final Object p1, final Object p2, final Object p3,
151             final Object p4, final Object p5, final Object p6) {
152         return filter(level);
153     }
154 
155     @Override
156     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
157             final Object p0, final Object p1, final Object p2, final Object p3,
158             final Object p4, final Object p5, final Object p6,
159             final Object p7) {
160         return filter(level);
161     }
162 
163     @Override
164     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
165             final Object p0, final Object p1, final Object p2, final Object p3,
166             final Object p4, final Object p5, final Object p6,
167             final Object p7, final Object p8) {
168         return filter(level);
169     }
170 
171     @Override
172     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
173             final Object p0, final Object p1, final Object p2, final Object p3,
174             final Object p4, final Object p5, final Object p6,
175             final Object p7, final Object p8, final Object p9) {
176         return filter(level);
177     }
178 
179     public Level getMinLevel() {
180         return minLevel;
181     }
182 
183     @Override
184     public String toString() {
185         return minLevel.toString();
186     }
187 
188 }