Skip to content

Commit db8cefa

Browse files
vytheit
authored andcommitted
Improvements on the recently added marker parent support to MarkerResolver (apache#1381)
1 parent bbd6679 commit db8cefa

File tree

4 files changed

+130
-84
lines changed

4 files changed

+130
-84
lines changed

log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolverTest.java

Lines changed: 62 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
*/
1717
package org.apache.logging.log4j.layout.template.json.resolver;
1818

19-
import java.util.Arrays;
20-
2119
import org.apache.logging.log4j.Marker;
2220
import org.apache.logging.log4j.MarkerManager;
2321
import org.apache.logging.log4j.core.LogEvent;
@@ -30,74 +28,67 @@
3028

3129
class MarkerResolverTest {
3230

33-
@Test
34-
void should_have_a_marker_name() {
35-
final String eventTemplate = writeJson(asMap(
36-
"marker",
37-
asMap(
38-
"$resolver", "marker",
39-
"field", "name"
40-
)
41-
));
42-
43-
// Create the layout.
44-
final JsonTemplateLayout layout = JsonTemplateLayout
45-
.newBuilder()
46-
.setConfiguration(CONFIGURATION)
47-
.setEventTemplate(eventTemplate)
48-
.build();
49-
50-
// Create the log event.
51-
final Marker marker = MarkerManager.getMarker("MARKER");
52-
final LogEvent logEvent = Log4jLogEvent
53-
.newBuilder()
54-
.setMarker(marker)
55-
.build();
56-
57-
// Check the serialized event.
58-
usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
59-
assertThat(accessor.getString("marker")).isEqualTo("MARKER");
60-
});
61-
}
62-
63-
@Test
64-
void should_list_parents_as_array() {
65-
final String eventTemplate = writeJson(asMap(
66-
"parents",
67-
asMap(
68-
"$resolver", "marker",
69-
"field", "parents"
70-
)
71-
));
72-
73-
// Create the layout.
74-
final JsonTemplateLayout layout = JsonTemplateLayout
75-
.newBuilder()
76-
.setConfiguration(CONFIGURATION)
77-
.setEventTemplate(eventTemplate)
78-
.build();
79-
80-
// Create the log event.
81-
final Marker PARENT_MARKER_1 = MarkerManager.getMarker("PARENT_MARKER_NAME_1");
82-
final Marker PARENT_MARKER_2 = MarkerManager.getMarker("PARENT_MARKER_NAME_2");
83-
final Marker CHILD_MARKER = MarkerManager.getMarker("CHILD_MARKER_NAME");
84-
CHILD_MARKER.setParents(PARENT_MARKER_1, PARENT_MARKER_2);
85-
86-
final LogEvent logEvent = Log4jLogEvent
87-
.newBuilder()
88-
.setMarker(CHILD_MARKER)
89-
.build();
90-
91-
// Check the serialized event.
92-
usingSerializedLogEventAccessor(layout, logEvent, accessor -> {
93-
assertThat(accessor.getList("parents", String.class)).hasSize(2);
94-
assertThat(accessor.getList("parents", String.class)).containsAll(
95-
Arrays.asList(
96-
"PARENT_MARKER_NAME_1",
97-
"PARENT_MARKER_NAME_2"
98-
)
99-
);
100-
});
101-
}
31+
@Test
32+
void should_have_a_marker_name() {
33+
34+
// Create the event template
35+
final String eventTemplate = writeJson(asMap(
36+
"marker", asMap(
37+
"$resolver", "marker",
38+
"field", "name")));
39+
40+
// Create the layout.
41+
final JsonTemplateLayout layout = JsonTemplateLayout
42+
.newBuilder()
43+
.setConfiguration(CONFIGURATION)
44+
.setEventTemplate(eventTemplate)
45+
.build();
46+
47+
// Create the log event.
48+
final Marker marker = MarkerManager.getMarker("MARKER");
49+
final LogEvent logEvent = Log4jLogEvent
50+
.newBuilder()
51+
.setMarker(marker)
52+
.build();
53+
54+
// Check the serialized event.
55+
usingSerializedLogEventAccessor(layout, logEvent, accessor ->
56+
assertThat(accessor.getString("marker")).isEqualTo("MARKER"));
57+
58+
}
59+
60+
@Test
61+
void should_list_parents_as_array() {
62+
63+
// Create the event template
64+
final String eventTemplate = writeJson(asMap(
65+
"parents", asMap(
66+
"$resolver", "marker",
67+
"field", "parents")));
68+
69+
// Create the layout.
70+
final JsonTemplateLayout layout = JsonTemplateLayout
71+
.newBuilder()
72+
.setConfiguration(CONFIGURATION)
73+
.setEventTemplate(eventTemplate)
74+
.build();
75+
76+
// Create the log event.
77+
final Marker parentMarker1 = MarkerManager.getMarker("PARENT_MARKER_NAME_1");
78+
final Marker parentMarker2 = MarkerManager.getMarker("PARENT_MARKER_NAME_2");
79+
final Marker childMarker = MarkerManager.getMarker("CHILD_MARKER_NAME");
80+
childMarker.setParents(parentMarker1, parentMarker2);
81+
82+
final LogEvent logEvent = Log4jLogEvent
83+
.newBuilder()
84+
.setMarker(childMarker)
85+
.build();
86+
87+
// Check the serialized event.
88+
usingSerializedLogEventAccessor(layout, logEvent, accessor ->
89+
assertThat(accessor.getList("parents", String.class))
90+
.containsOnly(parentMarker1.getName(), parentMarker2.getName()));
91+
92+
}
10293

