1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.LogEvent;
22 import org.apache.logging.log4j.core.Logger;
23 import org.apache.logging.log4j.core.config.plugins.Plugin;
24 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
25 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
26 import org.apache.logging.log4j.message.Message;
27
28 import java.util.regex.Matcher;
29 import java.util.regex.Pattern;
30
31
32
33
34
35
36
37
38
39 @Plugin(name = "RegexFilter", type = "Core", elementType = "filter", printObject = true)
40 public final class RegexFilter extends AbstractFilter {
41
42 private final Pattern pattern;
43 private final boolean useRawMessage;
44
45 private RegexFilter(final boolean raw, final Pattern pattern, final Result onMatch, final Result onMismatch) {
46 super(onMatch, onMismatch);
47 this.pattern = pattern;
48 this.useRawMessage = raw;
49 }
50
51 @Override
52 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
53 final Object... params) {
54 return filter(msg);
55 }
56
57 @Override
58 public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
59 final Throwable t) {
60 return filter(msg.toString());
61 }
62
63 @Override
64 public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
65 final Throwable t) {
66 final String text = useRawMessage ? msg.getFormat() : msg.getFormattedMessage();
67 return filter(text);
68 }
69
70 @Override
71 public Result filter(final LogEvent event) {
72 final String text = useRawMessage ? event.getMessage().getFormat() : event.getMessage().getFormattedMessage();
73 return filter(text);
74 }
75
76 private Result filter(final String msg) {
77 if (msg == null) {
78 return onMismatch;
79 }
80 final Matcher m = pattern.matcher(msg);
81 return m.matches() ? onMatch : onMismatch;
82 }
83
84 @Override
85 public String toString() {
86 final StringBuilder sb = new StringBuilder();
87 sb.append("useRaw=").append(useRawMessage);
88 sb.append(", pattern=").append(pattern.toString());
89 return sb.toString();
90 }
91
92
93
94
95
96
97
98
99
100 @PluginFactory
101 public static RegexFilter createFilter(@PluginAttr("regex") final String regex,
102 @PluginAttr("useRawMsg") final String useRawMsg,
103 @PluginAttr("onMatch") final String match,
104 @PluginAttr("onMismatch") final String mismatch) {
105
106 if (regex == null) {
107 LOGGER.error("A regular expression must be provided for RegexFilter");
108 return null;
109 }
110 final boolean raw = useRawMsg == null ? false : Boolean.parseBoolean(useRawMsg);
111 Pattern pattern;
112 try {
113 pattern = Pattern.compile(regex);
114 } catch (final Exception ex) {
115 LOGGER.error("RegexFilter caught exception compiling pattern: " + regex + " cause: " + ex.getMessage());
116 return null;
117 }
118 final Result onMatch = Result.toResult(match);
119 final Result onMismatch = Result.toResult(mismatch);
120
121 return new RegexFilter(raw, pattern, onMatch, onMismatch);
122 }
123
124 }