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 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,
95 final KeyValuePair[] additionalFields) {
96 super(config, new JacksonFactory.YAML(includeStacktrace, stacktraceAsString).newWriter(locationInfo, properties, compact),
97 charset, compact, complete, eventEol, endOfLine,
98 PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(headerPattern).setDefaultPattern(DEFAULT_HEADER).build(),
99 PatternLayout.newSerializerBuilder().setConfiguration(config).setPattern(footerPattern).setDefaultPattern(DEFAULT_FOOTER).build(),
100 includeNullDelimiter,
101 additionalFields);
102 }
103
104
105
106
107
108
109 @Override
110 public byte[] getHeader() {
111 if (!this.complete) {
112 return null;
113 }
114 final StringBuilder buf = new StringBuilder();
115 final String str = serializeToString(getHeaderSerializer());
116 if (str != null) {
117 buf.append(str);
118 }
119 buf.append(this.eol);
120 return getBytes(buf.toString());
121 }
122
123
124
125
126
127
128 @Override
129 public byte[] getFooter() {
130 if (!this.complete) {
131 return null;
132 }
133 final StringBuilder buf = new StringBuilder();
134 buf.append(this.eol);
135 final String str = serializeToString(getFooterSerializer());
136 if (str != null) {
137 buf.append(str);
138 }
139 buf.append(this.eol);
140 return getBytes(buf.toString());
141 }
142
143 @Override
144 public Map<String, String> getContentFormat() {
145 final Map<String, String> result = new HashMap<>();
146 result.put("version", "2.0");
147 return result;
148 }
149
150
151
152
153 @Override
154 public String getContentType() {
155 return CONTENT_TYPE + "; charset=" + this.getCharset();
156 }
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179 @Deprecated
180 public static AbstractJacksonLayout createLayout(
181 final Configuration config,
182 final boolean locationInfo,
183 final boolean properties,
184 final String headerPattern,
185 final String footerPattern,
186 final Charset charset,
187 final boolean includeStacktrace) {
188 return new YamlLayout(config, locationInfo, properties, false, false, true, null, headerPattern, footerPattern,
189 charset, includeStacktrace, false, false, null);
190 }
191
192 @PluginBuilderFactory
193 public static <B extends Builder<B>> B newBuilder() {
194 return new Builder<B>().asBuilder();
195 }
196
197
198
199
200
201
202 public static AbstractJacksonLayout createDefaultLayout() {
203 return new YamlLayout(new DefaultConfiguration(), false, false, false, false, false, null, DEFAULT_HEADER,
204 DEFAULT_FOOTER, StandardCharsets.UTF_8, true, false, false, null);
205 }
206 }