1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.pattern;
18
19 import java.util.List;
20 import java.util.regex.Pattern;
21
22 import org.apache.logging.log4j.core.LogEvent;
23 import org.apache.logging.log4j.core.config.Configuration;
24 import org.apache.logging.log4j.core.config.plugins.Plugin;
25 import org.apache.logging.log4j.core.layout.PatternLayout;
26
27
28
29
30 @Plugin(name = "replace", category = PatternConverter.CATEGORY)
31 @ConverterKeys({ "replace" })
32 public final class RegexReplacementConverter extends LogEventPatternConverter {
33
34 private final Pattern pattern;
35
36 private final String substitution;
37
38 private final List<PatternFormatter> formatters;
39
40
41
42
43
44
45
46 private RegexReplacementConverter(final List<PatternFormatter> formatters,
47 final Pattern pattern, final String substitution) {
48 super("replace", "replace");
49 this.pattern = pattern;
50 this.substitution = substitution;
51 this.formatters = formatters;
52 }
53
54
55
56
57
58
59
60
61
62 public static RegexReplacementConverter newInstance(final Configuration config, final String[] options) {
63 if (options.length != 3) {
64 LOGGER.error("Incorrect number of options on replace. Expected 3 received " + options.length);
65 return null;
66 }
67 if (options[0] == null) {
68 LOGGER.error("No pattern supplied on replace");
69 return null;
70 }
71 if (options[1] == null) {
72 LOGGER.error("No regular expression supplied on replace");
73 return null;
74 }
75 if (options[2] == null) {
76 LOGGER.error("No substitution supplied on replace");
77 return null;
78 }
79 final Pattern p = Pattern.compile(options[1]);
80 final PatternParser parser = PatternLayout.createPatternParser(config);
81 final List<PatternFormatter> formatters = parser.parse(options[0]);
82 return new RegexReplacementConverter(formatters, p, options[2]);
83 }
84
85
86
87
88
89 @Override
90 public void format(final LogEvent event, final StringBuilder toAppendTo) {
91 final StringBuilder buf = new StringBuilder();
92 for (final PatternFormatter formatter : formatters) {
93 formatter.format(event, buf);
94 }
95 toAppendTo.append(pattern.matcher(buf.toString()).replaceAll(substitution));
96 }
97 }