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"]
|===