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 onMatch result if the marker in the LogEvent is the same as or has the
033 * configured marker as a parent.
034 */
035@Plugin(name = "MarkerFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
036@PerformanceSensitive("allocation")
037public final class MarkerFilter extends AbstractFilter {
038
039    public static final String ATTR_MARKER = "marker";
040    private final String name;
041
042    private MarkerFilter(final String name, final Result onMatch, final Result onMismatch) {
043        super(onMatch, onMismatch);
044        this.name = name;
045    }
046
047    @Override
048    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
049                         final Object... params) {
050        return filter(marker);
051    }
052
053    @Override
054    public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
055                         final Throwable t) {
056        return filter(marker);
057    }
058
059    @Override
060    public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
061                         final Throwable t) {
062        return filter(marker);
063    }
064
065    @Override
066    public Result filter(final LogEvent event) {
067        return filter(event.getMarker());
068    }
069
070    private Result filter(final Marker marker) {
071        return marker != null && marker.isInstanceOf(name) ? onMatch : onMismatch;
072    }
073
074    @Override
075    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
076            final Object p0) {
077        return filter(marker);
078    }
079
080    @Override
081    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
082            final Object p0, final Object p1) {
083        return filter(marker);
084    }
085
086    @Override
087    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
088            final Object p0, final Object p1, final Object p2) {
089        return filter(marker);
090    }
091
092    @Override
093    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
094            final Object p0, final Object p1, final Object p2, final Object p3) {
095        return filter(marker);
096    }
097
098    @Override
099    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}