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