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 2023/03/21 21:39:39 UTC

[logging-log4j2] branch 2.x updated: Improvements on the recently added marker parent support to `MarkerResolver` (#1381)

This is an automated email from the ASF dual-hosted git repository.

vy pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


The following commit(s) were added to refs/heads/2.x by this push:
     new 83a6710122 Improvements on the recently added marker parent support to `MarkerResolver` (#1381)
83a6710122 is described below

commit 83a671012216855ffe671bbaf9721d4a58feecb4
Author: Volkan Yazıcı <vo...@yazi.ci>
AuthorDate: Tue Mar 21 22:37:00 2023 +0100

    Improvements on the recently added marker parent support to `MarkerResolver` (#1381)
---
 .../template/json/resolver/MarkerResolverTest.java | 133 ++++++++++-----------
 .../template/json/resolver/MarkerResolver.java     |  16 +--
 ... => 1381_support_parents_in_MarkerResolver.xml} |  11 +-
 .../asciidoc/manual/json-template-layout.adoc.vm   |  54 +++++++++
 4 files changed, 130 insertions(+), 84 deletions(-)

diff --git a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolverTest.java b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolverTest.java
index 5cbfa6b085..8eeb6f7f4a 100644
--- a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolverTest.java
+++ b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolverTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.logging.log4j.layout.template.json.resolver;
 
-import java.util.Arrays;
-
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.MarkerManager;
 import org.apache.logging.log4j.core.LogEvent;
@@ -30,74 +28,67 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 class MarkerResolverTest {
 
-  @Test
-  void should_have_a_marker_name() {
-    final String eventTemplate = writeJson(asMap(
-      "marker",
-      asMap(
-        "$resolver", "marker",
-        "field", "name"
-      )
-    ));
-
-    // Create the layout.
-    final JsonTemplateLayout layout = JsonTemplateLayout
-            .newBuilder()
-            .setConfiguration(CONFIGURATION)
-            .setEventTemplate(eventTemplate)
-            .build();
-
-    // Create the log event.
-    final Marker marker = MarkerManager.getMarker("MARKER");
-    final LogEvent logEvent = Log4jLogEvent
-            .newBuilder()
-            .setMarker(marker)
-            .build();
-
-    // Check the serialized event.
-    usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
-      assertThat(accessor.getString("marker")).isEqualTo("MARKER");
-    });
-  }
-
-  @Test
-  void should_list_parents_as_array() {
-    final String eventTemplate = writeJson(asMap(
-      "parents",
-      asMap(
-        "$resolver", "marker",
-        "field", "parents"
-      )
-    ));
-
-    // Create the layout.
-    final JsonTemplateLayout layout = JsonTemplateLayout
-            .newBuilder()
-            .setConfiguration(CONFIGURATION)
-            .setEventTemplate(eventTemplate)
-            .build();
-
-      // Create the log event.
-    final Marker PARENT_MARKER_1 = MarkerManager.getMarker("PARENT_MARKER_NAME_1");
-    final Marker PARENT_MARKER_2 = MarkerManager.getMarker("PARENT_MARKER_NAME_2");
-    final Marker CHILD_MARKER = MarkerManager.getMarker("CHILD_MARKER_NAME");
-    CHILD_MARKER.setParents(PARENT_MARKER_1, PARENT_MARKER_2);
-
-    final LogEvent logEvent = Log4jLogEvent
-            .newBuilder()
-            .setMarker(CHILD_MARKER)
-            .build();
-
-    // Check the serialized event.
-    usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
-      assertThat(accessor.getList("parents", String.class)).hasSize(2);
-      assertThat(accessor.getList("parents", String.class)).containsAll(
-        Arrays.asList(
-          "PARENT_MARKER_NAME_1",
-          "PARENT_MARKER_NAME_2"
-        )
-      );
-    });
-  }
+    @Test
+    void should_have_a_marker_name() {
+
+        // Create the event template
+        final String eventTemplate = writeJson(asMap(
+                "marker", asMap(
+                        "$resolver", "marker",
+                        "field", "name")));
+
+        // Create the layout.
+        final JsonTemplateLayout layout = JsonTemplateLayout
+                .newBuilder()
+                .setConfiguration(CONFIGURATION)
+                .setEventTemplate(eventTemplate)
+                .build();
+
+        // Create the log event.
+        final Marker marker = MarkerManager.getMarker("MARKER");
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMarker(marker)
+                .build();
+
+        // Check the serialized event.
+        usingSerializedLogEventAccessor(layout, logEvent, accessor ->
+                assertThat(accessor.getString("marker")).isEqualTo("MARKER"));
+
+    }
+
+    @Test
+    void should_list_parents_as_array() {
+
+        // Create the event template
+        final String eventTemplate = writeJson(asMap(
+                "parents", asMap(
+                        "$resolver", "marker",
+                        "field", "parents")));
+
+        // Create the layout.
+        final JsonTemplateLayout layout = JsonTemplateLayout
+                .newBuilder()
+                .setConfiguration(CONFIGURATION)
+                .setEventTemplate(eventTemplate)
+                .build();
+
+        // Create the log event.
+        final Marker parentMarker1 = MarkerManager.getMarker("PARENT_MARKER_NAME_1");
+        final Marker parentMarker2 = MarkerManager.getMarker("PARENT_MARKER_NAME_2");
+        final Marker childMarker = MarkerManager.getMarker("CHILD_MARKER_NAME");
+        childMarker.setParents(parentMarker1, parentMarker2);
+
+        final LogEvent logEvent = Log4jLogEvent
+                .newBuilder()
+                .setMarker(childMarker)
+                .build();
+
+        // Check the serialized event.
+        usingSerializedLogEventAccessor(layout, logEvent, accessor ->
+                assertThat(accessor.getList("parents", String.class))
+                        .containsOnly(parentMarker1.getName(), parentMarker2.getName()));
+
+    }
 
 }
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolver.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolver.java
index 5875fc460b..4975fd2a15 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolver.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolver.java
@@ -26,8 +26,7 @@ import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
  * <h3>Configuration</h3>
  *
  * <pre>
