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

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

commit 1ec22cb82813b41f5f687fc0d435414d17aa2b68
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Tue Mar 28 22:01:01 2023 +0200

    More refactoring
---
 .../log4j/builders/layout/XmlLayoutBuilder.java    |  9 +++---
 .../apache/log4j/layout/Log4j1XmlLayoutTest.java   | 11 +++----
 log4j-api/pom.xml                                  |  3 +-
 .../logging/log4j/message/MessageFactory.java      |  7 ++---
 .../log4j/message/ReusableMessageFactory.java      |  3 ++
 .../logging/log4j/spi/DummyRecyclerFactory.java    |  3 ++
 .../log4j/spi/ThreadLocalRecyclerFactory.java      |  5 ++++
 .../log4j/core/GarbageCollectionHelper.java        | 31 +++++++++++--------
 .../java/org/apache/logging/log4j/core/Layout.java |  1 -
 .../logging/log4j/core/async/AsyncLogger.java      | 15 +++++-----
 .../logging/log4j/core/impl/Log4jLogEvent.java     |  1 -
 .../logging/log4j/core/impl/LogEventFactory.java   |  7 +----
 .../log4j/core/impl/ReusableLogEventFactory.java   |  2 +-
 .../logging/log4j/core/layout/AbstractLayout.java  | 30 +++++++------------
 .../log4j/core/layout/AbstractStringLayout.java    |  5 ++--
 .../logging/log4j/core/layout/GelfLayout.java      | 12 ++++----
 .../core/layout/LockingStringBuilderEncoder.java   | 11 ++-----
 .../logging/log4j/core/layout/PatternLayout.java   | 35 ++++------------------
 .../log4j/core/layout/StringBuilderEncoder.java    |  7 +----
 .../log4j/core/layout/TextEncoderHelper.java       | 14 +++++++++
 .../log4j/layout/template/json/LogstashIT.java     |  2 --
 .../json/ThreadLocalRecyclerNestedLoggingTest.java |  2 +-
 .../logging/log4j/mongodb4/MongoDb4Provider.java   | 16 ++++++----
 .../json/JsonTemplateLayoutBenchmarkState.java     |  4 ---
 .../.2.x.x/1232_log4j-to-sfl4j-2-OSGiMetadata.xml  | 29 ------------------
 src/changelog/.2.x.x/1366_fix_java_sql_date.xml    | 28 -----------------
 26 files changed, 105 insertions(+), 188 deletions(-)

diff --git 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
index c0137f4296..a118c758b1 100644
--- 
a/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
+++ 
b/log4j-1.2-api/src/main/java/org/apache/log4j/builders/layout/XmlLayoutBuilder.java
@@ -16,19 +16,20 @@
  */
 package org.apache.log4j.builders.layout;
 
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import org.apache.log4j.Layout;
 import org.apache.log4j.bridge.LayoutWrapper;
 import org.apache.log4j.builders.AbstractBuilder;
 import org.apache.log4j.config.PropertiesConfiguration;
 import org.apache.log4j.layout.Log4j1XmlLayout;
 import org.apache.log4j.xml.XmlConfiguration;
+import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.w3c.dom.Element;
 
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicBoolean;
-
 import static org.apache.log4j.builders.BuilderManager.NAMESPACE;
 import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
 import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
@@ -73,6 +74,6 @@ public class XmlLayoutBuilder extends AbstractBuilder<Layout> 
implements LayoutB
     }
 
     private Layout createLayout(boolean properties, boolean locationInfo) {
-        return LayoutWrapper.adapt(Log4j1XmlLayout.createLayout(locationInfo, 
properties));
+        return LayoutWrapper.adapt(Log4j1XmlLayout.createLayout(new 
DefaultConfiguration(), locationInfo, properties));
     }
 }
diff --git 
a/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java 
b/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java
index 1c2cf7130b..7b253e42f1 100644
--- 
a/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java
+++ 
b/log4j-1.2-api/src/test/java/org/apache/log4j/layout/Log4j1XmlLayoutTest.java
@@ -16,17 +16,18 @@
  */
 package org.apache.log4j.layout;
 
-import static org.junit.Assert.assertEquals;
-
 import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.impl.ContextDataFactory;
 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
