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