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.List;
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 @Plugin(name = "PatternLayout", type = "Core", elementType = "layout", printObject = true)
50 public final class PatternLayout extends AbstractStringLayout {
51
52
53
54
55
56 public static final String DEFAULT_CONVERSION_PATTERN = "%m%n";
57
58
59
60
61
62 public static final String TTCC_CONVERSION_PATTERN =
63 "%r [%t] %p %c %x - %m%n";
64
65
66
67
68
69 public static final String SIMPLE_CONVERSION_PATTERN =
70 "%d [%t] %p %c - %m%n";
71
72
73 public static final String KEY = "Converter";
74
75
76
77
78 private List<PatternFormatter> formatters;
79
80
81
82
83 private final String conversionPattern;
84
85
86
87
88
89 private final Configuration config;
90
91 private final RegexReplacement replace;
92
93
94
95
96
97
98
99
100
101 private PatternLayout(final Configuration config, final RegexReplacement replace, final String pattern,
102 final Charset charset) {
103 super(charset);
104 this.replace = replace;
105 this.conversionPattern = pattern;
106 this.config = config;
107 final PatternParser parser = createPatternParser(config);
108 formatters = parser.parse(pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, true);
109 }
110
111
112
113
114
115
116
117
118 public void setConversionPattern(final String conversionPattern) {
119 final String pattern = OptionConverter.convertSpecialChars(conversionPattern);
120 if (pattern == null) {
121 return;
122 }
123 final PatternParser parser = createPatternParser(this.config);
124 formatters = parser.parse(pattern);
125 }
126
127
128
129
130
131
132
133
134 public String toSerializable(final LogEvent event) {
135 final StringBuilder buf = new StringBuilder();
136 for (final PatternFormatter formatter : formatters) {
137 formatter.format(event, buf);
138 }
139 String str = buf.toString();
140 if (replace != null) {
141 str = replace.format(str);
142 }
143 return str;
144 }
145
146
147
148
149
150
151 public static PatternParser createPatternParser(final Configuration config) {
152 if (config == null) {
153 return new PatternParser(config, KEY, LogEventPatternConverter.class);
154 }
155 PatternParser parser = (PatternParser) config.getComponent(KEY);
156 if (parser == null) {
157 parser = new PatternParser(config, KEY, LogEventPatternConverter.class);
158 config.addComponent(KEY, parser);
159 parser = (PatternParser) config.getComponent(KEY);
160 }
161 return parser;
162 }
163
164 @Override
165 public String toString() {
166 return conversionPattern;
167 }
168
169
170
171
172
173
174
175
176
177 @PluginFactory
178 public static PatternLayout createLayout(@PluginAttr("pattern") final String pattern,
179 @PluginConfiguration final Configuration config,
180 @PluginElement("replace") final RegexReplacement replace,
181 @PluginAttr("charset") final String charsetName) {
182 final Charset charset = Charsets.getSupportedCharset(charsetName);
183 return new PatternLayout(config, replace, pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, charset);
184 }
185 }