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       * Create 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      @PluginFactory
59      public static LevelRangeFilter createFilter(
60              // @formatter:off
61              @PluginAttribute("minLevel") final Level minLevel,
62              @PluginAttribute("maxLevel") final Level maxLevel,
63              @PluginAttribute("onMatch") final Result match,
64              @PluginAttribute("onMismatch") final Result mismatch) {
65              // @formatter:on
66          final Level actualMinLevel = minLevel == null ? Level.ERROR : minLevel;
67          final Level actualMaxLevel = maxLevel == null ? Level.ERROR : maxLevel;
68          final Result onMatch = match == null ? Result.NEUTRAL : match;
69          final Result onMismatch = mismatch == null ? Result.DENY : mismatch;
70          return new LevelRangeFilter(actualMinLevel, actualMaxLevel, onMatch, onMismatch);
71      }
72      private final Level maxLevel;
73  
74      private final Level minLevel;
75  
76      private LevelRangeFilter(final Level minLevel, final Level maxLevel, final Result onMatch, final Result onMismatch) {
77          super(onMatch, onMismatch);
78          this.minLevel = minLevel;
79          this.maxLevel = maxLevel;
80      }
81  
82      private Result filter(final Level level) {
83          return level.isInRange(this.minLevel, this.maxLevel) ? onMatch : onMismatch;
84      }
85  
86      @Override
87      public Result filter(final LogEvent event) {
88          return filter(event.getLevel());
89      }
90  
91      @Override
92      public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
93              final Throwable t) {
94          return filter(level);
95      }
96  
97      @Override
98      public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
99              final Throwable t) {
100         return filter(level);
101     }
102 
103     @Override
104     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
105             final Object... params) {
106         return filter(level);
107     }
108 
109     @Override
110     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
111             final Object p0) {
112         return filter(level);
113     }
114 
115     @Override
116     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
117             final Object p0, final Object p1) {
118         return filter(level);
119     }
120 
121     @Override
122     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
123             final Object p0, final Object p1, final Object p2) {
124         return filter(level);
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         return filter(level);
131     }
132 
133     @Override
134     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
135             final Object p0, final Object p1, final Object p2, final Object p3,
136             final Object p4) {
137         return filter(level);
138     }
139 
140     @Override
141     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
142             final Object p0, final Object p1, final Object p2, final Object p3,
143             final Object p4, final Object p5) {
144         return filter(level);
145     }
146 
147     @Override
148     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
149             final Object p0, final Object p1, final Object p2, final Object p3,
150             final Object p4, final Object p5, final Object p6) {
151         return filter(level);
152     }
153 
154     @Override
155     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
156             final Object p0, final Object p1, final Object p2, final Object p3,
157             final Object p4, final Object p5, final Object p6,
158             final Object p7) {
159         return filter(level);
160     }
161 
162     @Override
163     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
164             final Object p0, final Object p1, final Object p2, final Object p3,
165             final Object p4, final Object p5, final Object p6,
166             final Object p7, final Object p8) {
167         return filter(level);
168     }
169 
170     @Override
171     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
172             final Object p0, final Object p1, final Object p2, final Object p3,
173             final Object p4, final Object p5, final Object p6,
174             final Object p7, final Object p8, final Object p9) {
175         return filter(level);
176     }
177 
178     public Level getMinLevel() {
179         return minLevel;
180     }
181 
182     @Override
183     public String toString() {
184         return minLevel.toString();
185     }
186 
187 }