From 85f10068969177e9fdf9fc09c985c406663b2a4c Mon Sep 17 00:00:00 2001 From: Dumitru Postoronca Date: Wed, 7 May 2014 17:33:48 +0200 Subject: [PATCH] Adding extension point allowing subclasses to add more data to the json log --- .../net/logstash/log4j/JSONEventLayoutV1.java | 14 ++++++ .../logstash/log4j/JSONEventLayoutV1Test.java | 49 ++++++++++++++----- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/logstash/log4j/JSONEventLayoutV1.java b/src/main/java/net/logstash/log4j/JSONEventLayoutV1.java index aaf3228..4b73472 100644 --- a/src/main/java/net/logstash/log4j/JSONEventLayoutV1.java +++ b/src/main/java/net/logstash/log4j/JSONEventLayoutV1.java @@ -77,6 +77,15 @@ public String format(LoggingEvent loggingEvent) { logstashEvent.put("@version", version); logstashEvent.put("@timestamp", dateFormat(timestamp)); + // allow sub-classes to add extra-data to log + Map extraFields = getExtraFields(); + if (extraFields != null) { + for (Object entryObj : extraFields.entrySet()) { + Map.Entry entry = (Map.Entry) entryObj; + addEventData(entry.getKey().toString(), entry.getValue() != null ? entry.getValue().toString() : "null"); + } + } + /** * Extract and add fields from log4j config, if defined */ @@ -166,6 +175,11 @@ public void activateOptions() { activeIgnoreThrowable = ignoreThrowable; } + /** Extension point allowing subclasses to add more data to the json log */ + protected Map getExtraFields() { + return null; + } + private void addUserFields(String data) { if (null != data) { String[] pairs = data.split(","); diff --git a/src/test/java/net/logstash/log4j/JSONEventLayoutV1Test.java b/src/test/java/net/logstash/log4j/JSONEventLayoutV1Test.java index c688c29..062a9f9 100644 --- a/src/test/java/net/logstash/log4j/JSONEventLayoutV1Test.java +++ b/src/test/java/net/logstash/log4j/JSONEventLayoutV1Test.java @@ -1,26 +1,21 @@ package net.logstash.log4j; +import java.util.HashMap; +import java.util.Map; + import junit.framework.Assert; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; -import org.apache.log4j.Layout; + import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.NDC; import org.junit.After; import org.junit.Before; -import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; -/** - * Created with IntelliJ IDEA. - * User: jvincent - * Date: 12/5/12 - * Time: 12:07 AM - * To change this template use File | Settings | File Templates. - */ public class JSONEventLayoutV1Test { static Logger logger; static MockAppenderV1 appender; @@ -37,13 +32,14 @@ public class JSONEventLayoutV1Test { "@version" }; - @BeforeClass - public static void setupTestAppender() { + @Before + public void init() { appender = new MockAppenderV1(new JSONEventLayoutV1()); - logger = Logger.getRootLogger(); appender.setThreshold(Level.TRACE); appender.setName("mockappenderv1"); appender.activateOptions(); + logger = Logger.getRootLogger(); + logger.removeAllAppenders(); logger.addAppender(appender); } @@ -133,6 +129,25 @@ public void testJSONEventLayoutUserFieldsPropOverride() { } + @Test + public void testJSONEventLayoutExtraFields() { + MockAppenderV1 mockAppenderWithExtra = new MockAppenderV1(new JSONEventLayoutV1WithExtraField()); + Logger loggerWithExtra = Logger.getRootLogger(); + mockAppenderWithExtra.setThreshold(Level.TRACE); + mockAppenderWithExtra.setName("mockappenderv1-with-extra"); + mockAppenderWithExtra.activateOptions(); + loggerWithExtra.removeAllAppenders(); + loggerWithExtra.addAppender(mockAppenderWithExtra); + + loggerWithExtra.info("this is an info message with user fields"); + String message = mockAppenderWithExtra.getMessages()[0]; + Assert.assertTrue("Event is not valid JSON", JSONValue.isValidJsonStrict(message)); + Object obj = JSONValue.parse(message); + JSONObject jsonObject = (JSONObject) obj; + Assert.assertTrue("Event does not contain field 'extra-field'" , jsonObject.containsKey("extra-field")); + Assert.assertEquals("Event does not contain value 'extra-value'", "extra-value", jsonObject.get("extra-field")); + } + @Test public void testJSONEventLayoutHasKeys() { logger.info("this is a test message"); @@ -263,4 +278,14 @@ public void testDateFormat() { long timestamp = 1364844991207L; Assert.assertEquals("format does not produce expected output", "2013-04-01T19:36:31.207Z", JSONEventLayoutV1.dateFormat(timestamp)); } + + private static class JSONEventLayoutV1WithExtraField extends JSONEventLayoutV1 { + + @Override + protected Map getExtraFields() { + Map extra = new HashMap(1); + extra.put("extra-field", "extra-value"); + return extra; + } + } }