Repository: logging-log4j2 Updated Branches: refs/heads/master a720c1e6a -> 177a66a29
[LOG4J2-428] Add ZLIB compression support. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/177a66a2 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/177a66a2 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/177a66a2 Branch: refs/heads/master Commit: 177a66a294979d809ca8cc01fe89590900ce451c Parents: a720c1e Author: Gary Gregory <garydgreg...@gmail.com> Authored: Thu Sep 11 13:16:47 2014 -0400 Committer: Gary Gregory <garydgreg...@gmail.com> Committed: Thu Sep 11 13:16:47 2014 -0400 ---------------------------------------------------------------------- .../config/plugins/util/TypeConverters.java | 5 +++- .../logging/log4j/core/layout/GelfLayout.java | 27 +++++++++++++++++--- .../config/plugins/util/TypeConvertersTest.java | 3 +++ .../log4j/core/layout/GelfLayoutTest.java | 3 ++- 4 files changed, 33 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/177a66a2/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java index c82074e..0fc2353 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java @@ -36,6 +36,7 @@ import javax.xml.bind.DatatypeConverter; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.layout.GelfLayout; import org.apache.logging.log4j.core.layout.HtmlLayout; import org.apache.logging.log4j.core.net.Facility; import org.apache.logging.log4j.core.net.Protocol; @@ -336,7 +337,7 @@ public final class TypeConverters { } if (s == null) { // don't debug print here, resulting output is hard to understand - //LOGGER.debug("Null string given to convert. Using default [{}].", defaultValue); + // LOGGER.debug("Null string given to convert. Using default [{}].", defaultValue); return parseDefaultValue(converter, defaultValue); } try { @@ -437,6 +438,8 @@ public final class TypeConverters { registry.put(Filter.Result.class, new EnumConverter<Filter.Result>(Filter.Result.class)); registry.put(Facility.class, new EnumConverter<Facility>(Facility.class)); registry.put(Protocol.class, new EnumConverter<Protocol>(Protocol.class)); + registry.put(GelfLayout.CompressionType.class, new EnumConverter<GelfLayout.CompressionType>( + GelfLayout.CompressionType.class)); registry.put(HtmlLayout.FontSize.class, new EnumConverter<HtmlLayout.FontSize>(HtmlLayout.FontSize.class)); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/177a66a2/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java index 78d3293..14561f8 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java @@ -23,6 +23,7 @@ import java.io.StringWriter; import java.math.BigDecimal; import java.util.Collections; import java.util.Map; +import java.util.zip.DeflaterOutputStream; import java.util.zip.GZIPOutputStream; import org.apache.logging.log4j.Level; @@ -62,6 +63,10 @@ import org.apache.logging.log4j.status.StatusLogger; @Plugin(name = "GelfLayout", category = "Core", elementType = "layout", printObject = true) public final class GelfLayout extends AbstractStringLayout { + public static enum CompressionType { + GZIP, ZLIB, NONE + } + private static final byte[] EMPTY_BYTES = new byte[0]; private static final char C = ','; private static final int COMPRESSION_THRESHOLD = 1024; @@ -77,9 +82,11 @@ public final class GelfLayout extends AbstractStringLayout { @PluginAttribute("host") final String host, @PluginElement("AdditionalField") final KeyValuePair[] additionalFields, @PluginAttribute(value = "compressionThreshold", + defaultString = "GZIP") final CompressionType compressionType, + @PluginAttribute(value = "compressionThreshold", defaultInt= COMPRESSION_THRESHOLD) final int compressionThreshold) { // @formatter:on - return new GelfLayout(host, additionalFields, compressionThreshold); + return new GelfLayout(host, additionalFields, compressionType, compressionThreshold); } static String formatTimestamp(final long timeMillis) { @@ -92,17 +99,31 @@ public final class GelfLayout extends AbstractStringLayout { private final int compressionThreshold; - public GelfLayout(final String host, final KeyValuePair[] additionalFields, final int compressionThreshold) { + private CompressionType compressionType; + + public GelfLayout(final String host, final KeyValuePair[] additionalFields, CompressionType compressionType, + final int compressionThreshold) { super(Charsets.UTF_8); this.host = host; this.additionalFields = additionalFields; + this.compressionType = compressionType; this.compressionThreshold = compressionThreshold; } private byte[] compress(final byte[] bytes) { try { final ByteArrayOutputStream baos = new ByteArrayOutputStream(compressionThreshold / 8); - final GZIPOutputStream stream = new GZIPOutputStream(baos); + DeflaterOutputStream stream; + switch (compressionType) { + case GZIP: + stream = new GZIPOutputStream(baos); + break; + case ZLIB: + stream = new DeflaterOutputStream(baos); + break; + default: + return bytes; + } stream.write(bytes); stream.finish(); stream.close(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/177a66a2/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/TypeConvertersTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/TypeConvertersTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/TypeConvertersTest.java index a93a7ca..061817b 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/TypeConvertersTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/util/TypeConvertersTest.java @@ -33,6 +33,7 @@ import java.util.Collection; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.layout.GelfLayout; import org.apache.logging.log4j.core.net.Facility; import org.apache.logging.log4j.core.util.Charsets; import org.junit.Test; @@ -137,6 +138,8 @@ public class TypeConvertersTest { { "Cron", Facility.CRON, null, Facility.class }, { "not a real facility", Facility.AUTH, "auth", Facility.class }, { null, null, null, Facility.class }, + // GELF compression types + { "GZIP", GelfLayout.CompressionType.GZIP, "GZIP", GelfLayout.CompressionType.class }, // arrays { "123", "123".toCharArray(), null, char[].class }, { "123", "123".getBytes(Charset.defaultCharset()), null, byte[].class }, http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/177a66a2/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java index dcedc01..207d1b6 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java @@ -21,6 +21,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.*; import org.apache.logging.log4j.core.config.ConfigurationFactory; +import org.apache.logging.log4j.core.layout.GelfLayout.CompressionType; import org.apache.logging.log4j.core.util.KeyValuePair; import org.apache.logging.log4j.test.appender.ListAppender; import org.junit.AfterClass; @@ -72,7 +73,7 @@ public class GelfLayoutTest { // set up appender final GelfLayout layout = GelfLayout.createLayout(HOSTNAME, new KeyValuePair[] { new KeyValuePair(KEY1, VALUE1), - new KeyValuePair(KEY2, VALUE2), }, 1024); + new KeyValuePair(KEY2, VALUE2), }, CompressionType.GZIP, 1024); // ConsoleAppender appender = new ConsoleAppender("Console", layout); final ListAppender eventAppender = new ListAppender("Events", null, null, true, false); final ListAppender appender = new ListAppender("Layouted", null, layout, true, false);