1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender;
18
19 import java.io.Serializable;
20 import java.nio.charset.Charset;
21 import java.nio.charset.StandardCharsets;
22
23 import org.apache.logging.log4j.core.Appender;
24 import org.apache.logging.log4j.core.Core;
25 import org.apache.logging.log4j.core.Filter;
26 import org.apache.logging.log4j.core.Layout;
27 import org.apache.logging.log4j.core.config.Configuration;
28 import org.apache.logging.log4j.core.config.Property;
29 import org.apache.logging.log4j.core.config.plugins.Plugin;
30 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
31 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
32 import org.apache.logging.log4j.core.config.plugins.PluginElement;
33 import org.apache.logging.log4j.core.layout.LoggerFields;
34 import org.apache.logging.log4j.core.layout.Rfc5424Layout;
35 import org.apache.logging.log4j.core.layout.SyslogLayout;
36 import org.apache.logging.log4j.core.net.AbstractSocketManager;
37 import org.apache.logging.log4j.core.net.Advertiser;
38 import org.apache.logging.log4j.core.net.Facility;
39 import org.apache.logging.log4j.core.net.Protocol;
40 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
41 import org.apache.logging.log4j.core.util.Constants;
42 import org.apache.logging.log4j.util.EnglishEnums;
43
44
45
46
47 @Plugin(name = "Syslog", category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true)
48 public class SyslogAppender extends SocketAppender {
49
50 public static class Builder<B extends Builder<B>> extends AbstractBuilder<B>
51 implements org.apache.logging.log4j.core.util.Builder<SocketAppender> {
52
53 @PluginBuilderAttribute(value = "facility")
54 private Facility facility = Facility.LOCAL0;
55
56 @PluginBuilderAttribute("id")
57 private String id;
58
59 @PluginBuilderAttribute(value = "enterpriseNumber")
60 private int enterpriseNumber = Rfc5424Layout.DEFAULT_ENTERPRISE_NUMBER;
61
62 @PluginBuilderAttribute(value = "includeMdc")
63 private boolean includeMdc = true;
64
65 @PluginBuilderAttribute("mdcId")
66 private String mdcId;
67
68 @PluginBuilderAttribute("mdcPrefix")
69 private String mdcPrefix;
70
71 @PluginBuilderAttribute("eventPrefix")
72 private String eventPrefix;
73
74 @PluginBuilderAttribute(value = "newLine")
75 private boolean newLine;
76
77 @PluginBuilderAttribute("newLineEscape")
78 private String escapeNL;
79
80 @PluginBuilderAttribute("appName")
81 private String appName;
82
83 @PluginBuilderAttribute("messageId")
84 private String msgId;
85
86 @PluginBuilderAttribute("mdcExcludes")
87 private String excludes;
88
89 @PluginBuilderAttribute("mdcIncludes")
90 private String includes;
91
92 @PluginBuilderAttribute("mdcRequired")
93 private String required;
94
95 @PluginBuilderAttribute("format")
96 private String format;
97
98 @PluginBuilderAttribute("charset")
99 private Charset charsetName = StandardCharsets.UTF_8;
100
101 @PluginBuilderAttribute("exceptionPattern")
102 private String exceptionPattern;
103
104 @PluginElement("LoggerFields")
105 private LoggerFields[] loggerFields;
106
107 @SuppressWarnings({"resource", "unchecked"})
108 @Override
109 public SyslogAppender build() {
110 final Protocol protocol = getProtocol();
111 final SslConfiguration sslConfiguration = getSslConfiguration();
112 final boolean useTlsMessageFormat = sslConfiguration != null || protocol == Protocol.SSL;
113 final Configuration configuration = getConfiguration();
114 Layout<? extends Serializable> layout = getLayout();
115 if (layout == null) {
116 layout = RFC5424.equalsIgnoreCase(format)
117 ? Rfc5424Layout.createLayout(facility, id, enterpriseNumber, includeMdc, mdcId, mdcPrefix,
118 eventPrefix, newLine, escapeNL, appName, msgId, excludes, includes, required,
119 exceptionPattern, useTlsMessageFormat, loggerFields, configuration)
120 :
121
122 SyslogLayout.newBuilder()
123 .setFacility(facility)
124 .setIncludeNewLine(newLine)
125 .setEscapeNL(escapeNL)
126 .setCharset(charsetName)
127 .build();
128
129 }
130 final String name = getName();
131 if (name == null) {
132 LOGGER.error("No name provided for SyslogAppender");
133 return null;
134 }
135 final AbstractSocketManager manager = createSocketManager(name, protocol, getHost(), getPort(), getConnectTimeoutMillis(),
136 sslConfiguration, getReconnectDelayMillis(), getImmediateFail(), layout, Constants.ENCODER_BYTE_BUFFER_SIZE, null);
137
138 return new SyslogAppender(name, layout, getFilter(), isIgnoreExceptions(), isImmediateFlush(), manager,
139 getAdvertise() ? configuration.getAdvertiser() : null, null);
140 }
141
142 public Facility getFacility() {
143 return facility;
144 }
145
146 public String getId() {
147 return id;
148 }
149
150 public int getEnterpriseNumber() {
151 return enterpriseNumber;
152 }
153
154 public boolean isIncludeMdc() {
155 return includeMdc;
156 }
157
158 public String getMdcId() {
159 return mdcId;
160 }
161
162 public String getMdcPrefix() {
163 return mdcPrefix;
164 }
165
166 public String getEventPrefix() {
167 return eventPrefix;
168 }
169
170 public boolean isNewLine() {
171 return newLine;
172 }
173
174 public String getEscapeNL() {
175 return escapeNL;
176 }
177
178 public String getAppName() {
179 return appName;
180 }
181
182 public String getMsgId() {
183 return msgId;
184 }
185
186 public String getExcludes() {
187 return excludes;
188 }
189
190 public String getIncludes() {
191 return includes;
192 }
193
194 public String getRequired() {
195 return required;
196 }
197
198 public String getFormat() {
199 return format;
200 }
201
202 public Charset getCharsetName() {
203 return charsetName;
204 }
205
206 public String getExceptionPattern() {
207 return exceptionPattern;
208 }
209
210 public LoggerFields[] getLoggerFields() {
211 return loggerFields;
212 }
213
214 public B setFacility(final Facility facility) {
215 this.facility = facility;
216 return asBuilder();
217 }
218
219 public B setId(final String id) {
220 this.id = id;
221 return asBuilder();
222 }
223
224 public B setEnterpriseNumber(final int enterpriseNumber) {
225 this.enterpriseNumber = enterpriseNumber;
226 return asBuilder();
227 }
228
229 public B setIncludeMdc(final boolean includeMdc) {
230 this.includeMdc = includeMdc;
231 return asBuilder();
232 }
233
234 public B setMdcId(final String mdcId) {
235 this.mdcId = mdcId;
236 return asBuilder();
237 }
238
239 public B setMdcPrefix(final String mdcPrefix) {
240 this.mdcPrefix = mdcPrefix;
241 return asBuilder();
242 }
243
244 public B setEventPrefix(final String eventPrefix) {
245 this.eventPrefix = eventPrefix;
246 return asBuilder();
247 }
248
249 public B setNewLine(final boolean newLine) {
250 this.newLine = newLine;
251 return asBuilder();
252 }
253
254 public B setEscapeNL(final String escapeNL) {
255 this.escapeNL = escapeNL;
256 return asBuilder();
257 }
258
259 public B setAppName(final String appName) {
260 this.appName = appName;
261 return asBuilder();
262 }
263
264 public B setMsgId(final String msgId) {
265 this.msgId = msgId;
266 return asBuilder();
267 }
268
269 public B setExcludes(final String excludes) {
270 this.excludes = excludes;
271 return asBuilder();
272 }
273
274 public B setIncludes(final String includes) {
275 this.includes = includes;
276 return asBuilder();
277 }
278
279 public B setRequired(final String required) {
280 this.required = required;
281 return asBuilder();
282 }
283
284 public B setFormat(final String format) {
285 this.format = format;
286 return asBuilder();
287 }
288
289 public B setCharsetName(final Charset charset) {
290 this.charsetName = charset;
291 return asBuilder();
292 }
293
294 public B setExceptionPattern(final String exceptionPattern) {
295 this.exceptionPattern = exceptionPattern;
296 return asBuilder();
297 }
298
299 public B setLoggerFields(final LoggerFields[] loggerFields) {
300 this.loggerFields = loggerFields;
301 return asBuilder();
302 }
303 }
304
305 protected static final String RFC5424 = "RFC5424";
306
307 protected SyslogAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
308 final boolean ignoreExceptions, final boolean immediateFlush,
309 final AbstractSocketManager manager, final Advertiser advertiser, final Property[] properties) {
310 super(name, layout, filter, manager, ignoreExceptions, immediateFlush, advertiser, properties);
311 }
312
313
314
315
316
317 @Deprecated
318 protected SyslogAppender(final String name, final Layout<? extends Serializable> layout, final Filter filter,
319 final boolean ignoreExceptions, final boolean immediateFlush, final AbstractSocketManager manager,
320 final Advertiser advertiser) {
321 super(name, layout, filter, manager, ignoreExceptions, immediateFlush, advertiser, Property.EMPTY_ARRAY);
322 }
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363 @Deprecated
364 public static <B extends Builder<B>> SyslogAppender createAppender(
365
366 final String host,
367 final int port,
368 final String protocolStr,
369 final SslConfiguration sslConfiguration,
370 final int connectTimeoutMillis,
371 final int reconnectDelayMillis,
372 final boolean immediateFail,
373 final String name,
374 final boolean immediateFlush,
375 final boolean ignoreExceptions,
376 final Facility facility,
377 final String id,
378 final int enterpriseNumber,
379 final boolean includeMdc,
380 final String mdcId,
381 final String mdcPrefix,
382 final String eventPrefix,
383 final boolean newLine,
384 final String escapeNL,
385 final String appName,
386 final String msgId,
387 final String excludes,
388 final String includes,
389 final String required,
390 final String format,
391 final Filter filter,
392 final Configuration configuration,
393 final Charset charset,
394 final String exceptionPattern,
395 final LoggerFields[] loggerFields,
396 final boolean advertise) {
397
398
399
400 return SyslogAppender.<B>newSyslogAppenderBuilder()
401 .withHost(host)
402 .withPort(port)
403 .withProtocol(EnglishEnums.valueOf(Protocol.class, protocolStr))
404 .withSslConfiguration(sslConfiguration)
405 .withConnectTimeoutMillis(connectTimeoutMillis)
406 .withReconnectDelayMillis(reconnectDelayMillis)
407 .withImmediateFail(immediateFail).setName(appName)
408 .withImmediateFlush(immediateFlush).setIgnoreExceptions(ignoreExceptions).setFilter(filter)
409 .setConfiguration(configuration)
410 .withAdvertise(advertise)
411 .setFacility(facility)
412 .setId(id)
413 .setEnterpriseNumber(enterpriseNumber)
414 .setIncludeMdc(includeMdc)
415 .setMdcId(mdcId)
416 .setMdcPrefix(mdcPrefix)
417 .setEventPrefix(eventPrefix)
418 .setNewLine(newLine)
419 .setAppName(appName)
420 .setMsgId(msgId)
421 .setExcludes(excludes)
422 .setIncludeMdc(includeMdc)
423 .setRequired(required)
424 .setFormat(format)
425 .setCharsetName(charset)
426 .setExceptionPattern(exceptionPattern)
427 .setLoggerFields(loggerFields)
428 .build();
429
430 }
431
432
433 @PluginBuilderFactory
434 public static <B extends Builder<B>> B newSyslogAppenderBuilder() {
435 return new Builder<B>().asBuilder();
436 }
437
438 }