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}