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.PluginBuilderAttribute;
27  import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
28  import org.apache.logging.log4j.message.Message;
29  import org.apache.logging.log4j.message.ParameterizedMessage;
30  import org.apache.logging.log4j.util.PerformanceSensitive;
31  
32  /**
33   * This filter returns the onMatch result if the logging level in the event matches the specified logging level
34   * exactly.
35   */
36  @Plugin(name = "StringMatchFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
37  @PerformanceSensitive("allocation")
38  public final class StringMatchFilter extends AbstractFilter {
39  
40      public static final String ATTR_MATCH = "match";
41      private final String text;
42  
43      private StringMatchFilter(final String text, final Result onMatch, final Result onMismatch) {
44          super(onMatch, onMismatch);
45          this.text = text;
46      }
47  
48      @Override
49      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
50                           final Object... params) {
51          return filter(logger.getMessageFactory().newMessage(msg, params).getFormattedMessage());
52      }
53  
54      @Override
55      public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
56                           final Throwable t) {
57          return filter(logger.getMessageFactory().newMessage(msg).getFormattedMessage());
58      }
59  
60      @Override
61      public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
62                           final Throwable t) {
63          return filter(msg.getFormattedMessage());
64      }
65  
66      @Override
67      public Result filter(final LogEvent event) {
68          return filter(event.getMessage().getFormattedMessage());
69      }
70  
71      private Result filter(final String msg) {
72          return msg.contains(this.text) ? onMatch : onMismatch;
73      }
74  
75      @Override
76      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
77              final Object p0) {
78          return filter(logger.getMessageFactory().newMessage(msg, p0).getFormattedMessage());
79      }
80  
81      @Override
82      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
83              final Object p0, final Object p1) {
84          return filter(logger.getMessageFactory().newMessage(msg, p0, p1).getFormattedMessage());
85      }
86  
87      @Override
88      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
89              final Object p0, final Object p1, final Object p2) {
90          return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2).getFormattedMessage());
91      }
92  
93      @Override
94      public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
95              final Object p0, final Object p1, final Object p2, final Object p3) {
96          return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3).getFormattedMessage());
97      }
98  
99      @Override
100     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
101             final Object p0, final Object p1, final Object p2, final Object p3,
102             final Object p4) {
103         return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4).getFormattedMessage());
104     }
105 
106     @Override
107     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
108             final Object p0, final Object p1, final Object p2, final Object p3,
109             final Object p4, final Object p5) {
110         return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5).getFormattedMessage());
111     }
112 
113     @Override
114     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
115             final Object p0, final Object p1, final Object p2, final Object p3,
116             final Object p4, final Object p5, final Object p6) {
117         return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6).getFormattedMessage());
118     }
119 
120     @Override
121     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
122             final Object p0, final Object p1, final Object p2, final Object p3,
123             final Object p4, final Object p5, final Object p6,
124             final Object p7) {
125         return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6, p7).getFormattedMessage());
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             final Object p4, final Object p5, final Object p6,
132             final Object p7, final Object p8) {
133         return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
134                 .getFormattedMessage());
135     }
136 
137     @Override
138     public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
139             final Object p0, final Object p1, final Object p2, final Object p3,
140             final Object p4, final Object p5, final Object p6,
141             final Object p7, final Object p8, final Object p9) {
142         return filter(logger.getMessageFactory().newMessage(msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
143                 .getFormattedMessage());
144     }
145 
146     @Override
147     public String toString() {
148         return text;
149     }
150 
151     @PluginBuilderFactory
152     public static StringMatchFilter.Builder newBuilder() {
153         return new StringMatchFilter.Builder();
154     }
155 
156     public static class Builder extends AbstractFilterBuilder<StringMatchFilter.Builder> implements org.apache.logging.log4j.core.util.Builder<StringMatchFilter> {
157         @PluginBuilderAttribute
158         private String text = "";
159 
160         /**
161          * Sets the logging level to use.
162          * @param level the logging level to use.
163          * @return this
164          */
165         public StringMatchFilter.Builder setMatchString(final String text) {
166             this.text = text;
167             return this;
168         }
169 
170         @Override
171         public StringMatchFilter build() {
172             return new StringMatchFilter(this.text, this.getOnMatch(), this.getOnMismatch());
173         }
174     }
175 
176 }