1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.layout;
18
19 import java.util.HashMap;
20 import java.util.Map;
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.config.plugins.PluginAttr;
25 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
26 import org.apache.logging.log4j.core.config.plugins.PluginElement;
27 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
28 import org.apache.logging.log4j.core.helpers.Charsets;
29 import org.apache.logging.log4j.core.helpers.OptionConverter;
30 import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
31 import org.apache.logging.log4j.core.pattern.PatternFormatter;
32 import org.apache.logging.log4j.core.pattern.PatternParser;
33 import org.apache.logging.log4j.core.pattern.RegexReplacement;
34
35 import java.nio.charset.Charset;
36 import java.util.List;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 @Plugin(name = "PatternLayout", type = "Core", elementType = "layout", printObject = true)
52 public final class PatternLayout extends AbstractStringLayout {
53
54
55
56
57
58 public static final String DEFAULT_CONVERSION_PATTERN = "%m%n";
59
60
61
62
63
64 public static final String TTCC_CONVERSION_PATTERN =
65 "%r [%t] %p %c %x - %m%n";
66
67
68
69
70
71 public static final String SIMPLE_CONVERSION_PATTERN =
72 "%d [%t] %p %c - %m%n";
73
74
75 public static final String KEY = "Converter";
76
77
78
79
80 private List<PatternFormatter> formatters;
81
82
83
84
85 private final String conversionPattern;
86
87
88
89
90
91 private final Configuration config;
92
93 private final RegexReplacement replace;
94
95
96
97
98
99
100
101
102
103 private PatternLayout(final Configuration config, final RegexReplacement replace, final String pattern,
104 final Charset charset) {
105 super(charset);
106 this.replace = replace;
107 this.conversionPattern = pattern;
108 this.config = config;
109 final PatternParser parser = createPatternParser(config);
110 formatters = parser.parse(pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, true);
111 }
112
113
114
115
116
117
118
119
120 public void setConversionPattern(final String conversionPattern) {
121 final String pattern = OptionConverter.convertSpecialChars(conversionPattern);
122 if (pattern == null) {
123 return;
124 }
125 final PatternParser parser = createPatternParser(this.config);
126 formatters = parser.parse(pattern);
127 }
128
129
130
131
132
133
134
135
136 public Map<String, String> getContentFormat()
137 {
138 Map<String, String> result = new HashMap<String, String>();
139 result.put("structured", "false");
140 result.put("formatType", "conversion");
141 result.put("format", conversionPattern);
142 return result;
143 }
144
145
146
147
148
149
150
151
152 public String toSerializable(final LogEvent event) {
153 final StringBuilder buf = new StringBuilder();
154 for (final PatternFormatter formatter : formatters) {
155 formatter.format(event, buf);
156 }
157 String str = buf.toString();
158 if (replace != null) {
159 str = replace.format(str);
160 }
161 return str;
162 }
163
164
165
166
167
168
169 public static PatternParser createPatternParser(final Configuration config) {
170 if (config == null) {
171 return new PatternParser(config, KEY, LogEventPatternConverter.class);
172 }
173 PatternParser parser = (PatternParser) config.getComponent(KEY);
174 if (parser == null) {
175 parser = new PatternParser(config, KEY, LogEventPatternConverter.class);
176 config.addComponent(KEY, parser);
177 parser = (PatternParser) config.getComponent(KEY);
178 }
179 return parser;
180 }
181
182 @Override
183 public String toString() {
184 return conversionPattern;
185 }
186
187
188
189
190
191
192
193
194
195 @PluginFactory
196 public static PatternLayout createLayout(@PluginAttr("pattern") final String pattern,
197 @PluginConfiguration final Configuration config,
198 @PluginElement("replace") final RegexReplacement replace,
199 @PluginAttr("charset") final String charsetName) {
200 final Charset charset = Charsets.getSupportedCharset(charsetName);
201 return new PatternLayout(config, replace, pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, charset);
202 }
203 }