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.io.IOException;
20 import java.nio.charset.Charset;
21
22 import org.apache.commons.csv.CSVFormat;
23 import org.apache.commons.csv.QuoteMode;
24 import org.apache.logging.log4j.core.Layout;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.config.Configuration;
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.PluginAttribute;
30 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
31 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
32 import org.apache.logging.log4j.status.StatusLogger;
33
34
35
36
37
38
39
40
41 @Plugin(name = "CsvLogEventLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
42 public class CsvLogEventLayout extends AbstractCsvLayout {
43
44 public static CsvLogEventLayout createDefaultLayout() {
45 return new CsvLogEventLayout(null, Charset.forName(DEFAULT_CHARSET), CSVFormat.valueOf(DEFAULT_FORMAT), null, null);
46 }
47
48 public static CsvLogEventLayout createLayout(final CSVFormat format) {
49 return new CsvLogEventLayout(null, Charset.forName(DEFAULT_CHARSET), format, null, null);
50 }
51
52 @PluginFactory
53 public static CsvLogEventLayout createLayout(
54
55 @PluginConfiguration final Configuration config,
56 @PluginAttribute(value = "format", defaultString = DEFAULT_FORMAT) final String format,
57 @PluginAttribute("delimiter") final Character delimiter,
58 @PluginAttribute("escape") final Character escape,
59 @PluginAttribute("quote") final Character quote,
60 @PluginAttribute("quoteMode") final QuoteMode quoteMode,
61 @PluginAttribute("nullString") final String nullString,
62 @PluginAttribute("recordSeparator") final String recordSeparator,
63 @PluginAttribute(value = "charset", defaultString = DEFAULT_CHARSET) final Charset charset,
64 @PluginAttribute("header") final String header,
65 @PluginAttribute("footer") final String footer)
66
67 {
68
69 final CSVFormat csvFormat = createFormat(format, delimiter, escape, quote, quoteMode, nullString, recordSeparator);
70 return new CsvLogEventLayout(config, charset, csvFormat, header, footer);
71 }
72
73 protected CsvLogEventLayout(final Configuration config, final Charset charset, final CSVFormat csvFormat, final String header, final String footer) {
74 super(config, charset, csvFormat, header, footer);
75 }
76
77 @Override
78 public String toSerializable(final LogEvent event) {
79 final StringBuilder buffer = getStringBuilder();
80 final CSVFormat format = getFormat();
81 try {
82 format.print(event.getNanoTime(), buffer, true);
83 format.print(event.getTimeMillis(), buffer, false);
84 format.print(event.getLevel(), buffer, false);
85 format.print(event.getThreadId(), buffer, false);
86 format.print(event.getThreadName(), buffer, false);
87 format.print(event.getThreadPriority(), buffer, false);
88 format.print(event.getMessage().getFormattedMessage(), buffer, false);
89 format.print(event.getLoggerFqcn(), buffer, false);
90 format.print(event.getLoggerName(), buffer, false);
91 format.print(event.getMarker(), buffer, false);
92 format.print(event.getThrownProxy(), buffer, false);
93 format.print(event.getSource(), buffer, false);
94 format.print(event.getContextData(), buffer, false);
95 format.print(event.getContextStack(), buffer, false);
96 format.println(buffer);
97 return buffer.toString();
98 } catch (final IOException e) {
99 StatusLogger.getLogger().error(event.toString(), e);
100 return format.getCommentMarker() + " " + e;
101 }
102 }
103
104 }