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 2021/02/03 10:04:33 UTC

[logging-log4j2] branch release-2.x updated (95f9d7e -> f1110cc)

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

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


    from 95f9d7e  [LOG4J2-3014] Log4j1ConfigurationConverter on Windows produces "
" at end of every line.
     new 5f043f6  LOG4J2-2973 Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to #format. (#462)
     new f1110cc  LOG4J2-2973 Minor tweaks to previous work.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 log4j-layout-template-json/revapi.json             | 15 +++++
 .../layout/template/json/JsonTemplateLayout.java   | 24 +++----
 .../template/json/resolver/TemplateResolvers.java  |  6 +-
 ...emplateLayoutAdditionalFieldPropertiesTest.java | 21 +++---
 ...nTemplateLayoutAdditionalFieldTestHelpers.java} | 18 ++---
 .../JsonTemplateLayoutAdditionalFieldXmlTest.java  | 21 +++---
 .../JsonTemplateLayoutAdditionalFieldYamlTest.java | 21 +++---
 .../template/json/JsonTemplateLayoutTest.java      |  4 +-
 ...eldEnrichedJsonTemplateLayoutLogging.properties | 37 ++++++++++
 ...ionalFieldEnrichedJsonTemplateLayoutLogging.xml |  6 +-
 ...onalFieldEnrichedJsonTemplateLayoutLogging.yaml | 36 ++++++----
 src/changes/changes.xml                            |  3 +
 ...layout.adoc.vm => json-template-layout.vm.adoc} | 78 +++++++++++++++++-----
 13 files changed, 190 insertions(+), 100 deletions(-)
 copy log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutNoLookupDateTest.java => log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldPropertiesTest.java (59%)
 rename log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/{JsonTemplateLayoutAdditionalFieldTest.java => JsonTemplateLayoutAdditionalFieldTestHelpers.java} (82%)
 copy log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutNoLookupDateTest.java => log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldXmlTest.java (59%)
 copy log4j-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutNoLookupDateTest.java => log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldYamlTest.java (59%)
 create mode 100644 log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties
 copy .dockerignore => log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml (58%)
 rename src/site/asciidoc/manual/{json-template-layout.adoc.vm => json-template-layout.vm.adoc} (92%)


[logging-log4j2] 02/02: LOG4J2-2973 Minor tweaks to previous work.

Posted by vy...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f1110ccce1f37de0599952e5ed6bff0bb9983129
Author: Volkan Yazıcı <vo...@gmail.com>
AuthorDate: Wed Feb 3 10:33:40 2021 +0100

    LOG4J2-2973 Minor tweaks to previous work.
---
 log4j-layout-template-json/revapi.json             | 15 ++++
 ...mplateLayoutAdditionalFieldPropertiesTest.java} |  6 +-
 ...nTemplateLayoutAdditionalFieldTestHelpers.java} | 28 +++++++-
 ... JsonTemplateLayoutAdditionalFieldXmlTest.java} |  7 +-
 ...JsonTemplateLayoutAdditionalFieldYamlTest.java} |  6 +-
 ...eldEnrichedJsonTemplateLayoutLogging.properties | 33 ++++-----
 ...onalFieldEnrichedJsonTemplateLayoutLogging.yaml |  6 +-
 .../asciidoc/manual/json-template-layout.vm.adoc   | 84 ++++++++++++++--------
 8 files changed, 125 insertions(+), 60 deletions(-)

diff --git a/log4j-layout-template-json/revapi.json b/log4j-layout-template-json/revapi.json
index 77f8cde..6f6096d 100644
--- a/log4j-layout-template-json/revapi.json
+++ b/log4j-layout-template-json/revapi.json
@@ -434,6 +434,21 @@
         "old": "class org.apache.logging.log4j.layout.template.json.util.TruncatingBufferedWriter",
         "new": "class org.apache.logging.log4j.layout.template.json.util.TruncatingBufferedWriter",
         "justification": "LOG4J2-2993 Massaged (internal) API to make method names more Java-like and restrict access if possible."
