You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by gg...@apache.org on 2014/09/15 15:35:33 UTC

git commit: [LOG4J2-428] Implement a GELF layout. Refactor compression type enum to make it create the deflator stream, which avoid a switch in the layout, a bit more OO. Also test ZLIB compression and no compression.

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 837e0aa18 -> a121ae06c


[LOG4J2-428] Implement a GELF layout. Refactor compression type enum to
make it create the deflator stream, which avoid a switch in the layout,
a bit more OO. Also test ZLIB compression and no compression.

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a121ae06
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a121ae06
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a121ae06

Branch: refs/heads/master
Commit: a121ae06c97e18fd945eb615af87fcb676a52523
Parents: 837e0aa
Author: Gary Gregory <ga...@gmail.com>
Authored: Mon Sep 15 09:35:28 2014 -0400
Committer: Gary Gregory <ga...@gmail.com>
Committed: Mon Sep 15 09:35:28 2014 -0400

----------------------------------------------------------------------
 .../logging/log4j/core/layout/GelfLayout.java   | 38 +++++++++++-----
 .../plugins/convert/TypeConvertersTest.java     |  2 +
 .../log4j/core/layout/GelfLayoutTest.java       | 46 +++++++++++++++++---
 3 files changed, 67 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a121ae06/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 c2d9c99..e99e34d 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
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.layout;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.math.BigDecimal;
@@ -67,12 +68,32 @@ import com.fasterxml.jackson.core.io.JsonStringEncoder;
 public final class GelfLayout extends AbstractStringLayout {
 
     public static enum CompressionType {
-        GZIP, NONE, ZLIB
+
+        GZIP {
+            @Override
+            public DeflaterOutputStream createDeflaterOutputStream(OutputStream os) throws IOException {
+                return new GZIPOutputStream(os);
+            }
+        },
+        ZLIB {
+            @Override
+            public DeflaterOutputStream createDeflaterOutputStream(OutputStream os) throws IOException {
+                return new DeflaterOutputStream(os);
+            }
+        },
+        OFF {
+            @Override
+            public DeflaterOutputStream createDeflaterOutputStream(OutputStream os) throws IOException {
+                return null;
+            }
+        };
+
+        public abstract DeflaterOutputStream createDeflaterOutputStream(OutputStream os) throws IOException;
+
     }
 
     private static final char C = ',';
     private static final int COMPRESSION_THRESHOLD = 1024;
-    private static final byte[] EMPTY_BYTES = new byte[0];
     private static final char Q = '\"';
     private static final String QC = "\",";
     private static final String QU = "\"_";
@@ -132,15 +153,8 @@ public final class GelfLayout extends AbstractStringLayout {
     private byte[] compress(final byte[] bytes) {
         try {
             final ByteArrayOutputStream baos = new ByteArrayOutputStream(compressionThreshold / 8);
-            DeflaterOutputStream stream;
-            switch (compressionType) {
-            case GZIP:
-                stream = new GZIPOutputStream(baos);
-                break;
-            case ZLIB:
-                stream = new DeflaterOutputStream(baos);
-                break;
-            default:
+            DeflaterOutputStream stream = compressionType.createDeflaterOutputStream(baos);
+            if (stream == null) {
                 return bytes;
             }
             stream.write(bytes);
@@ -149,7 +163,7 @@ public final class GelfLayout extends AbstractStringLayout {
             return baos.toByteArray();
         } catch (final IOException e) {
             StatusLogger.getLogger().error(e);
-            return EMPTY_BYTES;
+            return bytes;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a121ae06/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java
index 7c6dfb4..39b0dd0 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/convert/TypeConvertersTest.java
@@ -139,6 +139,8 @@ public class TypeConvertersTest {
                 { null, null, null, Facility.class },
                 // GELF compression types
                 { "GZIP", GelfLayout.CompressionType.GZIP, "GZIP", GelfLayout.CompressionType.class },
+                { "ZLIB", GelfLayout.CompressionType.ZLIB, "GZIP", GelfLayout.CompressionType.class },
+                { "OFF", GelfLayout.CompressionType.OFF, "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/a121ae06/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 0d8dac6..edd03eb 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
@@ -19,11 +19,14 @@ package org.apache.logging.log4j.core.layout;
 import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 import java.util.zip.GZIPInputStream;
+import java.util.zip.InflaterInputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.input.TaggedInputStream;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.ThreadContext;
@@ -76,15 +79,14 @@ public class GelfLayoutTest {
 
     Logger root = ctx.getLogger("");
 
-    @Test
-    public void testLayout() throws Exception {
+    private void testCompressedLayout(final CompressionType compressionType) throws IOException {
         for (final Appender appender : root.getAppenders().values()) {
             root.removeAppender(appender);
         }
         // set up appenders
         final GelfLayout layout = GelfLayout.createLayout(HOSTNAME, new KeyValuePair[] {
                 new KeyValuePair(KEY1, VALUE1),
-                new KeyValuePair(KEY2, VALUE2), }, CompressionType.GZIP, 1024);
+                new KeyValuePair(KEY2, VALUE2), }, compressionType, 1024);
         // ConsoleAppender appender = new ConsoleAppender("Console", layout);
         final ListAppender eventAppender = new ListAppender("Events", null, null, true, false);
         final ListAppender rawAppender = new ListAppender("Raw", null, layout, true, true);
@@ -145,12 +147,27 @@ public class GelfLayoutTest {
                         "\"_" + MDCKEY2 + "\": \"" + MDCVALUE2 + "\"" +
                         "}",
                 messages.get(1));
-
+        //@formatter:on
         final byte[] compressed = raw.get(2);
-        final InputStream gzipStream = new GZIPInputStream(new ByteArrayInputStream(compressed));
-        final byte[] uncompressed = IOUtils.toByteArray(gzipStream);
-        gzipStream.close();
+        final ByteArrayInputStream bais = new ByteArrayInputStream(compressed);
+        InputStream inflaterStream = null;
+        switch (compressionType) {
+        case GZIP:
+            inflaterStream = new GZIPInputStream(bais);
+            break;
+        case ZLIB:
+            inflaterStream = new InflaterInputStream(bais);
+            break;
+        case OFF:
+            inflaterStream = new TaggedInputStream(bais);
+            break;
+        default:
+            throw new IllegalStateException("Missing test case clause");
+        }
+        final byte[] uncompressed = IOUtils.toByteArray(inflaterStream);
+        inflaterStream.close();
         final String uncompressedString = new String(uncompressed, layout.getCharset());
+        //@formatter:off
         assertJsonEquals("{" +
                         "\"version\": \"1.1\"," +
                         "\"host\": \"" + HOSTNAME + "\"," +
@@ -169,4 +186,19 @@ public class GelfLayoutTest {
                 uncompressedString);
         //@formatter:on
     }
+
+    @Test
+    public void testLayoutGzipCompression() throws Exception {
+        testCompressedLayout(CompressionType.GZIP);
+    }
+
+    @Test
+    public void testLayoutNoCompression() throws Exception {
+        testCompressedLayout(CompressionType.OFF);
+    }
+
+    @Test
+    public void testLayoutZlibCompression() throws Exception {
+        testCompressedLayout(CompressionType.ZLIB);
+    }
 }