-import org.apache.logging.log4j.test.junit.ThreadContextRule;
 import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.test.junit.ThreadContextRule;
 import org.apache.logging.log4j.util.StringMap;
 import org.junit.Rule;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
+
 public class Log4j1XmlLayoutTest {
 
     @Rule
@@ -34,7 +35,7 @@ public class Log4j1XmlLayoutTest {
 
     @Test
     public void testWithoutThrown() {
-        final Log4j1XmlLayout layout = Log4j1XmlLayout.createLayout(false, 
true);
+        final Log4j1XmlLayout layout = Log4j1XmlLayout.createLayout(new 
DefaultConfiguration(), false, true);
 
         final Log4jLogEvent event = Log4jLogEvent.newBuilder()
                 .setLoggerName("a.B")
@@ -55,7 +56,7 @@ public class Log4j1XmlLayoutTest {
 
     @Test
     public void testWithPropertiesAndLocationInfo() {
-        final Log4j1XmlLayout layout = Log4j1XmlLayout.createLayout(true, 
true);
+        final Log4j1XmlLayout layout = Log4j1XmlLayout.createLayout(new 
DefaultConfiguration(), true, true);
 
         final StringMap contextMap = ContextDataFactory.createContextData(2);
         contextMap.putValue("key1", "value1");
diff --git a/log4j-api/pom.xml b/log4j-api/pom.xml
index a1b7809b33..e009643aa2 100644
--- a/log4j-api/pom.xml
+++ b/log4j-api/pom.xml
@@ -57,7 +57,8 @@
         <configuration>
           <instructions>
             <Export-Package>org.apache.logging.log4j.*</Export-Package>
-            <Import-Package>sun.reflect;resolution:=optional,*</Import-Package>
+            <Import-Package>sun.reflect;resolution:=optional,
+              *</Import-Package>
             
<Bundle-Activator>org.apache.logging.log4j.util.Activator</Bundle-Activator>
             <_fixupmessages>"Classes found in the wrong 
directory";is:=warning</_fixupmessages>
           </instructions>
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java
index fa777d3110..0ed0cc70ef 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFactory.java
@@ -247,9 +247,6 @@ public interface MessageFactory {
      * @since 3.0.0
      * @see Recycler
      */
-    default void recycle(Message message) {
-        if (message instanceof ReusableMessage) {
-            ((ReusableMessage) message).clear();
-        }
-    }
+    default void recycle(Message message) {}
+
 }
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
index 7410005c0a..b435ed98f9 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
@@ -82,6 +82,9 @@ public final class ReusableMessageFactory implements 
MessageFactory {
 
     @Override
     public void recycle(final Message message) {
+        if (message instanceof ReusableMessage) {
+            ((ReusableMessage) message).clear();
+        }
         // related to LOG4J2-1583 and nested log messages clobbering each 
other. recycle messages today!
         if (message instanceof ReusableParameterizedMessage) {
             
parameterizedMessageRecycler.release((ReusableParameterizedMessage) message);
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
index 5f6f6d6019..ebe8154e9c 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DummyRecyclerFactory.java
@@ -19,6 +19,8 @@ package org.apache.logging.log4j.spi;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Recycler strategy which doesn't recycle anything; all instances are freshly 
created.
  *
@@ -36,6 +38,7 @@ public class DummyRecyclerFactory implements RecyclerFactory {
 
     @Override
     public <V> Recycler<V> create(final Supplier<V> supplier, final 
Consumer<V> cleaner) {
+        requireNonNull(supplier, "supplier");
         return new DummyRecycler<>(supplier);
     }
 
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
index 43144a5ae8..629cb580e9 100644
--- 
a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
+++ 
b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadLocalRecyclerFactory.java
@@ -22,6 +22,8 @@ import java.util.function.Supplier;
 
 import org.apache.logging.log4j.util.QueueFactories;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * A {@link RecyclerFactory} pooling objects in a queue stored in a {@link 
ThreadLocal}.
  * <p>
@@ -50,6 +52,8 @@ public class ThreadLocalRecyclerFactory implements 
RecyclerFactory {
 
     @Override
     public <V> Recycler<V> create(final Supplier<V> supplier, final 
Consumer<V> cleaner) {
+        requireNonNull(supplier, "supplier");
+        requireNonNull(cleaner, "cleaner");
         return new ThreadLocalRecycler<>(supplier, cleaner);
     }
 
@@ -77,6 +81,7 @@ public class ThreadLocalRecyclerFactory implements 
RecyclerFactory {
 
         @Override
         public void release(final V value) {
+            requireNonNull(value, "value");
             cleaner.accept(value);
             holder.get().offer(value);
         }
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
index 8ed89f3f69..afb38179f5 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.core;
 
+import com.google.common.io.ByteStreams;
+
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -26,23 +28,26 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import static org.junit.Assert.assertTrue;
 
 public final class GarbageCollectionHelper implements Closeable, Runnable {
-    private static final OutputStream sink = OutputStream.nullOutputStream();
+    private static final OutputStream sink = ByteStreams.nullOutputStream();
     private final AtomicBoolean running = new AtomicBoolean();
     private final CountDownLatch latch = new CountDownLatch(1);
-    private final Thread gcThread = new Thread(() -> {
-        try {
-            while (running.get()) {
-                // Allocate data to help suggest a GC
-                try {
-                    // 1mb of heap
-                    sink.write(new byte[1024 * 1024]);
-                } catch (IOException ignored) {
+    private final Thread gcThread = new Thread(new Runnable() {
+        @Override
+        public void run() {
+            try {
+                while (running.get()) {
+                    // Allocate data to help suggest a GC
+                    try {
+                        // 1mb of heap
+                        sink.write(new byte[1024 * 1024]);
+                    } catch (IOException ignored) {
+                    }
+                    // May no-op depending on the jvm configuration
+                    System.gc();
                 }
-                // May no-op depending on the jvm configuration
-                System.gc();
+            } finally {
+                latch.countDown();
             }
-        } finally {
-            latch.countDown();
         }
     });
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java
index b833b060de..c2308bdb1a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Layout.java
@@ -97,5 +97,4 @@ public interface Layout extends Encoder<LogEvent> {
     default boolean requiresLocation() {
         return false;
     }
-
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
index 1796931add..e314e6cf9c 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
@@ -37,7 +37,6 @@ import org.apache.logging.log4j.message.MessageFactory;
 import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.StringMap;
 
@@ -419,7 +418,7 @@ public class AsyncLogger extends Logger implements 
EventTranslatorVararg<RingBuf
         event.setValues(asyncLogger, asyncLogger.getName(), marker, fqcn, 
level, message, thrown,
                 // config properties are taken care of in the EventHandler 
thread
                 // in the AsyncLogger#actualAsyncLog method
-                contextDataInjector.injectContextData(null, 
event.getContextData()),
+                contextDataInjector.injectContextData(null, (StringMap) 
event.getContextData()),
                 contextStack, currentThread.getId(), threadName, 
currentThread.getPriority(), location,
                 clock, nanoClock);
     }
@@ -493,24 +492,24 @@ public class AsyncLogger extends Logger implements 
EventTranslatorVararg<RingBuf
         privateConfigLoggerConfig.getReliabilityStrategy().log(this, event);
     }
 
-    @PerformanceSensitive("allocation")
+    @SuppressWarnings("ForLoopReplaceableByForEach") // Avoid iterator 
allocation
     private void onPropertiesPresent(final RingBufferLogEvent event, final 
List<Property> properties) {
         final StringMap contextData = getContextData(event);
-        // List::forEach is garbage-free when using an ArrayList or 
Arrays.asList
-        properties.forEach(prop -> {
+        for (int i = 0, size = properties.size(); i < size; i++) {
+            final Property prop = properties.get(i);
             if (contextData.getValue(prop.getName()) != null) {
-                return; // contextMap overrides config properties
+                continue; // contextMap overrides config properties
             }
             final String value = prop.isValueNeedsLookup() //
                     ? privateConfig.config.getStrSubstitutor().replace(event, 
prop.getValue()) //
                     : prop.getValue();
             contextData.putValue(prop.getName(), value);
-        });
+        }
         event.setContextData(contextData);
     }
 
     private static StringMap getContextData(final RingBufferLogEvent event) {
-        final StringMap contextData = event.getContextData();
+        final StringMap contextData = (StringMap) event.getContextData();
         if (contextData.isFrozen()) {
             final StringMap temp = ContextDataFactory.createContextData();
             temp.putAll(contextData);
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index 206a8924c5..ad3f4d57b5 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -24,7 +24,6 @@ import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.ContextDataInjector;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.ReusableLogEvent;
-import org.apache.logging.log4j.core.async.RingBufferLogEvent;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.time.Clock;
 import org.apache.logging.log4j.core.time.ClockFactory;
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
index 86a29166b5..c1b3706e4d 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
@@ -21,7 +21,6 @@ import java.util.List;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.ReusableLogEvent;
 import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.plugins.di.Key;
@@ -47,9 +46,5 @@ public interface LogEventFactory {
         return createEvent(loggerName, marker, fqcn, level, data, properties, 
t);
     }
 
-    default void recycle(final LogEvent event) {
-        if (event instanceof ReusableLogEvent) {
-            ((ReusableLogEvent) event).clear();
-        }
-    }
+    default void recycle(final LogEvent event) {}
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
index c4990416f5..6f7f12f608 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ReusableLogEventFactory.java
@@ -34,7 +34,7 @@ import org.apache.logging.log4j.spi.Recycler;
 import org.apache.logging.log4j.spi.RecyclerFactory;
 
 /**
- * Garbage-free LogEventFactory that recycles mutable LogEvent instances.
+ * Garbage-free LogEventFactory that recycles mutable {@link LogEvent} 
instances.
  * @since 2.6
  * @see Recycler
  */
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java
index 34a595e33b..9af3e192df 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractLayout.java
@@ -129,22 +129,6 @@ public abstract class AbstractLayout implements Layout {
      */
     protected final byte[] header;
 
-    /**
-     * Constructs a UTF-8 encoded layout with an optional header and footer.
-     *
-     * @param configuration a configuration
-     * @param header a header to include when the stream is opened, may be null
-     * @param footer the footer to add when the stream is closed, may be null
-     * @deprecated use {@link AbstractLayout#AbstractLayout(Configuration, 
Charset, byte[], byte[])} instead
-     */
-    @Deprecated
-    public AbstractLayout(
-            final Configuration configuration,
-            final byte[] header,
-            final byte[] footer) {
-        this(configuration, DEFAULT_CHARSET, header, footer);
-    }
-
     /**
      * Constructs a layout with an optional header and footer.
      *
@@ -213,17 +197,23 @@ public abstract class AbstractLayout implements Layout {
      * Subclasses can override this method to provide a garbage-free 
implementation. For text-based layouts,
      * {@code AbstractStringLayout} provides various convenience methods to 
help with this:
      * </p>
-     * <pre>{@code @Configurable(elementType = Layout.ELEMENT_TYPE, 
printObject = true)
+     * <pre>{@code
+     * @Configurable(elementType = Layout.ELEMENT_TYPE, printObject = true)
      * @Plugin("MyLayout")
      * public final class MyLayout extends AbstractStringLayout {
      *     @Override
      *     public void encode(LogEvent event, ByteBufferDestination 
destination) {
-     *         StringBuilder text = acquireStringBuilder();
+     *         StringBuilder text = stringBuilderRecycler.acquire();
      *         try {
      *             convertLogEventToText(event, text);
-     *             getStringBuilderEncoder().encode(text, destination);
+     *             StringBuilderEncoder encoder = 
stringBuilderEncoderRecycler.acquire();
+     *             try {
+     *                 encoder.encode(text, destination);
+     *             } finally {
+     *                 stringBuilderEncoderRecycler.release(encoder);
+     *             }
      *         } finally {
-     *             releaseStringBuilder(text);
+     *             stringBuilderRecycler.release(text);
      *         }
      *     }
      *
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index dee942e936..20f9e2e9a5 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -113,8 +113,7 @@ public abstract class AbstractStringLayout extends 
AbstractLayout implements Str
                 stringBuilder -> {
                     StringBuilders.trimToMaxSize(stringBuilder, 
MAX_STRING_BUILDER_SIZE);
                     stringBuilder.setLength(0);
-                }
-        );
+                });
     }
 
     private final Serializer footerSerializer;
@@ -150,7 +149,7 @@ public abstract class AbstractStringLayout extends 
AbstractLayout implements Str
 
     /**
      * Builds a new layout.
-     * @param configuration the configuration
+     * @param configuration a configuration
      * @param charset the charset used to encode the header bytes, footer 
bytes and anything else that needs to be
      *      converted from strings to bytes.
      * @param headerSerializer the header bytes serializer
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
index eb43cd551e..1ab7276cdc 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/GelfLayout.java
@@ -176,20 +176,19 @@ public final class GelfLayout extends 
AbstractStringLayout {
                         + "ignoring message pattern");
                 messagePattern = null;
             }
-            final Configuration config = getConfiguration();
             if (messagePattern != null) {
                 patternLayout = 
PatternLayout.newBuilder().setPattern(messagePattern)
                         .setAlwaysWriteExceptions(includeStacktrace)
-                        .setConfiguration(config)
+                        .setConfiguration(getConfiguration())
                         .build();
             }
             if (patternSelector != null) {
                 patternLayout = 
PatternLayout.newBuilder().setPatternSelector(patternSelector)
                         .setAlwaysWriteExceptions(includeStacktrace)
-                        .setConfiguration(config)
+                        .setConfiguration(getConfiguration())
                         .build();
             }
-            return new GelfLayout(config, host, additionalFields, 
compressionType, compressionThreshold,
+            return new GelfLayout(getConfiguration(), host, additionalFields, 
compressionType, compressionThreshold,
                     includeStacktrace, includeThreadContext, 
includeMapMessage, includeNullDelimiter,
                     includeNewLineDelimiter, omitEmptyFields, mdcChecker, 
mapChecker, patternLayout,
                     threadContextPrefix, mapPrefix);
@@ -467,8 +466,7 @@ public final class GelfLayout extends AbstractStringLayout {
                     final StringBuilder stringBuilder = writer.getBuilder();
                     StringBuilders.trimToMaxSize(stringBuilder, 
MAX_STRING_BUILDER_SIZE);
                     stringBuilder.setLength(0);
-                }
-        );
+                });
     }
 
     @Override
@@ -490,7 +488,7 @@ public final class GelfLayout extends AbstractStringLayout {
             sb.append(", ").append(mapVars);
         }
         if (layout != null) {
-            sb.append(", PatternLayout{").append(layout).append("}");
+            sb.append(", 
PatternLayout{").append(layout.toString()).append("}");
         }
         return sb.toString();
     }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LockingStringBuilderEncoder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LockingStringBuilderEncoder.java
index 666ad84d91..a64b2d3d82 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LockingStringBuilderEncoder.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/LockingStringBuilderEncoder.java
@@ -16,22 +16,19 @@
  */
 package org.apache.logging.log4j.core.layout;
 
-import org.apache.logging.log4j.core.util.Constants;
-import org.apache.logging.log4j.status.StatusLogger;
-
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CodingErrorAction;
 import java.util.Objects;
 
+import org.apache.logging.log4j.core.util.Constants;
+
 /**
  * Encoder for StringBuilders that locks on the ByteBufferDestination.
  */
 public class LockingStringBuilderEncoder implements Encoder<StringBuilder> {
 
-    private static final StatusLogger LOGGER = StatusLogger.getLogger();
-
     private final Charset charset;
     private final CharsetEncoder charsetEncoder;
     private final CharBuffer cachedCharBuffer;
@@ -60,9 +57,7 @@ public class LockingStringBuilderEncoder implements 
Encoder<StringBuilder> {
                     destination);
             }
         } catch (final Exception error) {
-            LOGGER.error("Due to `TextEncoderHelper.encodeText()` failure, 
falling back to `String#getBytes(Charset)`", error);
-            byte[] sourceBytes = source.toString().getBytes(charset);
-            destination.writeBytes(sourceBytes, 0, sourceBytes.length);
+            TextEncoderHelper.encodeTextFallback(charset, source, destination, 
error);
         }
 
     }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index a1840c8b01..50f473f1fd 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -38,9 +38,7 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.spi.LoggingSystem;
 import org.apache.logging.log4j.spi.Recycler;
-import org.apache.logging.log4j.spi.RecyclerFactory;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
@@ -106,17 +104,9 @@ public final class PatternLayout extends 
AbstractStringLayout {
      * @param headerPattern header conversion pattern.
      * @param footerPattern footer conversion pattern.
      */
-    private PatternLayout(
-            final Configuration config,
-            final RecyclerFactory recyclerFactory,
-            final RegexReplacement replace,
-            final String eventPattern,
-            final PatternSelector patternSelector,
-            final Charset charset,
-            final boolean alwaysWriteExceptions,
-            final boolean disableAnsi,
-            final boolean noConsoleNoAnsi,
-            final String headerPattern,
+    private PatternLayout(final Configuration config, final RegexReplacement 
replace, final String eventPattern,
+            final PatternSelector patternSelector, final Charset charset, 
final boolean alwaysWriteExceptions,
+            final boolean disableAnsi, final boolean noConsoleNoAnsi, final 
String headerPattern,
             final String footerPattern) {
         super(config, charset,
                 newSerializerBuilder()
@@ -414,9 +404,7 @@ public final class PatternLayout extends 
AbstractStringLayout {
                     PatternSerializer serializer = hasFormattingInfo
                             ? new 
PatternFormatterPatternSerializer(formatters, recycler)
                             : new NoFormatPatternSerializer(formatters, 
recycler);
-                    return replace == null
-                            ? serializer
-                            : new PatternSerializerWithReplacement(serializer, 
replace, recycler);
+                    return replace == null ? serializer : new 
PatternSerializerWithReplacement(serializer, replace, recycler);
                 } catch (final RuntimeException ex) {
                     throw new IllegalArgumentException("Cannot parse pattern 
'" + pattern + "'", ex);
                 }
@@ -570,9 +558,6 @@ public final class PatternLayout extends 
AbstractStringLayout {
         @PluginConfiguration
         private Configuration configuration;
 
-        @PluginBuilderAttribute
-        private RecyclerFactory recyclerFactory;
-
         @PluginElement("Replace")
         private RegexReplacement regexReplacement;
 
@@ -596,7 +581,6 @@ public final class PatternLayout extends 
AbstractStringLayout {
         private String footer;
 
         private Builder() {
-            setCharset(Charset.defaultCharset());   // LOG4J2-783 Default 
should not be UTF-8
         }
 
         private boolean useAnsiEscapeCodes() {
@@ -633,14 +617,6 @@ public final class PatternLayout extends 
AbstractStringLayout {
             return this;
         }
 
-        /**
-         * @param recyclerFactory a recycler factory
-         */
-        public Builder setRecyclerFactory(final RecyclerFactory 
recyclerFactory) {
-            this.recyclerFactory = recyclerFactory;
-            return this;
-        }
-
         /**
          * @param regexReplacement
          *        A Regex replacement
@@ -714,8 +690,7 @@ public final class PatternLayout extends 
AbstractStringLayout {
             if (configuration == null) {
                 configuration = new DefaultConfiguration();
             }
-            return new PatternLayout(
-                    configuration, recyclerFactory, regexReplacement, pattern, 
patternSelector, charset,
+            return new PatternLayout(configuration, regexReplacement, pattern, 
patternSelector, charset,
                 alwaysWriteExceptions, disableAnsi, noConsoleNoAnsi, header, 
footer);
         }
     }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/StringBuilderEncoder.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/StringBuilderEncoder.java
index 6ddf39112c..308b8584fc 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/StringBuilderEncoder.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/StringBuilderEncoder.java
@@ -25,7 +25,6 @@ import java.util.Objects;
 
 import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.spi.RecyclerFactory;
-import org.apache.logging.log4j.status.StatusLogger;
 
 /**
  * {@link Encoder} for {@link StringBuilder}s.
@@ -36,8 +35,6 @@ import org.apache.logging.log4j.status.StatusLogger;
  */
 public class StringBuilderEncoder implements Encoder<StringBuilder> {
 
-    private static final StatusLogger LOGGER = StatusLogger.getLogger();
-
     private final CharsetEncoder charsetEncoder;
 
     private final CharBuffer charBuffer;
@@ -75,9 +72,7 @@ public class StringBuilderEncoder implements 
Encoder<StringBuilder> {
         try {
             TextEncoderHelper.encodeText(charsetEncoder, charBuffer, 
byteBuffer, source, destination);
         } catch (final Exception error) {
-            LOGGER.error("Due to `TextEncoderHelper.encodeText()` failure, 
falling back to `String#getBytes(Charset)`", error);
-            byte[] sourceBytes = source.toString().getBytes(charset);
-            destination.writeBytes(sourceBytes, 0, sourceBytes.length);
+            TextEncoderHelper.encodeTextFallback(charset, source, destination, 
error);
         } finally {
             charsetEncoder.reset();
             charBuffer.clear();
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/TextEncoderHelper.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/TextEncoderHelper.java
index 2b5d643fb9..77d334362a 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/TextEncoderHelper.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/TextEncoderHelper.java
@@ -23,6 +23,8 @@ import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CoderResult;
 
+import org.apache.logging.log4j.status.StatusLogger;
+
 /**
  * Helper class to encode text to binary data without allocating temporary 
objects.
  *
@@ -33,6 +35,18 @@ public class TextEncoderHelper {
     private TextEncoderHelper() {
     }
 
+    /* for JIT-ergonomics: */ static void encodeTextFallback(
+            final Charset charset,
+            final StringBuilder source,
+            final ByteBufferDestination destination,
+            final Exception error) {
+        StatusLogger
+                .getLogger()
+                .error("`TextEncoderHelper.encodeText()` failure, falling back 
to `String#getBytes(Charset)`", error);
+        final byte[] bytes = source.toString().getBytes(charset);
+        destination.writeBytes(bytes, 0, bytes.length);
+    }
+
     /**
      * Converts the specified text to bytes and writes the resulting bytes to 
the specified destination.
      * Attempts to postpone synchronizing on the destination as long as 
possible to minimize lock contention.
diff --git 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/LogstashIT.java
 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/LogstashIT.java
index 7363a0b9a1..f67690ed6b 100644
--- 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/LogstashIT.java
+++ 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/LogstashIT.java
@@ -45,7 +45,6 @@ import org.apache.logging.log4j.core.layout.GelfLayout;
 import org.apache.logging.log4j.core.util.NetUtils;
 import 
org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.apache.logging.log4j.spi.ThreadLocalRecyclerFactory;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.assertj.core.api.Assertions;
 import org.awaitility.Awaitility;
@@ -124,7 +123,6 @@ class LogstashIT {
             .setConfiguration(CONFIGURATION)
             .setCharset(CHARSET)
             .setEventTemplateUri("classpath:EcsLayout.json")
-            .setRecyclerFactory(ThreadLocalRecyclerFactory.getInstance())
             .setEventTemplateAdditionalFields(
                     new EventTemplateAdditionalField[]{
                             EventTemplateAdditionalField
diff --git 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/ThreadLocalRecyclerNestedLoggingTest.java
 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/ThreadLocalRecyclerNestedLoggingTest.java
index 639fc0887f..8d21b1d6cc 100644
--- 
a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/ThreadLocalRecyclerNestedLoggingTest.java
+++ 
b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/ThreadLocalRecyclerNestedLoggingTest.java
@@ -31,7 +31,7 @@ import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 /**
- * Tests if logging while trying to encode an event causes {@link 
ThreadLocalRecyclerFactory} to incorrectly share buffers and end up overriding 
layout's earlier encoding work.
+ * Tests if logging while trying to encode an event causes {@link 
ThreadLocalRecyclerFactory.ThreadLocalRecycler} to incorrectly share buffers 
and end up overriding layout's earlier encoding work.
  *
  * @see <a 
href="https://issues.apache.org/jira/browse/LOG4J2-2368";>LOG4J2-2368</a>
  */
diff --git 
a/log4j-mongodb4/src/main/java/org/apache/logging/log4j/mongodb4/MongoDb4Provider.java
 
b/log4j-mongodb4/src/main/java/org/apache/logging/log4j/mongodb4/MongoDb4Provider.java
index 21dfe30eab..3268b874de 100644
--- 
a/log4j-mongodb4/src/main/java/org/apache/logging/log4j/mongodb4/MongoDb4Provider.java
+++ 
b/log4j-mongodb4/src/main/java/org/apache/logging/log4j/mongodb4/MongoDb4Provider.java
@@ -16,11 +16,6 @@
  */
 package org.apache.logging.log4j.mongodb4;
 
-import com.mongodb.ConnectionString;
-import com.mongodb.MongoClientSettings;
-import com.mongodb.client.MongoClient;
-import com.mongodb.client.MongoClients;
-import com.mongodb.client.MongoDatabase;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
@@ -33,6 +28,12 @@ import org.apache.logging.log4j.status.StatusLogger;
 import org.bson.codecs.configuration.CodecRegistries;
 import org.bson.codecs.configuration.CodecRegistry;
 
+import com.mongodb.ConnectionString;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoDatabase;
+
 /**
  * The MongoDB implementation of {@link NoSqlProvider} using the MongoDB driver
  * version 4 API.
@@ -59,6 +60,11 @@ public final class MongoDb4Provider implements 
NoSqlProvider<MongoDb4Connection>
             return new MongoDb4Provider(connection, capped, collectionSize);
         }
 
+        public B setConnectionStringSource(final String connection) {
+            this.connection = connection;
+            return asBuilder();
+        }
+
         public B setCapped(final boolean isCapped) {
             this.capped = isCapped;
             return asBuilder();
diff --git 
a/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkState.java
 
b/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkState.java
index 4a8c21517f..616c9a1353 100644
--- 
a/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkState.java
+++ 
b/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkState.java
@@ -30,7 +30,6 @@ import org.apache.logging.log4j.core.util.KeyValuePair;
 import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.jackson.json.layout.JsonLayout;
 import 
org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField;
-import org.apache.logging.log4j.spi.ThreadLocalRecyclerFactory;
 import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.State;
 
@@ -86,7 +85,6 @@ public class JsonTemplateLayoutBenchmarkState {
                 .setConfiguration(CONFIGURATION)
                 .setCharset(CHARSET)
                 .setEventTemplateUri("classpath:JsonLayout.json")
-                .setRecyclerFactory(ThreadLocalRecyclerFactory.getInstance())
                 .build();
     }
 
@@ -104,7 +102,6 @@ public class JsonTemplateLayoutBenchmarkState {
                 .setConfiguration(CONFIGURATION)
                 .setCharset(CHARSET)
                 .setEventTemplateUri("classpath:EcsLayout.json")
-                .setRecyclerFactory(ThreadLocalRecyclerFactory.getInstance())
                 .setEventTemplateAdditionalFields(additionalFields)
                 .build();
     }
@@ -115,7 +112,6 @@ public class JsonTemplateLayoutBenchmarkState {
                 .setConfiguration(CONFIGURATION)
                 .setCharset(CHARSET)
                 .setEventTemplateUri("classpath:GelfLayout.json")
-                .setRecyclerFactory(ThreadLocalRecyclerFactory.getInstance())
                 .setEventTemplateAdditionalFields(
                         new EventTemplateAdditionalField[]{
                                 // Adding "host" as a constant rather than 
using
diff --git a/src/changelog/.2.x.x/1232_log4j-to-sfl4j-2-OSGiMetadata.xml 
b/src/changelog/.2.x.x/1232_log4j-to-sfl4j-2-OSGiMetadata.xml
deleted file mode 100644
index b166412c83..0000000000
--- a/src/changelog/.2.x.x/1232_log4j-to-sfl4j-2-OSGiMetadata.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
--->
-<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.0.xsd";
-       type="fixed">
-  <issue id="1232" 
link="https://github.com/apache/logging-log4j2/issues/1232"/>
-  <author id="hanneswell"/>
-  <author name="Hannes Wellmann"/>
-  <description format="asciidoc">
-    Adapt the OSGi metadata of log4j-to-slf4j to work with slf4j 1 and 2.
-    To achieve that use a version range of `[1.7,3)` for the imported slf4j 
packages.  
-  </description>
-</entry>
diff --git a/src/changelog/.2.x.x/1366_fix_java_sql_date.xml 
b/src/changelog/.2.x.x/1366_fix_java_sql_date.xml
deleted file mode 100644
index 8a28a5bd2e..0000000000
--- a/src/changelog/.2.x.x/1366_fix_java_sql_date.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   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.
--->
-<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="fixed">
-  <issue id="1366" link="https://github.com/apache/logging-log4j2/pull/1366"/>
-  <author id="Hikarikun92"/>
-  <author name="Lucas Souza"/>
-  <description format="asciidoc">
-    Fixed logging of java.sql.Date objects by appending it before Log4J tries 
to call java.util.Date.toInstant() on it.
-  </description>
-</entry>


Reply via email to