diff --git a/README.md b/README.md
index 5c24d66..a867d18 100644
--- a/README.md
+++ b/README.md
@@ -81,8 +81,11 @@ default values:
requestId:_request_id
true
_request_id:long
-
- _facility:GELF
+
+
+ _facility
+ GELF
+
@@ -92,6 +95,7 @@ default values:
```
+
## GelfLayout
`me.moocar.logbackgelf.GelfLayout`
@@ -126,9 +130,10 @@ actually converts a log event into a GELF compatible JSON string.
* **additionalFields**: See additional fields below. Default: empty
* **fieldType**: See field type conversion below. Default: empty
(fields sent as string)
-* **staticAdditionalFields**: See static additional fields below.
- Note, now that facility is deprecated, use this to set a facility
- Default: empty
+* **staticFields**: See static fields below. Note, now that facility
+ is deprecated, use this to set a facility Default: empty
+* **staticAdditionalFields**: _deprecated_. Use staticFields. Default:
+ empty
* **includeFullMDC**: See additional fields below. Default: `false`
## Transports
@@ -247,24 +252,37 @@ If the property `includeFullMDC` is set to false (default value) then
only the keys listed as `additionalField` will be added to a gelf
message.
-### Static Additional Fields
+### Static Fields
Use static additional fields when you want to add a static key value
pair to every GELF message. Key is the additional field key (and
should thus begin with an underscore). The value is a static string.
Now that the GELF `facility` is deprecated, this is how you add a
-static facility.
+static facility. StaticFields replace staticAdditionalFields
E.g in the appender configuration:
```xml
- _node_name:www013
- _facility:GELF
+
+ _facility
+ GELF
+
+
+ _node_name
+ www013
+
```
+### Static Additional Fields (deprecated)
+
+Static Additional fields have been deprecated and superceded by
+staticFields. While they offered a more concise way of expressing the
+key/value pair, it was impossible to include a colon in the value.
+staticFields are fully structured and don't have this problem.
+
### Field type conversion
You can configure a specific field to be converted to a numeric type.
diff --git a/sample.logback.xml b/sample.logback.xml
index 988eafa..d80316c 100644
--- a/sample.logback.xml
+++ b/sample.logback.xml
@@ -21,8 +21,11 @@
requestId:_request_id
true
_request_id:long
-
- _facility:GELF
+
+
+ _facility
+ GELF
+
diff --git a/src/main/java/me/moocar/logbackgelf/Field.java b/src/main/java/me/moocar/logbackgelf/Field.java
new file mode 100644
index 0000000..559e002
--- /dev/null
+++ b/src/main/java/me/moocar/logbackgelf/Field.java
@@ -0,0 +1,23 @@
+package me.moocar.logbackgelf;
+
+public class Field {
+
+ private String key;
+ private String value;
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
diff --git a/src/main/java/me/moocar/logbackgelf/GelfLayout.java b/src/main/java/me/moocar/logbackgelf/GelfLayout.java
index 5b015d6..f4aac39 100644
--- a/src/main/java/me/moocar/logbackgelf/GelfLayout.java
+++ b/src/main/java/me/moocar/logbackgelf/GelfLayout.java
@@ -1,25 +1,23 @@
package me.moocar.logbackgelf;
-import java.lang.reflect.Method;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.nio.charset.Charset;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.classic.util.LevelToSyslogSeverity;
-
import ch.qos.logback.core.Layout;
import ch.qos.logback.core.LayoutBase;
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import java.lang.reflect.Method;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
/**
* Responsible for formatting a log event into a GELF JSON string
*/
@@ -33,7 +31,7 @@ public class GelfLayout extends LayoutBase {
private boolean useMarker = false;
private Map additionalFields = new HashMap();
private Map fieldTypes = new HashMap();
- private Map staticAdditionalFields = new HashMap();
+ private Map staticFields = new HashMap();
private String host = getLocalHostName();
private final Gson gson;
private Layout fullMessageLayout;
@@ -198,8 +196,8 @@ private boolean eventHasMarker(ILoggingEvent eventObject) {
private void staticAdditionalFields(Map map) {
- for (String key : staticAdditionalFields.keySet()) {
- map.put(key, (staticAdditionalFields.get(key)));
+ for (String key : staticFields.keySet()) {
+ map.put(key, (staticFields.get(key)));
}
}
@@ -268,12 +266,12 @@ public void setAdditionalFields(Map additionalFields) {
* static additional fields to add to every gelf message. Key is the additional field key (and should thus begin
* with an underscore). The value is a static string.
*/
- public Map getStaticAdditionalFields() {
- return staticAdditionalFields;
+ public Map getStaticFields() {
+ return staticFields;
}
- public void setStaticAdditionalFields(Map staticAdditionalFields) {
- this.staticAdditionalFields = staticAdditionalFields;
+ public void setStaticFields(Map staticFields) {
+ this.staticFields = staticFields;
}
/**
@@ -337,6 +335,8 @@ public void addAdditionalField(String keyValue) {
*
* @param keyValue This must be in format key:value where key is the additional field key, and value is a static
* string. e.g "_node_name:www013"
+ *
+ * @deprecated Use addStaticField instead
*/
public void addStaticAdditionalField(String keyValue) {
String[] splitted = keyValue.split(":");
@@ -348,7 +348,15 @@ public void addStaticAdditionalField(String keyValue) {
"e.g. _node_name:www013");
}
- staticAdditionalFields.put(splitted[0], splitted[1]);
+ staticFields.put(splitted[0], splitted[1]);
+ }
+
+ /**
+ * Add a static field. A static field is a key/value pair that should be sent in each Gelf message. This supercedes
+ * static additional fields, which can't have colon characters in their value.
+ */
+ public void addStaticField(Field entry) {
+ staticFields.put(entry.getKey(), entry.getValue());
}
public void addFieldType(String keyValue) {
diff --git a/src/test/clojure/me/moocar/logbackgelf/end_to_end_test.clj b/src/test/clojure/me/moocar/logbackgelf/end_to_end_test.clj
index abd54fb..fc6824c 100644
--- a/src/test/clojure/me/moocar/logbackgelf/end_to_end_test.clj
+++ b/src/test/clojure/me/moocar/logbackgelf/end_to_end_test.clj
@@ -62,8 +62,12 @@
[:additionalField "ipAddress:_ip_address"]
[:additionalField "requestId:_request_id"]
[:includeFullMDC (:include-full-mdc? config)]]
- (map #(vector :staticAdditionalField (string/join ":" %))
- (:static-additional-fields config))
+ (for [field (:static-additional-fields config)]
+ [:staticAdditionalField (string/join ":" field)])
+ (for [field (:static-fields config)]
+ [:staticField {:class "me.moocar.logbackgelf.Field"}
+ [:key (key field)]
+ [:value (val field)]])
(map #(vector :fieldType (string/join ":" %))
(:field-types config))))]]
[:root {:level "all"}
@@ -236,6 +240,17 @@
(let [json (wait msg-ch)]
(is (= "www013" (:_node_name json)))))))
+(defn t-static-fields
+ [{:keys [config server] :as system}]
+ (let [msg-ch (:msg-ch server)
+ config (assoc config :static-fields {"foo" "bar"
+ "moo" "car"})]
+ (with-logger [logger config]
+ (.debug logger "my msg")
+ (let [json (wait msg-ch)]
+ (is (= "bar" (:foo json)))
+ (is (= "car" (:moo json)))))))
+
(defn t-undefined-hostname-string
"Ensure that when a bad remote host is included, that an
appropariate error is reported to the user. Note that I can't think
@@ -270,6 +285,7 @@
(t-substitute system)
(t-exception system)
(t-static-additional-field system)
+ (t-static-fields system)
(t-undefined-hostname-string system)
(is (= true (:result (tc/quick-check 100 (t-field-types system)))))
(is (= true (:result (tc/quick-check 100 (t-test system)))))))