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", 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
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 public String getConversionPattern() {
130 return conversionPattern;
131 }
132
133
134
135
136
137
138
139
140 public Map<String, String> getContentFormat()
141 {
142 Map<String, String> result = new HashMap<String, String>();
143 result.put("structured", "false");
144 result.put("formatType", "conversion");
145 result.put("format", conversionPattern);
146 return result;
147 }
148
149
150
151
152
153
154
155
156 public String toSerializable(final LogEvent event) {
157 final StringBuilder buf = new StringBuilder();
158 for (final PatternFormatter formatter : formatters) {
159 formatter.format(event, buf);
160 }
161 String str = buf.toString();
162 if (replace != null) {
163 str = replace.format(str);
164 }
165 return str;
166 }
167
168
169
170
171
172
173 public static PatternParser createPatternParser(final Configuration config) {
174 if (config == null) {
175 return new PatternParser(config, KEY, LogEventPatternConverter.class);
176 }
177 PatternParser parser = (PatternParser) config.getComponent(KEY);
178 if (parser == null) {
179 parser = new PatternParser(config, KEY, LogEventPatternConverter.class);
180 config.addComponent(KEY, parser);
181 parser = (PatternParser) config.getComponent(KEY);
182 }
183 return parser;
184 }
185
186 @Override
187 public String toString() {
188 return conversionPattern;
189 }
190
191
192
193
194
195
196
197
198
199 @PluginFactory
200 public static PatternLayout createLayout(@PluginAttr("pattern") final String pattern,
201 @PluginConfiguration final Configuration config,
202 @PluginElement("replace") final RegexReplacement replace,
203 @PluginAttr("charset") final String charsetName) {
204 final Charset charset = Charsets.getSupportedCharset(charsetName);
205 return new PatternLayout(config, replace, pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, charset);
206 }
207 }