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>
