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 org.apache.logging.log4j.core.LogEvent;
20 import org.apache.logging.log4j.core.config.Configuration;
21 import org.apache.logging.log4j.core.config.plugins.Plugin;
22 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
23 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
24 import org.apache.logging.log4j.core.config.plugins.PluginElement;
25 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
26 import org.apache.logging.log4j.core.helpers.Charsets;
27 import org.apache.logging.log4j.core.helpers.OptionConverter;
28 import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
29 import org.apache.logging.log4j.core.pattern.PatternFormatter;
30 import org.apache.logging.log4j.core.pattern.PatternParser;
31 import org.apache.logging.log4j.core.pattern.RegexReplacement;
32
33 import java.nio.charset.Charset;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Map;
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 @Plugin(name = "PatternLayout", category = "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 private final boolean handleExceptions;
96
97
98
99
100
101
102
103
104
105
106
107 private PatternLayout(final Configuration config, final RegexReplacement replace, final String pattern,
108 final Charset charset, boolean handleExceptions) {
109 super(charset);
110 this.replace = replace;
111 this.conversionPattern = pattern;
112 this.config = config;
113 this.handleExceptions = handleExceptions;
114 final PatternParser parser = createPatternParser(config);
115 formatters = parser.parse(pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, this.handleExceptions);
116 }
117
118
119
120
121
122
123
124
125 public void setConversionPattern(final String conversionPattern) {
126 final String pattern = OptionConverter.convertSpecialChars(conversionPattern);
127 if (pattern == null) {
128 return;
129 }
130 final PatternParser parser = createPatternParser(this.config);
131 formatters = parser.parse(pattern, this.handleExceptions);
132 }
133
134 public String getConversionPattern() {
135 return conversionPattern;
136 }
137
138
139
140
141
142
143
144
145 @Override
146 public Map<String, String> getContentFormat()
147 {
148 Map<String, String> result = new HashMap<String, String>();
149 result.put("structured", "false");
150 result.put("formatType", "conversion");
151 result.put("format", conversionPattern);
152 return result;
153 }
154
155
156
157
158
159
160
161
162 @Override
163 public String toSerializable(final LogEvent event) {
164 final StringBuilder buf = new StringBuilder();
165 for (final PatternFormatter formatter : formatters) {
166 formatter.format(event, buf);
167 }
168 String str = buf.toString();
169 if (replace != null) {
170 str = replace.format(str);
171 }
172 return str;
173 }
174
175
176
177
178
179
180 public static PatternParser createPatternParser(final Configuration config) {
181 if (config == null) {
182 return new PatternParser(config, KEY, LogEventPatternConverter.class);
183 }
184 PatternParser parser = (PatternParser) config.getComponent(KEY);
185 if (parser == null) {
186 parser = new PatternParser(config, KEY, LogEventPatternConverter.class);
187 config.addComponent(KEY, parser);
188 parser = (PatternParser) config.getComponent(KEY);
189 }
190 return parser;
191 }
192
193 @Override
194 public String toString() {
195 return conversionPattern;
196 }
197
198
199
200
201
202
203
204
205
206
207
208
209 @PluginFactory
210 public static PatternLayout createLayout(@PluginAttr("pattern") final String pattern,
211 @PluginConfiguration final Configuration config,
212 @PluginElement("replace") final RegexReplacement replace,
213 @PluginAttr("charset") final String charsetName,
214 @PluginAttr("suppressExceptions") final String suppressExceptions) {
215 final Charset charset = Charsets.getSupportedCharset(charsetName);
216 boolean handleExceptions = suppressExceptions == null || !Boolean.parseBoolean(suppressExceptions);
217 return new PatternLayout(config, replace, pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, charset,
218 handleExceptions);
219 }
220 }