001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache license, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the license for the specific language governing permissions and
015 * limitations under the license.
016 */
017package org.apache.logging.log4j.core.filter;
018
019import org.apache.logging.log4j.Level;
020import org.apache.logging.log4j.Marker;
021import org.apache.logging.log4j.core.Filter;
022import org.apache.logging.log4j.core.LogEvent;
023import org.apache.logging.log4j.core.Logger;
024import org.apache.logging.log4j.core.config.Node;
025import org.apache.logging.log4j.core.config.plugins.Plugin;
026import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
027import org.apache.logging.log4j.core.config.plugins.PluginFactory;
028import org.apache.logging.log4j.message.Message;
029import org.apache.logging.log4j.util.PerformanceSensitive;
030
031/**
032 * This filter returns the {@code onMatch} result if the level in the {@code LogEvent} is in the range of the configured
033 * min and max levels, otherwise it returns {@code onMismatch} value . For example, if the filter is configured with
034 * {@link Level#ERROR} and {@link Level#INFO} and the LogEvent contains {@link Level#WARN} then the onMatch value will
035 * be returned since {@link Level#WARN WARN} events are in between {@link Level#ERROR ERROR} and {@link Level#INFO
036 * INFO}.
037 * <p>
038 * The default Levels are both {@link Level#ERROR ERROR}.
039 * </p>
040 */
041@Plugin(name = "LevelRangeFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
042@PerformanceSensitive("allocation")
043public final class LevelRangeFilter extends AbstractFilter {
044
045    /**
046     * Creates a ThresholdFilter.
047     *
048     * @param minLevel
049     *            The minimum log Level.
050     * @param maxLevel
051     *            The maximum log Level.
052     * @param match
053     *            The action to take on a match.
054     * @param mismatch
055     *            The action to take on a mismatch.
056     * @return The created ThresholdFilter.
057     */
058    // TODO Consider refactoring to use AbstractFilter.AbstractFilterBuilder
059    @PluginFactory
060    public static LevelRangeFilter createFilter(
061            // @formatter:off
062            @PluginAttribute("minLevel") final Level minLevel,
063            @PluginAttribute("maxLevel") final Level maxLevel,
064            @PluginAttribute("onMatch") final Result match,
065            @PluginAttribute("onMismatch") final Result mismatch) {
066            // @formatter:on
067        final Level actualMinLevel = minLevel == null ? Level.ERROR : minLevel;
068        final Level actualMaxLevel = maxLevel == null ? Level.ERROR : maxLevel;
069        final Result onMatch = match == null ? Result.NEUTRAL : match;
070        final Result onMismatch = mismatch == null ? Result.DENY : mismatch;
071        return new LevelRangeFilter(actualMinLevel, actualMaxLevel, onMatch, onMismatch);
072    }
073    private final Level maxLevel;
074
075    private final Level minLevel;
076
077    private LevelRangeFilter(final Level minLevel, final Level maxLevel, final Result onMatch, final Result onMismatch) {
078        super(onMatch, onMismatch);
079        this.minLevel = minLevel;
080        this.maxLevel = maxLevel;
081    }
082
083    private Result filter(final Level level) {
084        return level.isInRange(this.minLevel, this.maxLevel) ? onMatch : onMismatch;
085    }
086
087    @Override
088    public Result filter(final LogEvent event) {
089        return filter(event.getLevel());
090    }
091
092    @Override
093    public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
094            final Throwable t) {
095        return filter(level);
096    }
097
098    @Override
099    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}