10394
}

log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/resolver/MarkerResolver.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@
2626
* <h3>Configuration</h3>
2727
*
2828
* <pre>
29-
* config = "field" -> "name"
30-
* config = "field" -> "parents"
29+
* config = "field" -> ( "name" | "parents" )
3130
* </pre>
3231
*
3332
* <h3>Examples</h3>
@@ -41,7 +40,7 @@
4140
* }
4241
* </pre>
4342
*
44-
* Resolve the marker's parents names:
43+
* Resolve the names of the marker's parents:
4544
*
4645
* <pre>
4746
* {
@@ -64,23 +63,26 @@ public final class MarkerResolver implements EventResolver {
6463

6564
private static final TemplateResolver<LogEvent> PARENTS_RESOLVER =
6665
(final LogEvent logEvent, final JsonWriter jsonWriter) -> {
66+
67+
// Short-circuit if there are no parents
6768
final Marker marker = logEvent.getMarker();
6869
if (marker == null || !marker.hasParents()) {
6970
jsonWriter.writeNull();
7071
return;
7172
}
7273

74+
// Write parents
7375
final Marker[] parents = marker.getParents();
74-
7576
jsonWriter.writeArrayStart();
76-
for (int i = 0; i < parents.length; i++) {
77-
if (i > 0) {
77+
for (int parentIndex = 0; parentIndex < parents.length; parentIndex++) {
78+
if (parentIndex > 0) {
7879
jsonWriter.writeSeparator();
7980
}
80-
final Marker parentMarker = parents[i];
81+
final Marker parentMarker = parents[parentIndex];
8182
jsonWriter.writeString(parentMarker.getName());
8283
}
8384
jsonWriter.writeArrayEnd();
85+
8486
};
8587

8688
private final TemplateResolver<LogEvent> internalResolver;

src/changelog/.2.x.x/MarkerResolver-expose-parents-as-list.xml renamed to src/changelog/.2.x.x/1381_support_parents_in_MarkerResolver.xml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818
<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
1919
xmlns="http://logging.apache.org/log4j/changelog"
2020
xsi:schemaLocation="http://logging.apache.org/log4j/changelog https://logging.apache.org/log4j/changelog-0.1.1.xsd"
21-
type="changed">
22-
<author id="eherot"/>
23-
<description format="asciidoc">
24-
PatternLayout can display the marker's parents with `%marker`.
25-
This will add that same capability to JSON Template Layout
26-
</description>
21+
type="added">
22+
<issue id="1381" link="https://github.com/apache/logging-log4j2/pull/1381"/>
23+
<author name="Eric Herot"/>
24+
<author id="vy"/>
25+
<description format="asciidoc">Add marker parent support to `JsonTemplateLayout`</description>
2726
</entry>

src/site/asciidoc/manual/json-template-layout.adoc.vm

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,8 @@ Each `pointMatcherRegexes` item triggers a `Pattern#matcher()` call, which is
743743
not garbage-free either.
744744
====
745745

746+
====== Examples
747+
746748
Resolve `logEvent.getThrown().getClass().getCanonicalName()`:
747749

748750
[source,json]
@@ -849,6 +851,8 @@ severity-field = "field" -> ( "keyword" | "code" )
849851

850852
Resolves the fields of the `logEvent.getLevel()`.
851853

854+
====== Examples
855+
852856
Resolve the level name:
853857

854858
[source,json]
@@ -897,6 +901,8 @@ config = "field" -> ( "name" | "fqcn" )
897901

898902
Resolves `logEvent.getLoggerFqcn()` and `logEvent.getLoggerName()`.
899903

904+
====== Examples
905+
900906
Resolve the logger name:
901907

902908
[source,json]
@@ -930,6 +936,8 @@ key = "key" -> string
930936
Performs link:lookups.html#AppMainArgsLookup[Main Argument Lookup] for the
931937
given `index` or `key`.
932938

939+
====== Examples
940+
933941
Resolve the 1st `main()` method argument:
934942

935943
[source,json]
@@ -956,6 +964,38 @@ Resolve the argument coming right after `--userId`:
956964
Resolves ``MapMessage``s. See link:#map-resolver-template[Map Resolver Template]
957965
for details.
958966

967+
[#event-template-resolver-marker]
968+
===== `marker`
969+
970+
[source]
971+
----
972+
config = "field" -> ( "name" | "parents" )
973+
----
974+
975+
Resolves `logEvent.getMarker()`.
976+
977+
====== Examples
978+
979+
Resolve the marker name:
980+
981+
[source,json]
982+
----
983+
{
984+
"$resolver": "marker",
985+
"field": "name"
986+
}
987+
----
988+
989+
Resolve the names of the marker's parents:
990+
991+
[source,json]
992+
----
993+
{
994+
"$resolver": "marker",
995+
"field": "parents"
996+
}
997+
----
998+
959999
[#event-template-resolver-mdc]
9601000
===== `mdc`
9611001

@@ -986,6 +1026,8 @@ For simple string messages, the resolution is performed without allocations.
9861026
For ``ObjectMessage``s and ``MultiformatMessage``s, it depends.
9871027
====
9881028

1029+
====== Examples
1030+
9891031
Resolve the message into a string:
9901032

9911033
[source,json]
@@ -1047,6 +1089,8 @@ Regarding garbage footprint, `stringified` flag translates to
10471089
which is the case if `log4j2.enableThreadLocals` property set to true.
10481090
====
10491091

1092+
====== Examples
1093+
10501094
Resolve the message parameters into an array:
10511095

10521096
[source,json]
@@ -1099,6 +1143,8 @@ pattern = "pattern" -> string
10991143
Resolves the Nested Diagnostic Context (NDC), aka. Thread Context Stack,
11001144
`String[]` returned by `logEvent.getContextStack()`.
11011145

1146+
====== Examples
1147+
11021148
Resolve all NDC values into a list:
11031149

11041150
[source,json]
@@ -1133,6 +1179,8 @@ Resolver delegating to link:layouts.html#PatternLayout[`PatternLayout`].
11331179
The default value of `stackTraceEnabled` is inherited from the parent
11341180
`JsonTemplateLayout`.
11351181

1182+
====== Examples
1183+
11361184
Resolve the string produced by `%p %c{1.} [%t] %X{userId} %X %m%ex` pattern:
11371185

11381186
[source,json]
@@ -1161,6 +1209,8 @@ Resolves the fields of the `StackTraceElement` returned by
11611209
Note that this resolver is toggled by
11621210
`log4j.layout.jsonTemplate.locationInfoEnabled` property.
11631211

1212+
====== Examples
1213+
11641214
Resolve the line number:
11651215

11661216
[source,json]
@@ -1182,6 +1232,8 @@ config = "field" -> ( "name" | "id" | "priority" )
11821232
Resolves `logEvent.getThreadId()`, `logEvent.getThreadName()`,
11831233
`logEvent.getThreadPriority()`.
11841234

1235+
====== Examples
1236+
11851237
Resolve the thread name:
11861238

11871239
[source,json]
@@ -1221,6 +1273,8 @@ rounded = "rounded" -> boolean
12211273

12221274
Resolves `logEvent.getInstant()` in various forms.
12231275

1276+
====== Examples
1277+
12241278
.`timestamp` template resolver examples
12251279
[cols="5,2m"]
12261280
|===

0 commit comments

Comments
 (0)