+      },
+      {
+        "code": "java.method.removed",
+        "old": "method org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField.Builder org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField.Builder::setType(org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField.Type)",
+        "justification": "LOG4J2-2973 Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to #format."
+      },
+      {
+        "code": "java.class.removed",
+        "old": "enum org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField.Type",
+        "justification": "LOG4J2-2973 Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to #format."
+      },
+      {
+        "code": "java.method.removed",
+        "old": "method org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField.Type org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField::getType()",
+        "justification": "LOG4J2-2973 Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to #format."
       }
     ]
   }
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestProperties.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldPropertiesTest.java
similarity index 88%
rename from log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestProperties.java
rename to log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldPropertiesTest.java
index 5c3911e..735a55d 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestProperties.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldPropertiesTest.java
@@ -23,12 +23,14 @@ import org.apache.logging.log4j.test.appender.ListAppender;
 import org.junit.jupiter.api.Test;
 
 @LoggerContextSource("additionalFieldEnrichedJsonTemplateLayoutLogging.properties")
-class JsonTemplateLayoutAdditionalFieldTestProperties {
+class JsonTemplateLayoutAdditionalFieldPropertiesTest {
 
     @Test
     void test_additional_fields_are_resolved(
             final LoggerContext loggerContext,
             final @Named(value = "List") ListAppender appender) {
-        JsonTemplateLayoutAdditionalFieldTestHelper.assertAdditionalFields(loggerContext, appender);
+        JsonTemplateLayoutAdditionalFieldTestHelpers
+                .assertAdditionalFields(loggerContext, appender);
     }
+
 }
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelper.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelpers.java
similarity index 62%
rename from log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelper.java
rename to log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelpers.java
index 605cc3a..383206c 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelper.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelpers.java
@@ -1,3 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
 package org.apache.logging.log4j.layout.template.json;
 
 import org.apache.logging.log4j.Logger;
@@ -11,13 +27,18 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-class JsonTemplateLayoutAdditionalFieldTestHelper {
+final class JsonTemplateLayoutAdditionalFieldTestHelpers {
+
+    private JsonTemplateLayoutAdditionalFieldTestHelpers() {}
+
+    static void assertAdditionalFields(
+            final LoggerContext loggerContext,
+            final ListAppender appender) {
 
-    static void assertAdditionalFields(final LoggerContext loggerContext, ListAppender appender) {
         // Log an event.
         final Logger logger =
                 loggerContext.getLogger(
-                        JsonTemplateLayoutAdditionalFieldTestHelper.class);
+                        JsonTemplateLayoutAdditionalFieldTestHelpers.class);
         logger.info("trigger");
 
         // Verify that the appender has logged the event.
@@ -44,4 +65,5 @@ class JsonTemplateLayoutAdditionalFieldTestHelper {
                 .containsEntry("listField", Arrays.asList(1, "two"));
 
     }
+
 }
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestXML.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldXmlTest.java
similarity index 88%
rename from log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestXML.java
rename to log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldXmlTest.java
index d96da36..f9194ee 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestXML.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldXmlTest.java
@@ -23,11 +23,14 @@ import org.apache.logging.log4j.test.appender.ListAppender;
 import org.junit.jupiter.api.Test;
 
 @LoggerContextSource("additionalFieldEnrichedJsonTemplateLayoutLogging.xml")
-class JsonTemplateLayoutAdditionalFieldTestXML {
+class JsonTemplateLayoutAdditionalFieldXmlTest {
+
     @Test
     void test_additional_fields_are_resolved(
             final LoggerContext loggerContext,
             final @Named(value = "List") ListAppender appender) {
-        JsonTemplateLayoutAdditionalFieldTestHelper.assertAdditionalFields(loggerContext, appender);
+        JsonTemplateLayoutAdditionalFieldTestHelpers
+                .assertAdditionalFields(loggerContext, appender);
     }
+
 }
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestYAML.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldYamlTest.java
similarity index 88%
rename from log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestYAML.java
rename to log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldYamlTest.java
index 204ead8..feecefb 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestYAML.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldYamlTest.java
@@ -23,12 +23,14 @@ import org.apache.logging.log4j.test.appender.ListAppender;
 import org.junit.jupiter.api.Test;
 
 @LoggerContextSource("additionalFieldEnrichedJsonTemplateLayoutLogging.yaml")
-class JsonTemplateLayoutAdditionalFieldTestYAML {
+class JsonTemplateLayoutAdditionalFieldYamlTest {
 
     @Test
     void test_additional_fields_are_resolved(
             final LoggerContext loggerContext,
             final @Named(value = "List") ListAppender appender) {
-        JsonTemplateLayoutAdditionalFieldTestHelper.assertAdditionalFields(loggerContext, appender);
+        JsonTemplateLayoutAdditionalFieldTestHelpers
+                .assertAdditionalFields(loggerContext, appender);
     }
+
 }
diff --git a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties
index 58e65ba..64bde5f 100644
--- a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties
+++ b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties
@@ -17,24 +17,21 @@ appender.list.name = List
 appender.list.type = List
 appender.list.raw = true
 appender.list.layout.type = JsonTemplateLayout
-appender.list.layout.charset = UTF-8
-appender.list.layout.extra[0].key = stringField
-appender.list.layout.extra[0].value = string
-appender.list.layout.extra[0].type = EventTemplateAdditionalField
-appender.list.layout.extra[0].format = STRING
-appender.list.layout.extra[1].key = numberField
-appender.list.layout.extra[1].value = 1
-appender.list.layout.extra[1].format = JSON
-appender.list.layout.extra[1].type = EventTemplateAdditionalField
-appender.list.layout.extra[2].key = objectField
-appender.list.layout.extra[2].value = {"numberField":1}
-appender.list.layout.extra[2].format = JSON
-appender.list.layout.extra[2].type = EventTemplateAdditionalField
-appender.list.layout.extra[3].key = listField
-appender.list.layout.extra[3].value = [1, "two"]
-appender.list.layout.extra[3].format = JSON
-appender.list.layout.extra[3].type = EventTemplateAdditionalField
+appender.list.layout.eventTemplateAdditionalField[0].type = EventTemplateAdditionalField
+appender.list.layout.eventTemplateAdditionalField[0].key = stringField
+appender.list.layout.eventTemplateAdditionalField[0].value = string
+appender.list.layout.eventTemplateAdditionalField[1].type = EventTemplateAdditionalField
+appender.list.layout.eventTemplateAdditionalField[1].key = numberField
+appender.list.layout.eventTemplateAdditionalField[1].value = 1
+appender.list.layout.eventTemplateAdditionalField[1].format = JSON
+appender.list.layout.eventTemplateAdditionalField[2].type = EventTemplateAdditionalField
+appender.list.layout.eventTemplateAdditionalField[2].key = objectField
+appender.list.layout.eventTemplateAdditionalField[2].value = {"numberField":1}
+appender.list.layout.eventTemplateAdditionalField[2].format = JSON
+appender.list.layout.eventTemplateAdditionalField[3].type = EventTemplateAdditionalField
+appender.list.layout.eventTemplateAdditionalField[3].key = listField
+appender.list.layout.eventTemplateAdditionalField[3].value = [1, "two"]
+appender.list.layout.eventTemplateAdditionalField[3].format = JSON
 
 rootLogger.level = info
 rootLogger.appenderRef.stdout.ref = List
-
diff --git a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml
index 676b3ce..58a2bd9 100644
--- a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml
+++ b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml
@@ -14,13 +14,13 @@
 # limitations under the License.
 
 Configuration:
-  status: OFF
+  status: "OFF"
   appenders:
     List:
       name: "List"
       raw: "true"
       JsonTemplateLayout:
-        EventTemplateadditionalField:
+        eventTemplateAdditionalField:
           - key: "stringField"
             value: "string"
           - key: "numberField"
@@ -36,4 +36,4 @@ Configuration:
     root:
       level: "trace"
       AppenderRef:
-        ref: List
+        ref: "List"
diff --git a/src/site/asciidoc/manual/json-template-layout.vm.adoc b/src/site/asciidoc/manual/json-template-layout.vm.adoc
index d3f700c..4575259 100644
--- a/src/site/asciidoc/manual/json-template-layout.vm.adoc
+++ b/src/site/asciidoc/manual/json-template-layout.vm.adoc
@@ -242,11 +242,12 @@ appender.console.json.eventTemplateUri = classpath:LogstashJsonEventLayoutV1.jso
 [#additional-event-template-fields]
 === Additonal event template fields
 
-Additional event template field is a convenient short-cut to add custom fields
-to a template or override the fields of a template. Following configuration
-overrides the `host` field of the `GelfLayout.json` template and adds two new
-custom fields:
+Additional event template fields are a convenient short-cut to add custom fields
+to a template or override the existing ones. Following configuration overrides
+the `host` field of the `GelfLayout.json` template and adds two new custom
+fields:
 
+.XML configuration with additional fields
 [source,xml]
 ----
 <JsonTemplateLayout eventTemplateUri="classpath:GelfLayout.json">
@@ -257,40 +258,63 @@ custom fields:
 ----
 
 The default `format` for the added new fields are `String`.
-One can also pass JSON literals into additional fields:
+One can also provide JSON-formatted additional fields:
 
+.XML-formatted configuration with JSON-formatted additional fields
 [source,xml]
 ----
-<EventTemplateAdditionalField
-     key="marker"
-     format="JSON"
-     value='{"$resolver": "marker", "field": "name"}'/>
-<EventTemplateAdditionalField
-     key="aNumber"
-     format="JSON"
-     value="1"/>
-<EventTemplateAdditionalField
-     key="aList"
-     format="JSON"
-     value='[1,2,"string"]'/>
+<JsonTemplateLayout eventTemplateUri="classpath:GelfLayout.json">
+  <EventTemplateAdditionalField
+       key="marker"
+       format="JSON"
+       value='{"$resolver": "marker", "field": "name"}'/>
+  <EventTemplateAdditionalField
+       key="aNumber"
+       format="JSON"
+       value="1"/>
+  <EventTemplateAdditionalField
+       key="aList"
+       format="JSON"
+       value='[1, 2, "three"]'/>
+</JsonTemplateLayout>
 ----
 
-When using a configuration file with a `.properties` extension, additional fields can be added as follows:
+Additional event template fields can also be introduced using properties- and
+YAML-formatted configuration:
 
+.Properties-formatted configuration with JSON-formatted additional fields
 [source, properties]
 ----
-appender.console.layout.extra[0].key = marker
-appender.console.layout.extra[0].value = {"$resolver": "marker", "field": "name"}
-appender.console.layout.extra[0].format = JSON
-appender.console.layout.extra[0].type = EventTemplateAdditionalField
-appender.console.layout.extra[1].key = aNumber
-appender.console.layout.extra[1].value = 1
-appender.console.layout.extra[1].format = JSON
-appender.console.layout.extra[1].type = EventTemplateAdditionalField
-appender.console.layout.extra[2].key = aList
-appender.console.layout.extra[2].value = [1,2,"string"]
-appender.console.layout.extra[2].format = JSON
-appender.console.layout.extra[2].type = EventTemplateAdditionalField
+appender.console.layout.type = JsonTemplateLayout
+appender.console.layout.eventTemplateUri = classpath:GelfLayout.json
+appender.console.layout.eventTemplateAdditionalField[0].type = EventTemplateAdditionalField
+appender.console.layout.eventTemplateAdditionalField[0].key = marker
+appender.console.layout.eventTemplateAdditionalField[0].value = {"$resolver": "marker", "field": "name"}
+appender.console.layout.eventTemplateAdditionalField[0].format = JSON
+appender.console.layout.eventTemplateAdditionalField[1].type = EventTemplateAdditionalField
+appender.console.layout.eventTemplateAdditionalField[1].key = aNumber
+appender.console.layout.eventTemplateAdditionalField[1].value = 1
+appender.console.layout.eventTemplateAdditionalField[1].format = JSON
+appender.console.layout.eventTemplateAdditionalField[2].type = EventTemplateAdditionalField
+appender.console.layout.eventTemplateAdditionalField[2].key = aList
+appender.console.layout.eventTemplateAdditionalField[2].value = [1, 2, "three"]
+appender.console.layout.eventTemplateAdditionalField[2].format = JSON
+----
+
+.YAML-formatted configuration with JSON-formatted additional fields
+[source,yaml]
+----
+JsonTemplateLayout:
+  eventTemplateAdditionalField:
+    - key: "marker"
+      value: '{"$resolver": "marker", "field": "name"}'
+      format: "JSON"
+    - key: "aNumber"
+      value: "1"
+      format: "JSON"
+    - key: "aList"
+      value: '[1, 2, "three"]'
+      format: "JSON"
 ----
 
 [#recycling-strategy]


[logging-log4j2] 01/02: LOG4J2-2973 Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to #format. (#462)

Posted by vy...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5f043f6c833986342a2ab73a57787676f7d1b7ce
Author: Fabricc <Fa...@users.noreply.github.com>
AuthorDate: Wed Feb 3 09:41:48 2021 +0100

    LOG4J2-2973 Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to #format. (#462)
---
 .../layout/template/json/JsonTemplateLayout.java   | 24 ++++++-------
 .../template/json/resolver/TemplateResolvers.java  |  6 ++--
 ...onTemplateLayoutAdditionalFieldTestHelper.java} | 34 +++---------------
 ...emplateLayoutAdditionalFieldTestProperties.java | 34 ++++++++++++++++++
 .../JsonTemplateLayoutAdditionalFieldTestXML.java  | 33 ++++++++++++++++++
 .../JsonTemplateLayoutAdditionalFieldTestYAML.java | 34 ++++++++++++++++++
 .../template/json/JsonTemplateLayoutTest.java      |  4 +--
 ...eldEnrichedJsonTemplateLayoutLogging.properties | 40 ++++++++++++++++++++++
 ...ionalFieldEnrichedJsonTemplateLayoutLogging.xml |  6 ++--
 ...onalFieldEnrichedJsonTemplateLayoutLogging.yaml | 39 +++++++++++++++++++++
 src/changes/changes.xml                            |  3 ++
 ...layout.adoc.vm => json-template-layout.vm.adoc} | 26 +++++++++++---
 12 files changed, 229 insertions(+), 54 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 1ef2b13..b0a2b66 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
@@ -531,18 +531,18 @@ public class JsonTemplateLayout implements StringLayout {
             printObject = true)
     public static final class EventTemplateAdditionalField {
 
-        public enum Type { STRING, JSON }
+        public enum Format { STRING, JSON }
 
         private final String key;
 
         private final String value;
 
-        private final Type type;
+        private final Format format;
 
         private EventTemplateAdditionalField(final Builder builder) {
             this.key = builder.key;
             this.value = builder.value;
-            this.type = builder.type;
+            this.format = builder.format;
         }
 
         public String getKey() {
@@ -553,8 +553,8 @@ public class JsonTemplateLayout implements StringLayout {
             return value;
         }
 
-        public Type getType() {
-            return type;
+        public Format getFormat() {
+            return format;
         }
 
         @Override
@@ -568,17 +568,17 @@ public class JsonTemplateLayout implements StringLayout {
             EventTemplateAdditionalField that = (EventTemplateAdditionalField) object;
             return key.equals(that.key) &&
                     value.equals(that.value) &&
-                    type == that.type;
+                    format == that.format;
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(key, value, type);
+            return Objects.hash(key, value, format);
         }
 
         @Override
         public String toString() {
-            final String formattedValue = Type.STRING.equals(type)
+            final String formattedValue = Format.STRING.equals(format)
                     ? String.format("\"%s\"", value)
                     : value;
             return String.format("%s=%s", key, formattedValue);
@@ -599,7 +599,7 @@ public class JsonTemplateLayout implements StringLayout {
             private String value;
 
             @PluginBuilderAttribute
-            private Type type = Type.STRING;
+            private Format format = Format.STRING;
 
             public Builder setKey(final String key) {
                 this.key = key;
@@ -611,8 +611,8 @@ public class JsonTemplateLayout implements StringLayout {
                 return this;
             }
 
-            public Builder setType(final Type type) {
-                this.type = type;
+            public Builder setFormat(final Format format) {
+                this.format = format;
                 return this;
             }
 
@@ -629,7 +629,7 @@ public class JsonTemplateLayout implements StringLayout {
                 if (Strings.isBlank(value)) {
                     throw new IllegalArgumentException("blank value");
                 }
-                Objects.requireNonNull(type, "type");
+                Objects.requireNonNull(format, "format");
             }
 
         }
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 d713edd..b0cede2 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
@@ -129,7 +129,7 @@ public final class TemplateResolvers {
             for (final EventTemplateAdditionalField additionalField : additionalFields) {
                 final String additionalFieldKey = additionalField.getKey();
                 final Object additionalFieldValue;
-                switch (additionalField.getType()) {
+                switch (additionalField.getFormat()) {
                     case STRING:
                         additionalFieldValue = additionalField.getValue();
                         break;
@@ -145,8 +145,8 @@ public final class TemplateResolvers {
                         break;
                     default: {
                         final String message = String.format(
-                                "unknown type %s for additional field: %s",
-                                additionalFieldKey, additionalField.getType());
+                                "unknown format %s for additional field: %s",
+                                additionalFieldKey, additionalField.getFormat());
                         throw new IllegalArgumentException(message);
                     }
                 }
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTest.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelper.java
similarity index 54%
rename from log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTest.java
rename to log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelper.java
index 465bcc6..605cc3a 100644
--- a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTest.java
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestHelper.java
@@ -1,47 +1,23 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache license, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the license for the specific language governing permissions and
- * limitations under the license.
- */
 package org.apache.logging.log4j.layout.template.json;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.junit.LoggerContextSource;
-import org.apache.logging.log4j.junit.Named;
 import org.apache.logging.log4j.layout.template.json.util.JsonReader;
 import org.apache.logging.log4j.test.appender.ListAppender;
 import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.Test;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-@LoggerContextSource("additionalFieldEnrichedJsonTemplateLayoutLogging.xml")
-class JsonTemplateLayoutAdditionalFieldTest {
-
-    @Test
-    void test_additional_fields_are_resolved(
-            final LoggerContext loggerContext,
-            @Named("List") final ListAppender appender) {
+class JsonTemplateLayoutAdditionalFieldTestHelper {
 
+    static void assertAdditionalFields(final LoggerContext loggerContext, ListAppender appender) {
         // Log an event.
         final Logger logger =
                 loggerContext.getLogger(
-                        JsonTemplateLayoutAdditionalFieldTest.class);
+                        JsonTemplateLayoutAdditionalFieldTestHelper.class);
         logger.info("trigger");
 
         // Verify that the appender has logged the event.
@@ -56,8 +32,7 @@ class JsonTemplateLayoutAdditionalFieldTest {
                         JsonTemplateLayoutDefaults.getCharset());
         final Object serializedEventObject = JsonReader.read(serializedEventJson);
         Assertions.assertThat(serializedEventObject).isInstanceOf(Map.class);
-        @SuppressWarnings("unchecked")
-        final Map<String, Object> serializedEventMap =
+        @SuppressWarnings("unchecked") final Map<String, Object> serializedEventMap =
                 (Map<String, Object>) serializedEventObject;
 
         // Verify the serialized additional fields.
@@ -69,5 +44,4 @@ class JsonTemplateLayoutAdditionalFieldTest {
                 .containsEntry("listField", Arrays.asList(1, "two"));
 
     }
-
 }
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestProperties.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestProperties.java
new file mode 100644
index 0000000..5c3911e
--- /dev/null
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestProperties.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.layout.template.json;
+
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
+import org.apache.logging.log4j.test.appender.ListAppender;
+import org.junit.jupiter.api.Test;
+
+@LoggerContextSource("additionalFieldEnrichedJsonTemplateLayoutLogging.properties")
+class JsonTemplateLayoutAdditionalFieldTestProperties {
+
+    @Test
+    void test_additional_fields_are_resolved(
+            final LoggerContext loggerContext,
+            final @Named(value = "List") ListAppender appender) {
+        JsonTemplateLayoutAdditionalFieldTestHelper.assertAdditionalFields(loggerContext, appender);
+    }
+}
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestXML.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestXML.java
new file mode 100644
index 0000000..d96da36
--- /dev/null
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestXML.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.layout.template.json;
+
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
+import org.apache.logging.log4j.test.appender.ListAppender;
+import org.junit.jupiter.api.Test;
+
+@LoggerContextSource("additionalFieldEnrichedJsonTemplateLayoutLogging.xml")
+class JsonTemplateLayoutAdditionalFieldTestXML {
+    @Test
+    void test_additional_fields_are_resolved(
+            final LoggerContext loggerContext,
+            final @Named(value = "List") ListAppender appender) {
+        JsonTemplateLayoutAdditionalFieldTestHelper.assertAdditionalFields(loggerContext, appender);
+    }
+}
diff --git a/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestYAML.java b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestYAML.java
new file mode 100644
index 0000000..204ead8
--- /dev/null
+++ b/log4j-layout-template-json/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutAdditionalFieldTestYAML.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.layout.template.json;
+
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.junit.LoggerContextSource;
+import org.apache.logging.log4j.junit.Named;
+import org.apache.logging.log4j.test.appender.ListAppender;
+import org.junit.jupiter.api.Test;
+
+@LoggerContextSource("additionalFieldEnrichedJsonTemplateLayoutLogging.yaml")
+class JsonTemplateLayoutAdditionalFieldTestYAML {
+
+    @Test
+    void test_additional_fields_are_resolved(
+            final LoggerContext loggerContext,
+            final @Named(value = "List") ListAppender appender) {
+        JsonTemplateLayoutAdditionalFieldTestHelper.assertAdditionalFields(loggerContext, appender);
+    }
+}
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 f0d5b6c..24c2040 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
@@ -1359,7 +1359,7 @@ class JsonTemplateLayoutTest {
                         .newBuilder()
                         .setKey("number")
                         .setValue("1")
-                        .setType(EventTemplateAdditionalField.Type.JSON)
+                        .setFormat(EventTemplateAdditionalField.Format.JSON)
                         .build(),
                 EventTemplateAdditionalField
                         .newBuilder()
@@ -1370,7 +1370,7 @@ class JsonTemplateLayoutTest {
                         .newBuilder()
                         .setKey("level")
                         .setValue("{\"$resolver\": \"level\", \"field\": \"name\"}")
-                        .setType(EventTemplateAdditionalField.Type.JSON)
+                        .setFormat(EventTemplateAdditionalField.Format.JSON)
                         .build()
         };
         final JsonTemplateLayout layout = JsonTemplateLayout
diff --git a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties
new file mode 100644
index 0000000..58e65ba
--- /dev/null
+++ b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.properties
@@ -0,0 +1,40 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+appender.list.name = List
+appender.list.type = List
+appender.list.raw = true
+appender.list.layout.type = JsonTemplateLayout
+appender.list.layout.charset = UTF-8
+appender.list.layout.extra[0].key = stringField
+appender.list.layout.extra[0].value = string
+appender.list.layout.extra[0].type = EventTemplateAdditionalField
+appender.list.layout.extra[0].format = STRING
+appender.list.layout.extra[1].key = numberField
+appender.list.layout.extra[1].value = 1
+appender.list.layout.extra[1].format = JSON
+appender.list.layout.extra[1].type = EventTemplateAdditionalField
+appender.list.layout.extra[2].key = objectField
+appender.list.layout.extra[2].value = {"numberField":1}
+appender.list.layout.extra[2].format = JSON
+appender.list.layout.extra[2].type = EventTemplateAdditionalField
+appender.list.layout.extra[3].key = listField
+appender.list.layout.extra[3].value = [1, "two"]
+appender.list.layout.extra[3].format = JSON
+appender.list.layout.extra[3].type = EventTemplateAdditionalField
+
+rootLogger.level = info
+rootLogger.appenderRef.stdout.ref = List
+
diff --git a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.xml b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.xml
index 3449c6d..b27bfde 100644
--- a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.xml
+++ b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.xml
@@ -20,9 +20,9 @@
     <List name="List" raw="true">
       <JsonTemplateLayout>
         <EventTemplateAdditionalField key="stringField" value="string"/>
-        <EventTemplateAdditionalField key="numberField" value="1" type="JSON"/>
-        <EventTemplateAdditionalField key="objectField" value='{"numberField":1}' type="JSON"/>
-        <EventTemplateAdditionalField key="listField" value='[1, "two"]' type="JSON"/>
+        <EventTemplateAdditionalField key="numberField" value="1" format="JSON"/>
+        <EventTemplateAdditionalField key="objectField" value='{"numberField":1}' format="JSON"/>
+        <EventTemplateAdditionalField key="listField" value='[1, "two"]' format="JSON"/>
       </JsonTemplateLayout>
     </List>
   </Appenders>
diff --git a/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml
new file mode 100644
index 0000000..676b3ce
--- /dev/null
+++ b/log4j-layout-template-json/src/test/resources/additionalFieldEnrichedJsonTemplateLayoutLogging.yaml
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+Configuration:
+  status: OFF
+  appenders:
+    List:
+      name: "List"
+      raw: "true"
+      JsonTemplateLayout:
+        EventTemplateadditionalField:
+          - key: "stringField"
+            value: "string"
+          - key: "numberField"
+            value: "1"
+            format: "JSON"
+          - key: "objectField"
+            value: '{"numberField":1}'
+            format: "JSON"
+          - key: "listField"
+            value: '[1, "two"]'
+            format: "JSON"
+  loggers:
+    root:
+      level: "trace"
+      AppenderRef:
+        ref: List
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index af502dc..89a3715 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -34,6 +34,9 @@
       <action issue="LOG4J2-2998" dev="vy" type="fix">
         Fix truncation of excessive strings ending with a high surrogate in JsonWriter.
       </action>
+      <action issue="LOG4J2-2973" dev="fricchiuti" type="fix">
+        Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to "format".
+      </action>
       <action issue="LOG4J2-2972" dev="vy" type="fix">
         Refactor AsyncAppender and AppenderControl for handling of Throwables.
       </action>
diff --git a/src/site/asciidoc/manual/json-template-layout.adoc.vm b/src/site/asciidoc/manual/json-template-layout.vm.adoc
similarity index 97%
rename from src/site/asciidoc/manual/json-template-layout.adoc.vm
rename to src/site/asciidoc/manual/json-template-layout.vm.adoc
index fdc6534..d3f700c 100644
--- a/src/site/asciidoc/manual/json-template-layout.adoc.vm
+++ b/src/site/asciidoc/manual/json-template-layout.vm.adoc
@@ -256,25 +256,43 @@ custom fields:
 </JsonTemplateLayout>
 ----
 
-The default `type` for the added new fields are `String`.
+The default `format` for the added new fields are `String`.
 One can also pass JSON literals into additional fields:
 
 [source,xml]
 ----
 <EventTemplateAdditionalField
      key="marker"
-     type="JSON"
+     format="JSON"
      value='{"$resolver": "marker", "field": "name"}'/>
 <EventTemplateAdditionalField
      key="aNumber"
-     type="JSON"
+     format="JSON"
      value="1"/>
 <EventTemplateAdditionalField
      key="aList"
-     type="JSON"
+     format="JSON"
      value='[1,2,"string"]'/>
 ----
 
+When using a configuration file with a `.properties` extension, additional fields can be added as follows:
+
+[source, properties]
+----
+appender.console.layout.extra[0].key = marker
+appender.console.layout.extra[0].value = {"$resolver": "marker", "field": "name"}
+appender.console.layout.extra[0].format = JSON
+appender.console.layout.extra[0].type = EventTemplateAdditionalField
+appender.console.layout.extra[1].key = aNumber
+appender.console.layout.extra[1].value = 1
+appender.console.layout.extra[1].format = JSON
+appender.console.layout.extra[1].type = EventTemplateAdditionalField
+appender.console.layout.extra[2].key = aList
+appender.console.layout.extra[2].value = [1,2,"string"]
+appender.console.layout.extra[2].format = JSON
+appender.console.layout.extra[2].type = EventTemplateAdditionalField
+----
+
 [#recycling-strategy]
 === Recycling strategy