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.PluginBuilderAttribute;
027import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
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 logging level in the event matches the specified logging level
033 * exactly.
034 */
035@Plugin(name = "StringMatchFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
036@PerformanceSensitive("allocation")
037public final class StringMatchFilter extends AbstractFilter {
038
039    public static final String ATTR_MATCH = "match";
040    private final String text;
041
042    private StringMatchFilter(final String text, final Result onMatch, final Result onMismatch) {
043        super(onMatch, onMismatch);
044        this.text = text;
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(logger.getMessageFactory().newMessage(msg, params).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg).getFormattedMessage());
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(msg.getFormattedMessage());
063    }
064
065    @Override
066    public Result filter(final LogEvent event) {
067        return filter(event.getMessage().getFormattedMessage());
068    }
069
070    private Result filter(final String msg) {
071        return msg.contains(this.text) ? 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(logger.getMessageFactory().newMessage(msg, p0).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1, p2).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6, p7).getFormattedMessage());
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(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
133                .getFormattedMessage());
134    }
135
136    @Override
137    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
138            final Object p0, final Object p1, final Object p2, final Object p3,
139            final Object p4, final Object p5, final Object p6,
140            final Object p7, final Object p8, final Object p9) {
141        return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
142                .getFormattedMessage());
143    }
144
145    @Override
146    public String toString() {
147        return text;
148    }
149
150    @PluginBuilderFactory
151    public static StringMatchFilter.Builder newBuilder() {
152        return new StringMatchFilter.Builder();
153    }
154
155    public static class Builder extends AbstractFilterBuilder<StringMatchFilter.Builder> implements org.apache.logging.log4j.core.util.Builder<StringMatchFilter> {
156        @PluginBuilderAttribute
157        private String text = "";
158
159        /**
160         * Sets the logging level to use.
161         * @param level the logging level to use.
162         * @return this
163         */
164        public StringMatchFilter.Builder setMatchString(final String text) {
165            this.text = text;
166            return this;
167        }
168
169        @Override
170        public StringMatchFilter build() {
171            return new StringMatchFilter(this.text, this.getOnMatch(), this.getOnMismatch());
172        }
173    }
174
175}