- * config = "field" -> "name"
- * config = "field" -> "parents"
+ * config = "field" -> ( "name" | "parents" )
  * </pre>
  *
  * <h3>Examples</h3>
@@ -41,7 +40,7 @@ import org.apache.logging.log4j.layout.template.json.util.JsonWriter;
  * }
  * </pre>
  *
- * Resolve the marker's parents names:
+ * Resolve the names of the marker's parents:
  *
  * <pre>
  * {
@@ -64,23 +63,26 @@ public final class MarkerResolver implements EventResolver {
 
     private static final TemplateResolver<LogEvent> PARENTS_RESOLVER =
             (final LogEvent logEvent, final JsonWriter jsonWriter) -> {
+
+                // Short-circuit if there are no parents
                 final Marker marker = logEvent.getMarker();
                 if (marker == null || !marker.hasParents()) {
                     jsonWriter.writeNull();
                     return;
                 }
 
+                // Write parents
                 final Marker[] parents = marker.getParents();
-
                 jsonWriter.writeArrayStart();
-                for (int i = 0; i < parents.length; i++) {
-                    if (i > 0) {
+                for (int parentIndex = 0; parentIndex < parents.length; parentIndex++) {
+                    if (parentIndex > 0) {
                         jsonWriter.writeSeparator();
                     }
-                    final Marker parentMarker = parents[i];
+                    final Marker parentMarker = parents[parentIndex];
                     jsonWriter.writeString(parentMarker.getName());
                 }
                 jsonWriter.writeArrayEnd();
+
             };
 
     private final TemplateResolver<LogEvent> internalResolver;
diff --git a/src/changelog/.2.x.x/MarkerResolver-expose-parents-as-list.xml b/src/changelog/.2.x.x/1381_support_parents_in_MarkerResolver.xml
similarity index 81%
rename from src/changelog/.2.x.x/MarkerResolver-expose-parents-as-list.xml
rename to src/changelog/.2.x.x/1381_support_parents_in_MarkerResolver.xml
index 6a9d18416b..5bbb068ce0 100644
--- a/src/changelog/.2.x.x/MarkerResolver-expose-parents-as-list.xml
+++ b/src/changelog/.2.x.x/1381_support_parents_in_MarkerResolver.xml
@@ -18,10 +18,9 @@
 <entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://logging.apache.org/log4j/changelog"
        xsi:schemaLocation="http://logging.apache.org/log4j/changelog https://logging.apache.org/log4j/changelog-0.1.1.xsd"
-       type="changed">
-  <author id="eherot"/>
-  <description format="asciidoc">
-    PatternLayout can display the marker's parents with `%marker`.
-    This will add that same capability to JSON Template Layout
-  </description>
+       type="added">
+  <issue id="1381" link="https://github.com/apache/logging-log4j2/pull/1381"/>
+  <author name="Eric Herot"/>
+  <author id="vy"/>
+  <description format="asciidoc">Add marker parent support to `JsonTemplateLayout`</description>
 </entry>
diff --git a/src/site/asciidoc/manual/json-template-layout.adoc.vm b/src/site/asciidoc/manual/json-template-layout.adoc.vm
index d6c503385c..fd4fb5d1e8 100644
--- a/src/site/asciidoc/manual/json-template-layout.adoc.vm
+++ b/src/site/asciidoc/manual/json-template-layout.adoc.vm
@@ -743,6 +743,8 @@ Each `pointMatcherRegexes` item triggers a `Pattern#matcher()` call, which is
 not garbage-free either.
 ====
 
+====== Examples
+
 Resolve `logEvent.getThrown().getClass().getCanonicalName()`:
 
 [source,json]
@@ -849,6 +851,8 @@ severity-field = "field" -> ( "keyword" | "code" )
 
 Resolves the fields of the `logEvent.getLevel()`.
 
+====== Examples
+
 Resolve the level name:
 
 [source,json]
@@ -897,6 +901,8 @@ config = "field" -> ( "name" | "fqcn" )
 
 Resolves `logEvent.getLoggerFqcn()` and `logEvent.getLoggerName()`.
 
+====== Examples
+
 Resolve the logger name:
 
 [source,json]
@@ -930,6 +936,8 @@ key    = "key" -> string
 Performs link:lookups.html#AppMainArgsLookup[Main Argument Lookup] for the
 given `index` or `key`.
 
+====== Examples
+
 Resolve the 1st `main()` method argument:
 
 [source,json]
@@ -956,6 +964,38 @@ Resolve the argument coming right after `--userId`:
 Resolves ``MapMessage``s. See link:#map-resolver-template[Map Resolver Template]
 for details.
 
+[#event-template-resolver-marker]
+===== `marker`
+
+[source]
+----
+config = "field" -> ( "name" | "parents" )
+----
+
+Resolves `logEvent.getMarker()`.
+
+====== Examples
+
+Resolve the marker name:
+
+[source,json]
+----
+{
+  "$resolver": "marker",
+  "field": "name"
+}
+----
+
+Resolve the names of the marker's parents:
+
+[source,json]
+----
+{
+  "$resolver": "marker",
+  "field": "parents"
+}
+----
+
 [#event-template-resolver-mdc]
 ===== `mdc`
 
@@ -986,6 +1026,8 @@ For simple string messages, the resolution is performed without allocations.
 For ``ObjectMessage``s and ``MultiformatMessage``s, it depends.
 ====
 
+====== Examples
+
 Resolve the message into a string:
 
 [source,json]
@@ -1047,6 +1089,8 @@ Regarding garbage footprint, `stringified` flag translates to
 which is the case if `log4j2.enableThreadLocals` property set to true.
 ====
 
+====== Examples
+
 Resolve the message parameters into an array:
 
 [source,json]
@@ -1099,6 +1143,8 @@ pattern = "pattern" -> string
 Resolves the Nested Diagnostic Context (NDC), aka. Thread Context Stack,
 `String[]` returned by `logEvent.getContextStack()`.
 
+====== Examples
+
 Resolve all NDC values into a list:
 
 [source,json]
@@ -1133,6 +1179,8 @@ Resolver delegating to link:layouts.html#PatternLayout[`PatternLayout`].
 The default value of `stackTraceEnabled` is inherited from the parent
 `JsonTemplateLayout`.
 
+====== Examples
+
 Resolve the string produced by `%p %c{1.} [%t] %X{userId} %X %m%ex` pattern:
 
 [source,json]
@@ -1161,6 +1209,8 @@ Resolves the fields of the `StackTraceElement` returned by
 Note that this resolver is toggled by
 `log4j.layout.jsonTemplate.locationInfoEnabled` property.
 
+====== Examples
+
 Resolve the line number:
 
 [source,json]
@@ -1182,6 +1232,8 @@ config = "field" -> ( "name" | "id" | "priority" )
 Resolves `logEvent.getThreadId()`, `logEvent.getThreadName()`,
 `logEvent.getThreadPriority()`.
 
+====== Examples
+
 Resolve the thread name:
 
 [source,json]
@@ -1221,6 +1273,8 @@ rounded       = "rounded" -> boolean
 
 Resolves `logEvent.getInstant()` in various forms.
 
+====== Examples
+
 .`timestamp` template resolver examples
 [cols="5,2m"]
 |===