Skip to content
This repository has been archived by the owner on Jun 29, 2023. It is now read-only.

Commit

Permalink
Allow data type specification for MDC/additional fields #59
Browse files Browse the repository at this point in the history
  • Loading branch information
mp911de committed Jan 5, 2016
1 parent 5c64bdb commit b7ce993
Show file tree
Hide file tree
Showing 30 changed files with 580 additions and 188 deletions.
14 changes: 13 additions & 1 deletion README.md
Expand Up @@ -66,6 +66,8 @@ biz.paluch.logging.gelf.jul.GelfLogHandler.maximumMessageSize=8192

# This are static fields
biz.paluch.logging.gelf.jul.GelfLogHandler.additionalFields=fieldName1=fieldValue1,fieldName2=fieldValue2
# Optional: Specify field types
biz.paluch.logging.gelf.jul.GelfLogHandler.additionalFieldTypes=fieldName1=String,fieldName2=Double,fieldName3=Long
biz.paluch.logging.gelf.jul.GelfLogHandler.level=INFO
```

Expand All @@ -91,6 +93,8 @@ log4j.appender.gelf.MaximumMessageSize=8192

# This are static fields
log4j.appender.gelf.AdditionalFields=fieldName1=fieldValue1,fieldName2=fieldValue2
# Optional: Specify field types
log4j.appender.gelf.AdditionalFieldTypes=fieldName1=String,fieldName2=Double,fieldName3=Long

# This are fields using MDC
log4j.appender.gelf.MdcFields=mdcField1,mdcField2
Expand All @@ -116,6 +120,8 @@ log4j.appender.gelf.IncludeFullMdc=true

<!-- This are static fields -->
<param name="AdditionalFields" value="fieldName1=fieldValue1,fieldName2=fieldValue2" />
<!-- Optional: Specify field types -->
<param name="AdditionalFieldTypes" value="fieldName1=String,fieldName2=Double,fieldName3=Long" />

<!-- This are fields using MDC -->
<param name="MdcFields" value="mdcField1,mdcField2" />
Expand Down Expand Up @@ -186,7 +192,7 @@ host{["fqdn"<br/>"simple"<br/>"address"]} | Outputs either the FQDN hostname, th
<Appenders>
<Gelf name="gelf" host="udp:localhost" port="12201" version="1.1" extractStackTrace="true"
filterStackTrace="true" mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192"
originHost="%host{fqdn}">
originHost="%host{fqdn}" additionalFieldTypes="fieldName1=String,fieldName2=Double,fieldName3=Long">
<Field name="timestamp" pattern="%d{dd MMM yyyy HH:mm:ss,SSS}" />
<Field name="level" pattern="%level" />
<Field name="simpleClassName" pattern="%C{1}" />
Expand Down Expand Up @@ -234,6 +240,8 @@ You need to include the library as module (see download above), then add followi

<!-- This are static fields -->
<property name="additionalFields" value="fieldName1=fieldValue1,fieldName2=fieldValue2" />
<!-- Optional: Specify field types -->
<property name="additionalFieldTypes" value="fieldName1=String,fieldName2=Double,fieldName3=Long" />

<!-- This are fields using MDC -->
<property name="mdcFields" value="mdcField1,mdcField2" />
Expand Down Expand Up @@ -276,6 +284,8 @@ standalone.xml

<!-- This are static fields -->
<property name="additionalFields" value="fieldName1=fieldValue1,fieldName2=fieldValue2" />
<!-- Optional: Specify field types -->
<property name="additionalFieldTypes" value="fieldName1=String,fieldName2=Double,fieldName3=Long" />

<!-- This are fields using MDC -->
<property name="mdcFields" value="mdcField1,mdcField2" />
Expand Down Expand Up @@ -321,6 +331,8 @@ logback.xml Example:

<!-- This are static fields -->
<additionalFields>fieldName1=fieldValue1,fieldName2=fieldValue2</additionalFields>
<!-- Optional: Specify field types -->
<additionalFieldTypes>fieldName1=String,fieldName2=Double,fieldName3=Long</additionalFieldTypes>

<!-- This are fields using MDC -->
<mdcFields>mdcField1,mdcField2</mdcFields>
Expand Down
30 changes: 26 additions & 4 deletions src/main/java/biz/paluch/logging/gelf/GelfMessageAssembler.java
Expand Up @@ -5,10 +5,7 @@
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.*;

import biz.paluch.logging.RuntimeContainer;
import biz.paluch.logging.StackTraceFilter;
Expand Down Expand Up @@ -41,6 +38,7 @@ public class GelfMessageAssembler implements HostAndPortProvider {
private int maximumMessageSize = 8192;

private List<MessageField> fields = new ArrayList<MessageField>();
private Map<String, String> additionalFieldTypes = new HashMap<String, String>();

private String timestampPattern = "yyyy-MM-dd HH:mm:ss,SSSS";

Expand Down Expand Up @@ -69,6 +67,7 @@ public void initialize(PropertyProvider propertyProvider) {
filterStackTrace = "true".equalsIgnoreCase(propertyProvider.getProperty(PropertyProvider.PROPERTY_FILTER_STACK_TRACE));

setupStaticFields(propertyProvider);
setupAdditionalFieldTypes(propertyProvider);
facility = propertyProvider.getProperty(PropertyProvider.PROPERTY_FACILITY);
String version = propertyProvider.getProperty(PropertyProvider.PROPERTY_VERSION);

Expand Down Expand Up @@ -101,6 +100,7 @@ public GelfMessage createGelfMessage(LogEvent logEvent) {
builder.withShortMessage(shortMessage).withFullMessage(message).withJavaTimestamp(logEvent.getLogTimestamp());
builder.withLevel(logEvent.getSyslogLevel());
builder.withVersion(getVersion());
builder.withAdditionalFieldTypes(additionalFieldTypes);

for (MessageField field : fields) {
Values values = getValues(logEvent, field);
Expand Down Expand Up @@ -193,7 +193,29 @@ private void setupStaticFields(PropertyProvider propertyProvider) {

fieldNumber++;
}
}

private void setupAdditionalFieldTypes(PropertyProvider propertyProvider) {
int fieldNumber = 0;
while (true) {
final String property = propertyProvider.getProperty(PropertyProvider.PROPERTY_ADDITIONAL_FIELD_TYPE + fieldNumber);
if (null == property) {
break;
}
final int index = property.indexOf('=');
if (-1 != index) {

String field = property.substring(0, index);
String type = property.substring(index + 1);
setAdditionalFieldType(field, type);
}

fieldNumber++;
}
}

public void setAdditionalFieldType(String field, String type) {
additionalFieldTypes.put(field, type);
}

public void addField(MessageField field) {
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/biz/paluch/logging/gelf/GelfMessageBuilder.java
Expand Up @@ -22,6 +22,7 @@ public class GelfMessageBuilder {
private String facility = GelfMessage.DEFAULT_FACILITY;
private Map<String, String> additonalFields = new HashMap<String, String>();
private int maximumMessageSize = GelfMessage.DEFAULT_MESSAGE_SIZE;
private Map<String, String> additionalFieldTypes = new HashMap<String, String>();

private GelfMessageBuilder() {

Expand Down Expand Up @@ -147,6 +148,17 @@ public GelfMessageBuilder withField(String key, String value) {
return this;
}

/**
* Set additional field types
*
* @param additionalFieldTypes the type map
* @return GelfMessageBuilder
*/
public GelfMessageBuilder withAdditionalFieldTypes(Map<String, String> additionalFieldTypes) {
this.additionalFieldTypes.putAll(additionalFieldTypes);
return this;
}

/**
* Build a new Gelf message based on the builder settings.
*
Expand All @@ -162,6 +174,7 @@ public GelfMessage build() {
gelfMessage.setJavaTimestamp(javaTimestamp);
gelfMessage.setFacility(facility);
gelfMessage.setFacility(facility);
gelfMessage.setAdditionalFieldTypes(additionalFieldTypes);

return gelfMessage;
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/biz/paluch/logging/gelf/PropertyProvider.java
Expand Up @@ -29,7 +29,9 @@ public interface PropertyProvider {
String PROPERTY_FACILITY = "facility";
String PROPERTY_MAX_MESSAGE_SIZE = "maximumMessageSize";
String PROPERTY_ADDITIONAL_FIELD = "additionalField.";
String PROPERTY_ADDITIONAL_FIELD_TYPE = "additionalFieldType.";
String PROPERTY_ADDITIONAL_FIELDS = "additionalFields";
String PROPERTY_ADDITIONAL_FIELD_TYPES = "additionalFieldTypes";

String PROPERTY_FILTER = "filter";
String PROPERTY_LEVEL = "level";
Expand Down
@@ -0,0 +1,90 @@
package biz.paluch.logging.gelf.intern;

import biz.paluch.logging.gelf.DynamicMdcMessageField;
import biz.paluch.logging.gelf.GelfMessageAssembler;
import biz.paluch.logging.gelf.MdcMessageField;
import biz.paluch.logging.gelf.StaticMessageField;

/**
* @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
*/
public class ConfigurationSupport {
public static final String MULTI_VALUE_DELIMITTER = ",";
public static final char EQ = '=';

private ConfigurationSupport() {

}

/**
* Set the additional (static) fields.
*
* @param spec field=value,field1=value1, ...
* @param gelfMessageAssembler the Gelf message assembler to apply the configuration
*/
public static void setAdditionalFields(String spec, GelfMessageAssembler gelfMessageAssembler) {
if (null != spec) {
String[] properties = spec.split(MULTI_VALUE_DELIMITTER);

for (String field : properties) {
final int index = field.indexOf(EQ);
if (-1 == index) {
continue;
}
gelfMessageAssembler.addField(new StaticMessageField(field.substring(0, index), field.substring(index + 1)));
}
}
}

/**
* Set the MDC fields.
*
* @param spec field, field2, field3
* @param gelfMessageAssembler the Gelf message assembler to apply the configuration
*/
public static void setMdcFields(String spec, GelfMessageAssembler gelfMessageAssembler) {
if (null != spec) {
String[] fields = spec.split(MULTI_VALUE_DELIMITTER);

for (String field : fields) {
gelfMessageAssembler.addField(new MdcMessageField(field.trim(), field.trim()));
}
}
}

/**
* Set the dynamic MDC fields.
*
* @param spec field, .*FieldSuffix, fieldPrefix.*
* @param gelfMessageAssembler
*/
public static void setDynamicMdcFields(String spec, GelfMessageAssembler gelfMessageAssembler) {
if (null != spec) {
String[] fields = spec.split(MULTI_VALUE_DELIMITTER);

for (String field : fields) {
gelfMessageAssembler.addField(new DynamicMdcMessageField(field.trim()));
}
}
}

/**
* Set the additional field types.
*
* @param spec field=String,field1=Double, ... See {@link GelfMessage} for supported types.
* @param gelfMessageAssembler the Gelf message assembler to apply the configuration
*/
public static void setAdditionalFieldTypes(String spec, GelfMessageAssembler gelfMessageAssembler) {
if (null != spec) {
String[] properties = spec.split(MULTI_VALUE_DELIMITTER);

for (String field : properties) {
final int index = field.indexOf(EQ);
if (-1 != index) {
gelfMessageAssembler.setAdditionalFieldType(field.substring(0, index), field.substring(index + 1));
}
}
}
}

}

0 comments on commit b7ce993

Please sign in to comment.