You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by vy...@apache.org on 2020/12/29 21:38:47 UTC
[logging-log4j2] 01/01: LOG4J2-2985 Add eventTemplateRootObjectKey
parameter to JsonTemplateLayout.
This is an automated email from the ASF dual-hosted git repository.
vy pushed a commit to branch LOG4J2-2985
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit dc3bf494ac19d5d2cbfb178e5f0d96f7f0777a7c
Author: Volkan Yazici <vo...@gmail.com>
AuthorDate: Tue Dec 29 22:38:34 2020 +0100
LOG4J2-2985 Add eventTemplateRootObjectKey parameter to JsonTemplateLayout.
---
.../layout/template/json/JsonTemplateLayout.java | 14 ++++++++++
.../template/json/JsonTemplateLayoutDefaults.java | 5 ++++
.../json/resolver/EventResolverContext.java | 14 ++++++++++
.../template/json/resolver/TemplateResolvers.java | 13 ++++++++--
.../template/json/JsonTemplateLayoutTest.java | 30 ++++++++++++++++++++++
.../asciidoc/manual/json-template-layout.adoc.vm | 7 +++++
6 files changed, 81 insertions(+), 2 deletions(-)
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
index ebc5a80..1f0506d 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayout.java
@@ -154,6 +154,7 @@ public class JsonTemplateLayout implements StringLayout {
.setLocationInfoEnabled(builder.locationInfoEnabled)
.setStackTraceEnabled(builder.stackTraceEnabled)
.setStackTraceElementObjectResolver(stackTraceElementObjectResolver)
+ .setEventTemplateRootObjectKey(builder.eventTemplateRootObjectKey)
.setEventTemplateAdditionalFields(eventTemplateAdditionalFields)
.build();
return TemplateResolvers.ofTemplate(resolverContext, eventTemplate);
@@ -319,6 +320,10 @@ public class JsonTemplateLayout implements StringLayout {
private String eventTemplateUri =
JsonTemplateLayoutDefaults.getEventTemplateUri();
+ @PluginBuilderAttribute
+ private String eventTemplateRootObjectKey =
+ JsonTemplateLayoutDefaults.getEventTemplateRootObjectKey();
+
@PluginElement("EventTemplateAdditionalField")
private EventTemplateAdditionalField[] eventTemplateAdditionalFields;
@@ -406,6 +411,15 @@ public class JsonTemplateLayout implements StringLayout {
return this;
}
+ public String getEventTemplateRootObjectKey() {
+ return eventTemplateRootObjectKey;
+ }
+
+ public Builder setEventTemplateRootObjectKey(String eventTemplateRootObjectKey) {
+ this.eventTemplateRootObjectKey = eventTemplateRootObjectKey;
+ return this;
+ }
+
public EventTemplateAdditionalField[] getEventTemplateAdditionalFields() {
return eventTemplateAdditionalFields;
}
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
index 5cf1e97..bcfdeea 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
@@ -91,6 +91,11 @@ public final class JsonTemplateLayoutDefaults {
"classpath:EcsLayout.json");
}
+ public static String getEventTemplateRootObjectKey() {
+ return PROPERTIES.getStringProperty(
+ "log4j.layout.jsonTemplate.eventTemplateRootObjectKey");
+ }
+
public static String getStackTraceElementTemplate() {
return PROPERTIES.getStringProperty(
"log4j.layout.jsonTemplate.stackTraceElementTemplate");
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java
index b1dd8af..8f7107b 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/EventResolverContext.java
@@ -47,6 +47,8 @@ public final class EventResolverContext implements TemplateResolverContext<LogEv
private final TemplateResolver<Throwable> stackTraceObjectResolver;
+ private final String eventTemplateRootObjectKey;
+
private final EventTemplateAdditionalField[] additionalFields;
private EventResolverContext(final Builder builder) {
@@ -61,6 +63,7 @@ public final class EventResolverContext implements TemplateResolverContext<LogEv
this.stackTraceObjectResolver = stackTraceEnabled
? new StackTraceObjectResolver(builder.stackTraceElementObjectResolver)
: null;
+ this.eventTemplateRootObjectKey = builder.eventTemplateRootObjectKey;
this.additionalFields = builder.eventTemplateAdditionalFields;
}
@@ -112,6 +115,10 @@ public final class EventResolverContext implements TemplateResolverContext<LogEv
return stackTraceObjectResolver;
}
+ String getEventTemplateRootObjectKey() {
+ return eventTemplateRootObjectKey;
+ }
+
EventTemplateAdditionalField[] getAdditionalFields() {
return additionalFields;
}
@@ -140,6 +147,8 @@ public final class EventResolverContext implements TemplateResolverContext<LogEv
private TemplateResolver<StackTraceElement> stackTraceElementObjectResolver;
+ private String eventTemplateRootObjectKey;
+
private EventTemplateAdditionalField[] eventTemplateAdditionalFields;
private Builder() {
@@ -192,6 +201,11 @@ public final class EventResolverContext implements TemplateResolverContext<LogEv
return this;
}
+ public Builder setEventTemplateRootObjectKey(String eventTemplateRootObjectKey) {
+ this.eventTemplateRootObjectKey = eventTemplateRootObjectKey;
+ return this;
+ }
+
public Builder setEventTemplateAdditionalFields(
final EventTemplateAdditionalField[] eventTemplateAdditionalFields) {
this.eventTemplateAdditionalFields = eventTemplateAdditionalFields;
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolvers.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolvers.java
index ab4dfa4..737ed87 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolvers.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/TemplateResolvers.java
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.layout.template.json.util.JsonReader;
import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -78,7 +79,7 @@ public final class TemplateResolvers {
final String template) {
// Read the template.
- final Object node;
+ Object node;
try {
node = JsonReader.read(template);
} catch (final Exception error) {
@@ -86,11 +87,19 @@ public final class TemplateResolvers {
throw new RuntimeException(message, error);
}
- // Append the additional fields.
if (context instanceof EventResolverContext) {
+
+ // Append the additional fields.
final EventResolverContext eventResolverContext = (EventResolverContext) context;
final EventTemplateAdditionalField[] additionalFields = eventResolverContext.getAdditionalFields();
appendAdditionalFields(node, additionalFields);
+
+ // Set the root object key, if given.
+ final String rootObjectKey = eventResolverContext.getEventTemplateRootObjectKey();
+ if (rootObjectKey != null) {
+ node = Collections.singletonMap(rootObjectKey, node);
+ }
+
}
// Resolve the template.
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
index 49ef8ca..b184ca8 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
@@ -2115,6 +2115,36 @@ class JsonTemplateLayoutTest {
}
+ @Test
+ void test_eventTemplateRootObjectKey() {
+
+ // Create the event template.
+ final String eventTemplate = writeJson(asMap(
+ "message", asMap("$resolver", "message")));
+
+ // Create the layout.
+ final JsonTemplateLayout layout = JsonTemplateLayout
+ .newBuilder()
+ .setConfiguration(CONFIGURATION)
+ .setEventTemplate(eventTemplate)
+ .setEventTemplateRootObjectKey("event")
+ .build();
+
+ // Create the log event.
+ final Message message = new SimpleMessage("LOG4J2-2985");
+ final LogEvent logEvent = Log4jLogEvent
+ .newBuilder()
+ .setLoggerName(LOGGER_NAME)
+ .setMessage(message)
+ .build();
+
+ // Check the serialized event.
+ usingSerializedLogEventAccessor(layout, logEvent, accessor ->
+ assertThat(accessor.getObject(new String[]{"event", "message"}))
+ .isEqualTo("LOG4J2-2985"));
+
+ }
+
private static synchronized String writeJson(final Object value) {
final StringBuilder stringBuilder = JSON_WRITER.getStringBuilder();
stringBuilder.setLength(0);
diff --git a/src/site/asciidoc/manual/json-template-layout.adoc.vm b/src/site/asciidoc/manual/json-template-layout.adoc.vm
index 488d2c6..6003ffe 100644
--- a/src/site/asciidoc/manual/json-template-layout.adoc.vm
+++ b/src/site/asciidoc/manual/json-template-layout.adoc.vm
@@ -186,6 +186,13 @@ appender.console.json.eventTemplateUri = classpath:LogstashJsonEventLayoutV1.jso
`classpath:EcsLayout.json` set by `log4j.layout.jsonTemplate.eventTemplateUri`
property)
+| eventTemplateRootObjectKey
+| String
+| if given, puts the event template into a JSON object composed of a single
+ member with the given key (defaults to `null` set by
+ `log4j.layout.jsonTemplate.eventTemplateRootObjectKey`
+ property)
+
| eventTemplateAdditionalFields
| EventTemplateAdditionalField[]
| additional key-value pairs appended to the root of the event template