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 2015/07/08 12:08:10 UTC

[3/3] logging-log4j2 git commit: [LOG4J2-1078] GelfLayout throws exception if some log event fields are null.

[LOG4J2-1078] GelfLayout throws exception if some log event fields are
null.

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

Branch: refs/heads/master
Commit: 6597356106f2ed2c56683f16fe6d84b160edacc5
Parents: ec2f1d6
Author: ggregory <gg...@apache.org>
Authored: Wed Jul 8 03:08:05 2015 -0700
Committer: ggregory <gg...@apache.org>
Committed: Wed Jul 8 03:08:05 2015 -0700

----------------------------------------------------------------------
 .../logging/log4j/core/layout/GelfLayout.java   | 23 +++++++++++++-------
 src/changes/changes.xml                         |  3 +++
 2 files changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65973561/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 19ab128..97414a8 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
@@ -39,14 +39,16 @@ import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.net.Severity;
 import org.apache.logging.log4j.core.util.KeyValuePair;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 
 import com.fasterxml.jackson.core.io.JsonStringEncoder;
 
 /**
  * Lays out events in the Graylog Extended Log Format (GELF) 1.1.
  * <p>
- * This layout compresses JSON to GZIP or ZLIB (the {@code compressionType}) if log event data is larger than 1024 bytes
- * (the {@code compressionThreshold}). This layout does not implement chunking.
+ * This layout compresses JSON to GZIP or ZLIB (the {@code compressionType}) if
+ * log event data is larger than 1024 bytes (the {@code compressionThreshold}).
+ * This layout does not implement chunking.
  * </p>
  * <p>
  * Configure as follows to send to a Graylog2 server:
@@ -64,7 +66,8 @@ import com.fasterxml.jackson.core.io.JsonStringEncoder;
  * </pre>
  *
  * @see <a href="http://graylog2.org/gelf">GELF home page</a>
- * @see <a href="http://graylog2.org/resources/gelf/specification">GELF specification</a>
+ * @see <a href="http://graylog2.org/resources/gelf/specification">GELF
+ *      specification</a>
  */
 @Plugin(name = "GelfLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
 public final class GelfLayout extends AbstractStringLayout {
@@ -191,7 +194,7 @@ public final class GelfLayout extends AbstractStringLayout {
         final JsonStringEncoder jsonEncoder = JsonStringEncoder.getInstance();
         builder.append('{');
         builder.append("\"version\":\"1.1\",");
-        builder.append("\"host\":\"").append(jsonEncoder.quoteAsString(host)).append(QC);
+        builder.append("\"host\":\"").append(jsonEncoder.quoteAsString(toNullSafeString(host))).append(QC);
         builder.append("\"timestamp\":").append(formatTimestamp(event.getTimeMillis())).append(C);
         builder.append("\"level\":").append(formatLevel(event.getLevel())).append(C);
         if (event.getThreadName() != null) {
@@ -203,20 +206,24 @@ public final class GelfLayout extends AbstractStringLayout {
 
         for (final KeyValuePair additionalField : additionalFields) {
             builder.append(QU).append(jsonEncoder.quoteAsString(additionalField.getKey())).append("\":\"")
-                    .append(jsonEncoder.quoteAsString(additionalField.getValue())).append(QC);
+                    .append(jsonEncoder.quoteAsString(toNullSafeString(additionalField.getValue()))).append(QC);
         }
         for (final Map.Entry<String, String> entry : event.getContextMap().entrySet()) {
             builder.append(QU).append(jsonEncoder.quoteAsString(entry.getKey())).append("\":\"")
-                    .append(jsonEncoder.quoteAsString(entry.getValue())).append(QC);
+                    .append(jsonEncoder.quoteAsString(toNullSafeString(entry.getValue()))).append(QC);
         }
         if (event.getThrown() != null) {
             builder.append("\"full_message\":\"").append(jsonEncoder.quoteAsString(formatThrowable(event.getThrown())))
                     .append(QC);
         }
 
-        builder.append("\"short_message\":\"")
-                .append(jsonEncoder.quoteAsString(event.getMessage().getFormattedMessage())).append(Q);
+        builder.append("\"short_message\":\"").append(jsonEncoder.quoteAsString(toNullSafeString(event.getMessage().getFormattedMessage())))
+                .append(Q);
         builder.append('}');
         return builder.toString();
     }
+
+    private String toNullSafeString(String s) {
+        return s == null ? Strings.EMPTY : s;
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/65973561/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 33cf725..f4a0077 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -123,6 +123,9 @@
       <action issue="LOG4J2-918" dev="rpopma" type="fix">
         Clarify documentation for combining async with sync loggers.
       </action>
+      <action issue="LOG4J2-1078" dev="ggregory" type="fix" due-to="Mikael Ståldal">
+        GelfLayout throws exception if some log event fields are null.
+      </action>
       <action issue="LOG4J2-1044" dev="rgoers" type="update">
         Support batchSize in FlumeAvroManager.
       </action>