Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding extension point allowing subclasses to add more data to the json log #41

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions src/main/java/net/logstash/log4j/JSONEventLayoutV1.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand Down Expand Up @@ -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(",");
Expand Down
49 changes: 37 additions & 12 deletions src/test/java/net/logstash/log4j/JSONEventLayoutV1Test.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
}

Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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;
}
}
}