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
21 import org.apache.logging.log4j.core.LogEvent;
22 import org.apache.logging.log4j.core.config.Configuration;
23 import org.apache.logging.log4j.core.config.plugins.Plugin;
24 import org.apache.logging.log4j.core.layout.PatternLayout;
25
26
27
28
29 @Plugin(name = "encode", category = PatternConverter.CATEGORY)
30 @ConverterKeys({ "enc", "encode" })
31 public final class EncodingPatternConverter extends LogEventPatternConverter {
32
33 private final List<PatternFormatter> formatters;
34
35
36
37
38
39
40 private EncodingPatternConverter(final List<PatternFormatter> formatters) {
41 super("encode", "encode");
42 this.formatters = formatters;
43 }
44
45
46
47
48
49
50
51
52 public static EncodingPatternConverter newInstance(final Configuration config, final String[] options) {
53 if (options.length != 1) {
54 LOGGER.error("Incorrect number of options on escape. Expected 1, received " + options.length);
55 return null;
56 }
57 if (options[0] == null) {
58 LOGGER.error("No pattern supplied on escape");
59 return null;
60 }
61 final PatternParser parser = PatternLayout.createPatternParser(config);
62 final List<PatternFormatter> formatters = parser.parse(options[0]);
63 return new EncodingPatternConverter(formatters);
64 }
65
66
67
68
69 @Override
70 public void format(final LogEvent event, final StringBuilder toAppendTo) {
71 final StringBuilder buf = new StringBuilder();
72 for (final PatternFormatter formatter : formatters) {
73 formatter.format(event, buf);
74 }
75 for (int i = 0; i < buf.length(); i++) {
76 final char c = buf.charAt(i);
77 switch (c) {
78 case '\r':
79 toAppendTo.append("\\r");
80 break;
81 case '\n':
82 toAppendTo.append("\\n");
83 break;
84 case '&':
85 toAppendTo.append("&");
86 break;
87 case '<':
88 toAppendTo.append("<");
89 break;
90 case '>':
91 toAppendTo.append(">");
92 break;
93 case '"':
94 toAppendTo.append(""");
95 break;
96 case '\'':
97 toAppendTo.append("'");
98 break;
99 case '/':
100 toAppendTo.append("/");
101 break;
102 default:
103 toAppendTo.append(c);
104 break;
105 }
106 }
107 }
108 }