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.nio.charset.Charset;
20 import java.nio.charset.StandardCharsets;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.apache.logging.log4j.core.Layout;
25 import org.apache.logging.log4j.core.config.Configuration;
26 import org.apache.logging.log4j.core.config.DefaultConfiguration;
27 import org.apache.logging.log4j.core.config.Node;
28 import org.apache.logging.log4j.core.config.plugins.Plugin;
29 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
30 import org.apache.logging.log4j.core.util.KeyValuePair;
31 import org.apache.logging.log4j.util.Strings;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 @Plugin(name = "YamlLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
49 public final class YamlLayout extends AbstractJacksonLayout {
50
51 private static final String DEFAULT_FOOTER = Strings.EMPTY;
52
53 private static final String DEFAULT_HEADER = Strings.EMPTY;
54
55 static final String CONTENT_TYPE = "application/yaml";
56
57 public static class Builder<B extends Builder<B>> extends AbstractJacksonLayout.Builder<B>
58 implements org.apache.logging.log4j.core.util.Builder<YamlLayout> {
59
60 public Builder() {
61 super();
62 setCharset(StandardCharsets.UTF_8);
63 }
64
65 @Override
66 public YamlLayout build() {
67 final String headerPattern = toStringOrNull(getHeader());
68 final String footerPattern = toStringOrNull(getFooter());
69 return new YamlLayout(getConfiguration(), isLocationInfo(), isProperties(), isComplete(),
70 isCompact(), getEventEol(), getEndOfLine(), headerPattern, footerPattern, getCharset(),
71 isIncludeStacktrace(), isStacktraceAsString(), isIncludeNullDelimiter(),
72 isIncludeTimeMillis(), getAdditionalFields());
73 }
74 }
75
76
77
78
79 @Deprecated
80 protected YamlLayout(final Configuration config, final boolean locationInfo, final boolean properties,
81 final boolean complete, final boolean compact, final boolean eventEol, final String headerPattern,
82 final String footerPattern, final Charset charset, final boolean includeStacktrace) {
83 super(config, new JacksonFactory.YAML(includeStacktrace, false).newWriter(locationInfo, properties, compact),
84 charset, compact, complete, eventEol, null,
85 PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(headerPattern).setDefaultPattern(DEFAULT_HEADER).build(),
86 PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(footerPattern).setDefaultPattern(DEFAULT_FOOTER).build(),
87 false, null);
88 }
89
90 private YamlLayout(final Configuration config, final boolean locationInfo, final boolean properties,
91 final boolean complete, final boolean compact, final boolean eventEol, final String endOfLine,
92 final String headerPattern, final String footerPattern, final Charset charset,
93 final boolean includeStacktrace, final boolean stacktraceAsString,
94 final boolean includeNullDelimiter, final boolean includeTimeMillis,
95 final KeyValuePair[] additionalFields) {
96 super(config, new JacksonFactory.YAML(includeStacktrace, stacktraceAsString)
97 .newWriter(locationInfo, properties, compact, includeTimeMillis),
98 charset, compact, complete, eventEol, endOfLine,
99 PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(headerPattern).setDefaultPattern(DEFAULT_HEADER).build(),
100 PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(footerPattern).setDefaultPattern(DEFAULT_FOOTER).build(),
101 includeNullDelimiter,
102 additionalFields);
103 }
104
105
106
107
108
109
110 @Override
111 public byte[] getHeader() {
112 if (!this.complete) {
113 return null;
114 }
115 final StringBuilder buf = new StringBuilder();
116 final String str = serializeToString(getHeaderSerializer());
117 if (str != null) {
118 buf.append(str);
119 }
120 buf.append(this.eol);
121 return getBytes(buf.toString());
122 }
123
124
125
126
127
128
129 @Override
130 public byte[] getFooter() {
131 if (!this.complete) {
132 return null;
133 }
134 final StringBuilder buf = new StringBuilder();
135 buf.append(this.eol);
136 final String str = serializeToString(getFooterSerializer());
137 if (str != null) {
138 buf.append(str);
139 }
140 buf.append(this.eol);
141 return getBytes(buf.toString());
142 }
143
144 @Override
145 public Map<String, String> getContentFormat() {
146 final Map<String, String> result = new HashMap<>();
147 result.put("version", "2.0");
148 return result;
149 }
150
151
152
153
154 @Override
155 public String getContentType() {
156 return CONTENT_TYPE + "; charset=" + this.getCharset();
157 }
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180 @Deprecated
181 public static AbstractJacksonLayout createLayout(
182 final Configuration config,
183 final boolean locationInfo,
184 final boolean properties,
185 final String headerPattern,
186 final String footerPattern,
187 final Charset charset,
188 final boolean includeStacktrace) {
189 return new YamlLayout(config, locationInfo, properties, false, false, true, null, headerPattern, footerPattern,
190 charset, includeStacktrace, false, false, false, null);
191 }
192
193 @PluginBuilderFactory
194 public static <B extends Builder<B>> B newBuilder() {
195 return new Builder<B>().asBuilder();
196 }
197
198
199
200
201
202
203 public static AbstractJacksonLayout createDefaultLayout() {
204 return new YamlLayout(new DefaultConfiguration(), false, false, false, false, false, null, DEFAULT_HEADER,
205 DEFAULT_FOOTER, StandardCharsets.UTF_8, true, false, false, false, null);
206 }
207 }