Repository: logging-log4j2 Updated Branches: refs/heads/master d52b9b542 -> 4ab1f4c13
[LOG4J2-1088] Add Comma Separated Value (CSV) layouts for parameter and event logging. Clean up messes. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4ab1f4c1 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4ab1f4c1 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4ab1f4c1 Branch: refs/heads/master Commit: 4ab1f4c130e4fb62a46212b7469f24a87bfaaee4 Parents: d52b9b5 Author: ggregory <[email protected]> Authored: Mon Sep 7 23:15:12 2015 -0700 Committer: ggregory <[email protected]> Committed: Mon Sep 7 23:15:12 2015 -0700 ---------------------------------------------------------------------- .../log4j/core/layout/AbstractCsvLayout.java | 70 ++++++++++++++ .../logging/log4j/core/layout/CsvLayout.java | 97 -------------------- .../log4j/core/layout/CsvLogEventLayout.java | 6 +- .../log4j/core/layout/CsvParameterLayout.java | 10 +- .../core/layout/CsvLogEventLayoutTest.java | 10 +- .../core/layout/CsvParameterLayoutTest.java | 10 +- 6 files changed, 90 insertions(+), 113 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4ab1f4c1/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java new file mode 100644 index 0000000..9c29ef1 --- /dev/null +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractCsvLayout.java @@ -0,0 +1,70 @@ +package org.apache.logging.log4j.core.layout; + +import java.nio.charset.Charset; + +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.QuoteMode; + +/** + * A Comma-Separated Value (CSV) layout. + * + * <p> + * Best used with: + * </p> + * <p> + * {@code logger.debug(new ObjectArrayMessage(1, 2, "Bob"));} + * </p> + * + * Depends on Apache Commons CSV 1.2. + * + * @since 2.4 + */ +public abstract class AbstractCsvLayout extends AbstractStringLayout { + + private static final String CONTENT_TYPE = "text/csv"; + protected static final String DEFAULT_CHARSET = "UTF-8"; + protected static final String DEFAULT_FORMAT = "Default"; + private static final long serialVersionUID = 1L; + + protected static CSVFormat createFormat(final String format, final Character delimiter, final Character escape, final Character quote, final QuoteMode quoteMode, final String nullString, + final String recordSeparator) { + CSVFormat csvFormat = CSVFormat.valueOf(format); + if (delimiter != null) { + csvFormat = csvFormat.withDelimiter(delimiter); + } + if (escape != null) { + csvFormat = csvFormat.withEscape(escape); + } + if (quote != null) { + csvFormat = csvFormat.withQuote(quote); + } + if (quoteMode != null) { + csvFormat = csvFormat.withQuoteMode(quoteMode); + } + if (nullString != null) { + csvFormat = csvFormat.withNullString(nullString); + } + if (recordSeparator != null) { + csvFormat = csvFormat.withRecordSeparator(recordSeparator); + } + return csvFormat; + } + + private final CSVFormat format; + + protected AbstractCsvLayout(final Charset charset, final CSVFormat csvFormat, final String header, + final String footer) { + super(charset, toBytes(header, charset), toBytes(footer, charset)); + this.format = csvFormat; + } + + @Override + public String getContentType() { + return CONTENT_TYPE + "; charset=" + this.getCharset(); + } + + public CSVFormat getFormat() { + return format; + } + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4ab1f4c1/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLayout.java deleted file mode 100644 index 67da734..0000000 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLayout.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.apache.logging.log4j.core.layout; - -import java.io.IOException; -import java.nio.charset.Charset; - -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVPrinter; -import org.apache.commons.csv.QuoteMode; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.config.Node; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.message.Message; -import org.apache.logging.log4j.status.StatusLogger; - -/** - * A Comma-Separated Value (CSV) layout. - * - * <p> - * Best used with: - * </p> - * <p> - * {@code logger.debug(new ObjectArrayMessage(1, 2, "Bob"));} - * </p> - * - * Depends on Apache Commons CSV 1.2. - * - * @since 2.4 - */ -@Plugin(name = "CsvLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true) -public class CsvLayout extends AbstractStringLayout { - - private static final String CONTENT_TYPE = "text/csv"; - protected static final String DEFAULT_CHARSET = "UTF-8"; - protected static final String DEFAULT_FORMAT = "Default"; - private static final long serialVersionUID = 1L; - - protected static CSVFormat createFormat(final String format, final Character delimiter, final Character escape, final Character quote, final QuoteMode quoteMode, final String nullString, - final String recordSeparator) { - CSVFormat csvFormat = CSVFormat.valueOf(format); - if (delimiter != null) { - csvFormat = csvFormat.withDelimiter(delimiter); - } - if (escape != null) { - csvFormat = csvFormat.withEscape(escape); - } - if (quote != null) { - csvFormat = csvFormat.withQuote(quote); - } - if (quoteMode != null) { - csvFormat = csvFormat.withQuoteMode(quoteMode); - } - if (nullString != null) { - csvFormat = csvFormat.withNullString(nullString); - } - if (recordSeparator != null) { - csvFormat = csvFormat.withRecordSeparator(recordSeparator); - } - return csvFormat; - } - - private final CSVFormat format; - - protected CsvLayout(final Charset charset, final CSVFormat csvFormat, final String header, - final String footer) { - super(charset, toBytes(header, charset), toBytes(footer, charset)); - this.format = csvFormat; - } - - @Override - public String getContentType() { - return CONTENT_TYPE + "; charset=" + this.getCharset(); - } - - public CSVFormat getFormat() { - return format; - } - - @Override - public String toSerializable(final LogEvent event) { - final Message message = event.getMessage(); - final Object[] parameters = message.getParameters(); - final StringBuilder buffer = new StringBuilder(1024); - try { - // Revisit when 1.3 is out so that we do not need to create a new - // printer for each event. - // No need to close the printer. - final CSVPrinter printer = new CSVPrinter(buffer, getFormat()); - printer.printRecord(parameters); - return buffer.toString(); - } catch (final IOException e) { - StatusLogger.getLogger().error(message, e); - return getFormat().getCommentMarker() + " " + e; - } - } - -} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4ab1f4c1/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java index 7be65d6..bee5eed 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvLogEventLayout.java @@ -6,12 +6,16 @@ import java.nio.charset.Charset; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.QuoteMode; +import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.config.Node; +import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.status.StatusLogger; -public class CsvLogEventLayout extends CsvLayout { +@Plugin(name = "CsvLogEventLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true) +public class CsvLogEventLayout extends AbstractCsvLayout { /** * http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4ab1f4c1/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java index 09d1ef1..338049b 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/CsvParameterLayout.java @@ -30,21 +30,21 @@ import org.apache.logging.log4j.status.StatusLogger; * * @since 2.4 */ -@Plugin(name = "CsvLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true) -public class CsvParameterLayout extends CsvLayout { +@Plugin(name = "CsvParameterLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true) +public class CsvParameterLayout extends AbstractCsvLayout { private static final long serialVersionUID = 1L; - public static CsvLayout createDefaultLayout() { + public static AbstractCsvLayout createDefaultLayout() { return new CsvParameterLayout(Charset.forName(DEFAULT_CHARSET), CSVFormat.valueOf(DEFAULT_FORMAT), null, null); } - public static CsvLayout createLayout(final CSVFormat format) { + public static AbstractCsvLayout createLayout(final CSVFormat format) { return new CsvParameterLayout(Charset.forName(DEFAULT_CHARSET), format, null, null); } @PluginFactory - public static CsvLayout createLayout( + public static AbstractCsvLayout createLayout( // @formatter:off @PluginAttribute(value = "format", defaultString = DEFAULT_FORMAT) final String format, @PluginAttribute("delimiter") final Character delimiter, http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4ab1f4c1/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java index 4df936e..f0f6d95 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvLogEventLayoutTest.java @@ -37,7 +37,7 @@ import org.junit.BeforeClass; import org.junit.Test; /** - * Tests {@link CsvLayout}. + * Tests {@link AbstractCsvLayout}. * * @since 2.4 */ @@ -64,25 +64,25 @@ public class CsvLogEventLayoutTest { @Test public void testCustomCharset() { - final CsvLayout layout = CsvLogEventLayout.createLayout("Excel", null, null, null, null, null, null, + final AbstractCsvLayout layout = CsvLogEventLayout.createLayout("Excel", null, null, null, null, null, null, StandardCharsets.UTF_16, null, null); assertEquals("text/csv; charset=UTF-16", layout.getContentType()); } @Test public void testDefaultCharset() { - final CsvLayout layout = CsvLogEventLayout.createDefaultLayout(); + final AbstractCsvLayout layout = CsvLogEventLayout.createDefaultLayout(); assertEquals(StandardCharsets.UTF_8, layout.getCharset()); } @Test public void testDefaultContentType() { - final CsvLayout layout = CsvLogEventLayout.createDefaultLayout(); + final AbstractCsvLayout layout = CsvLogEventLayout.createDefaultLayout(); assertEquals("text/csv; charset=UTF-8", layout.getContentType()); } private void testLayout(final CSVFormat format) { - final CsvLayout layout = CsvLogEventLayout.createLayout(format); + final AbstractCsvLayout layout = CsvLogEventLayout.createLayout(format); final Map<String, Appender> appenders = root.getAppenders(); for (final Appender appender : appenders.values()) { root.removeAppender(appender); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4ab1f4c1/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java index d9a04c5..0bbe3c6 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/CsvParameterLayoutTest.java @@ -38,7 +38,7 @@ import org.junit.BeforeClass; import org.junit.Test; /** - * Tests {@link CsvLayout}. + * Tests {@link AbstractCsvLayout}. * * @since 2.4 */ @@ -65,24 +65,24 @@ public class CsvParameterLayoutTest { @Test public void testCustomCharset() { - final CsvLayout layout = CsvParameterLayout.createLayout("Excel", null, null, null, null, null, null, + final AbstractCsvLayout layout = CsvParameterLayout.createLayout("Excel", null, null, null, null, null, null, StandardCharsets.UTF_16, null, null); assertEquals("text/csv; charset=UTF-16", layout.getContentType()); } @Test public void testDefaultCharset() { - final CsvLayout layout = CsvParameterLayout.createDefaultLayout(); + final AbstractCsvLayout layout = CsvParameterLayout.createDefaultLayout(); assertEquals(StandardCharsets.UTF_8, layout.getCharset()); } @Test public void testDefaultContentType() { - final CsvLayout layout = CsvParameterLayout.createDefaultLayout(); + final AbstractCsvLayout layout = CsvParameterLayout.createDefaultLayout(); assertEquals("text/csv; charset=UTF-8", layout.getContentType()); } - private void testLayoutNormalApi(final CsvLayout layout, boolean messageApi) throws Exception { + private void testLayoutNormalApi(final AbstractCsvLayout layout, boolean messageApi) throws Exception { final Map<String, Appender> appenders = root.getAppenders(); for (final Appender appender : appenders.values()) { root.removeAppender(appender);
