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

pkarwasz pushed a commit to branch fix/rebase-on-log4j-api-2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 00ac582ecf8363150dcd94a1e1f38209c5f1371c
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Fri Mar 15 12:32:22 2024 +0100

    Adapt `log4j-core` to Log4j API 2.x
---
 .../org/apache/logging/log4j/util/NameUtil.java    | 76 ----------------------
 .../log4j/async/logger/AsyncThreadContextTest.java |  3 +-
 .../logging/log4j/core/test/TestConstants.java     |  2 +
 .../test/junit/AbstractExternalFileCleaner.java    |  2 +-
 .../logging/log4j/core}/test/junit/CleanFiles.java |  2 +-
 .../log4j/core}/test/junit/CleanFolders.java       |  2 +-
 .../log4j/core/test/junit/LoggerContextRule.java   |  2 -
 .../log4j/core/test/layout/Log4j2_1482_Test.java   |  2 +-
 .../org/apache/logging/log4j/core/LoggerTest.java  | 22 ++++---
 .../core/appender/OutputStreamManagerTest.java     |  3 +
 .../RollingAppenderDirectWriteStartupSizeTest.java |  2 +-
 .../RollingFileAppenderInterruptedThreadTest.java  |  2 +-
 .../rolling/action/AbstractActionTest.java         |  7 +-
 .../async/AsyncQueueFullPolicyFactoryTest.java     |  3 -
 .../log4j/core/config/LoggersPluginTest.java       |  5 +-
 .../ValidatingPluginWithFailoverTest.java          | 24 ++-----
 ...taFactoryPropertySetMissingConstructorTest.java | 10 +--
 .../log4j/core/impl/ContextDataFactoryTest.java    |  6 +-
 .../core/impl/ThreadContextDataInjectorTest.java   | 28 +++++---
 .../selector/ClassLoaderContextSelectorTest.java   |  2 +-
 .../log4j/core/tools/GenerateCustomLoggerTest.java |  4 +-
 .../core/tools/GenerateExtendedLoggerTest.java     |  4 +-
 .../logging/log4j/core/util/WatchHttpTest.java     |  5 +-
 .../logging/log4j/core/util/WatchManagerTest.java  |  7 +-
 .../apache/logging/log4j/core/LoggerContext.java   | 14 ++--
 .../core/appender/MemoryMappedFileManager.java     |  2 +-
 .../log4j/core/config/AbstractConfiguration.java   | 28 ++++++--
 .../log4j/core/config/json/JsonConfiguration.java  |  2 +-
 .../core/filter/MutableThreadContextMapFilter.java |  2 +-
 .../log4j/core/impl/Log4jContextFactory.java       | 11 +---
 .../impl/Log4jInstanceFactoryPostProcessor.java    | 48 ++++++++------
 .../logging/log4j/core/impl/Log4jProvider.java     | 23 ++++---
 .../log4j/core/impl/ThreadContextDataInjector.java | 12 ++--
 .../logging/log4j/core/util/WatchManager.java      |  9 ++-
 .../apache/logging/log4j/kit/json}/JsonReader.java |  2 +-
 .../logging/log4j/kit/json/package-info.java       | 22 +++++++
 .../logging/log4j/kit/json}/JsonReaderTest.java    |  3 +-
 37 files changed, 195 insertions(+), 208 deletions(-)

diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java 
b/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
deleted file mode 100644
index dd1cdac713..0000000000
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.util;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.nio.charset.Charset;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Objects;
-
-/**
- *
- */
-@InternalApi
-public final class NameUtil {
-
-    private NameUtil() {}
-
-    public static String getSubName(final String name) {
-        if (Strings.isEmpty(name)) {
-            return null;
-        }
-        final int i = name.lastIndexOf('.');
-        return i > 0 ? name.substring(0, i) : Strings.EMPTY;
-    }
-
-    /**
-     * Calculates the <a href="https://en.wikipedia.org/wiki/MD5";>MD5</a> hash
-     * of the given input string encoded using the default platform
-     * {@link Charset charset}.
-     * <p>
-     * <b>MD5 has severe vulnerabilities and should not be used for sharing any
-     * sensitive information.</b> This function should only be used to create
-     * unique identifiers, e.g., configuration element names.
-     *
-     * @param input string to be hashed
-     * @return string composed of 32 hexadecimal digits of the calculated hash
-     */
-    @SuppressFBWarnings(value = "WEAK_MESSAGE_DIGEST_MD5", justification = 
"Used to create unique identifiers.")
-    @Deprecated
-    public static String md5(final String input) {
-        Objects.requireNonNull(input, "input");
-        try {
-            final byte[] inputBytes = input.getBytes();
-            final MessageDigest digest = MessageDigest.getInstance("MD5");
-            final byte[] bytes = digest.digest(inputBytes);
-            final StringBuilder md5 = new StringBuilder(bytes.length * 2);
-            for (final byte b : bytes) {
-                md5.append(Character.forDigit((0xFF & b) >> 4, 16));
-                md5.append(Character.forDigit(0x0F & b, 16));
-            }
-            return md5.toString();
-        }
-        // Every implementation of the Java platform is required to support 
MD5.
-        // Hence, this catch block should be unreachable.
-        // See 
https://docs.oracle.com/javase/8/docs/api/java/security/MessageDigest.html
-        // for details.
-        catch (final NoSuchAlgorithmException error) {
-            throw new RuntimeException(error);
-        }
-    }
-}
diff --git 
a/log4j-async-logger/src/test/java/org/apache/logging/log4j/async/logger/AsyncThreadContextTest.java
 
b/log4j-async-logger/src/test/java/org/apache/logging/log4j/async/logger/AsyncThreadContextTest.java
index 2cac0e572d..0f11917358 100644
--- 
a/log4j-async-logger/src/test/java/org/apache/logging/log4j/async/logger/AsyncThreadContextTest.java
+++ 
b/log4j-async-logger/src/test/java/org/apache/logging/log4j/async/logger/AsyncThreadContextTest.java
@@ -37,7 +37,6 @@ import org.apache.logging.log4j.core.selector.ContextSelector;
 import org.apache.logging.log4j.core.test.CoreLoggerContexts;
 import org.apache.logging.log4j.core.test.TestConstants;
 import org.apache.logging.log4j.plugins.di.DI;
-import org.apache.logging.log4j.spi.LoggingSystem;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.test.TestProperties;
 import org.apache.logging.log4j.test.junit.InitializesThreadContext;
@@ -89,13 +88,13 @@ public class AsyncThreadContextTest {
         void init() {
             final String PACKAGE = "org.apache.logging.log4j.spi.";
             
TestConstants.setSystemProperty(TestConstants.THREAD_CONTEXT_MAP_CLASS, PACKAGE 
+ implClassSimpleName());
-            LoggingSystem.reset();
             ThreadContextTestAccess.init();
         }
 
         public String implClassSimpleName() {
             switch (this) {
                 case WEBAPP:
+                    return "DefaultThreadContextMap";
                 case GARBAGE_FREE:
                     return "GarbageFreeSortedArrayThreadContextMap";
                 case COPY_ON_WRITE:
diff --git 
a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/TestConstants.java
 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/TestConstants.java
index de24029071..8ca8c4421f 100644
--- 
a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/TestConstants.java
+++ 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/TestConstants.java
@@ -85,6 +85,8 @@ public final class TestConstants {
 
     private static final String LOGGER_CONTEXT = "log4j.LoggerContext.";
 
+    public static final String LOGGER_CONTEXT_FACTORY = LOGGER_CONTEXT + 
"factory";
+
     public static final String LOGGER_CONTEXT_LOG_EVENT_FACTORY = 
LOGGER_CONTEXT + "logEventFactory";
 
     public static final String LOGGER_CONTEXT_SELECTOR = LOGGER_CONTEXT + 
"selector";
diff --git 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/AbstractExternalFileCleaner.java
 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AbstractExternalFileCleaner.java
similarity index 99%
rename from 
log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/AbstractExternalFileCleaner.java
rename to 
log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AbstractExternalFileCleaner.java
index 79c8c95716..afac8b941b 100644
--- 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/AbstractExternalFileCleaner.java
+++ 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AbstractExternalFileCleaner.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.logging.log4j.test.junit;
+package org.apache.logging.log4j.core.test.junit;
 
 import java.io.File;
 import java.io.IOException;
diff --git 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/CleanFiles.java
 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/CleanFiles.java
similarity index 97%
rename from 
log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/CleanFiles.java
rename to 
log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/CleanFiles.java
index 67904e36c2..1a263e12a9 100644
--- 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/CleanFiles.java
+++ 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/CleanFiles.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.logging.log4j.test.junit;
+package org.apache.logging.log4j.core.test.junit;
 
 import java.io.File;
 import java.io.IOException;
diff --git 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/CleanFolders.java
 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/CleanFolders.java
similarity index 98%
rename from 
log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/CleanFolders.java
rename to 
log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/CleanFolders.java
index c414c7eaec..40cb9c61ac 100644
--- 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/CleanFolders.java
+++ 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/CleanFolders.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.logging.log4j.test.junit;
+package org.apache.logging.log4j.core.test.junit;
 
 import java.io.File;
 import java.io.IOException;
diff --git 
a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextRule.java
 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextRule.java
index 58c40c0f05..910dbacd40 100644
--- 
a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextRule.java
+++ 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextRule.java
@@ -35,8 +35,6 @@ import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory;
 import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.test.junit.CleanFiles;
-import org.apache.logging.log4j.test.junit.CleanFolders;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
diff --git 
a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/layout/Log4j2_1482_Test.java
 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/layout/Log4j2_1482_Test.java
index 084a2b3786..79f8bbd17f 100644
--- 
a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/layout/Log4j2_1482_Test.java
+++ 
b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/layout/Log4j2_1482_Test.java
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.logging.log4j.core.test.categories.Layouts;
-import org.apache.logging.log4j.test.junit.CleanFolders;
+import org.apache.logging.log4j.core.test.junit.CleanFolders;
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LoggerTest.java 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
index e4c5c95dfe..06a393f513 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/LoggerTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -62,17 +63,16 @@ public class LoggerTest {
 
     static final String CONFIG = "log4j-test2.xml";
 
-    private static void checkMessageFactory(final MessageFactory 
messageFactory, final Logger testLogger) {
+    private void checkMessageFactory(final MessageFactory messageFactory, 
final Logger testLogger) {
         if (messageFactory == null) {
-            final org.apache.logging.log4j.Logger newLogger = 
LogManager.getLogger("checkMessageFactory");
-            assertSame(newLogger.getMessageFactory(), 
testLogger.getMessageFactory());
+            assertSame(defaultMessageFactory, testLogger.getMessageFactory());
         } else {
             final MessageFactory actual = testLogger.getMessageFactory();
             assertEquals(messageFactory, actual);
         }
     }
 
-    private static Logger testMessageFactoryMismatch(
+    private Logger testMessageFactoryMismatch(
             final String name, final MessageFactory messageFactory1, final 
MessageFactory messageFactory2) {
         final Logger testLogger1 = (Logger) LogManager.getLogger(name, 
messageFactory1);
         assertNotNull(testLogger1);
@@ -86,6 +86,7 @@ public class LoggerTest {
     org.apache.logging.log4j.Logger logger;
     org.apache.logging.log4j.Logger loggerChild;
     org.apache.logging.log4j.Logger loggerGrandchild;
+    MessageFactory defaultMessageFactory;
     private final ListAppender app;
 
     private final ListAppender host;
@@ -100,6 +101,7 @@ public class LoggerTest {
         logger = context.getLogger("LoggerTest");
         loggerChild = context.getLogger("LoggerTest.child");
         loggerGrandchild = context.getLogger("LoggerTest.child.grand");
+        defaultMessageFactory = 
context.getInstanceFactory().getInstance(MessageFactory.class);
         this.app = app.clear();
         this.host = host.clear();
         this.noThrown = noThrown.clear();
@@ -119,16 +121,20 @@ public class LoggerTest {
 
     @Test
     public void builder() {
+        final int currentLine = 124;
         logger.atDebug().withLocation().log("Hello");
         final Marker marker = MarkerManager.getMarker("test");
         logger.atError().withMarker(marker).log("Hello {}", "John");
         logger.atWarn().withThrowable(new Throwable("This is a 
test")).log((Message) new SimpleMessage("Log4j rocks!"));
         final List<LogEvent> events = app.getEvents();
         assertEventCount(events, 3);
-        assertEquals(
-                
"org.apache.logging.log4j.core.LoggerTest.builder(LoggerTest.java:122)",
-                events.get(0).getSource().toString(),
-                "Incorrect location");
+        assertThat(events.get(0).getSource())
+                .extracting(
+                        StackTraceElement::getFileName,
+                        StackTraceElement::getClassName,
+                        StackTraceElement::getMethodName,
+                        StackTraceElement::getLineNumber)
+                .containsExactly("LoggerTest.java", 
LoggerTest.class.getName(), "builder", currentLine + 1);
         assertEquals(Level.DEBUG, events.get(0).getLevel(), "Incorrect Level");
         MatcherAssert.assertThat(
                 "Incorrect message", 
events.get(1).getMessage().getFormattedMessage(), equalTo("Hello John"));
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
index 0e636e486f..2e4a9ccec1 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/OutputStreamManagerTest.java
@@ -29,10 +29,13 @@ import 
org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.status.StatusData;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.junit.jupiter.api.Test;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
 /**
  * OutputStreamManager Tests.
  */
+@SetSystemProperty(key = "log4j2.status.entries", value = "10")
+@SetSystemProperty(key = "log4j2.StatusLogger.level", value = "WARN")
 public class OutputStreamManagerTest {
 
     @Test
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteStartupSizeTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteStartupSizeTest.java
index 40c39ed3f7..92562cf418 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteStartupSizeTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingAppenderDirectWriteStartupSizeTest.java
@@ -20,8 +20,8 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import org.apache.logging.log4j.core.appender.RollingFileAppender;
+import org.apache.logging.log4j.core.test.junit.CleanFolders;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
-import org.apache.logging.log4j.test.junit.CleanFolders;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Rule;
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderInterruptedThreadTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderInterruptedThreadTest.java
index aaabecf8b2..156c85e8f0 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderInterruptedThreadTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/RollingFileAppenderInterruptedThreadTest.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.core.config.Configurator;
 import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
 import 
org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
 import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
-import org.apache.logging.log4j.test.junit.CleanFolders;
+import org.apache.logging.log4j.core.test.junit.CleanFolders;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
index 49147e3805..57ba30d354 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/action/AbstractActionTest.java
@@ -26,11 +26,12 @@ import java.util.List;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.status.StatusData;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.test.junit.StatusLoggerLevel;
 import org.junit.jupiter.api.Test;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
-@StatusLoggerLevel("WARN")
-public class AbstractActionTest {
+@SetSystemProperty(key = "log4j2.status.entries", value = "10")
+@SetSystemProperty(key = "log4j2.StatusLogger.level", value = "WARN")
+class AbstractActionTest {
 
     // Test for LOG4J2-2658
     @Test
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
index e912f22478..3734113937 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
@@ -22,14 +22,11 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.impl.CoreKeys;
-import org.apache.logging.log4j.test.junit.Tags;
-import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests the AsyncQueueFullPolicyFactory class.
  */
-@Tag(Tags.PARALLEL)
 public class AsyncQueueFullPolicyFactoryTest {
 
     private static final CoreKeys.AsyncQueueFullPolicy DEFAULT = 
CoreKeys.AsyncQueueFullPolicy.defaultValue();
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java
index 7d1c270251..a29e84a127 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/LoggersPluginTest.java
@@ -24,13 +24,14 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.status.StatusData;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.test.junit.StatusLoggerLevel;
 import org.junit.jupiter.api.Test;
+import org.junitpioneer.jupiter.SetSystemProperty;
 
 /**
  * Tests LoggersPlugin.
  */
-@StatusLoggerLevel("ERROR")
+@SetSystemProperty(key = "log4j2.status.entries", value = "10")
+@SetSystemProperty(key = "log4j2.StatusLogger.level", value = "WARN")
 @LoggerContextSource("multipleRootLoggersTest.xml")
 public class LoggersPluginTest {
 
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java
index 998505ab98..bed889c196 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/ValidatingPluginWithFailoverTest.java
@@ -18,13 +18,6 @@ package 
org.apache.logging.log4j.core.config.plugins.validation.validators;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Core;
@@ -39,14 +32,14 @@ import 
org.apache.logging.log4j.plugins.di.ConfigurableInstanceFactory;
 import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
 import org.apache.logging.log4j.plugins.model.PluginType;
-import org.apache.logging.log4j.status.StatusData;
-import org.apache.logging.log4j.status.StatusListener;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.test.junit.StatusLoggerLevel;
+import org.apache.logging.log4j.test.ListStatusListener;
+import org.apache.logging.log4j.test.junit.UsingStatusListener;
+import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-@StatusLoggerLevel("OFF")
+@UsingStatusListener
 public class ValidatingPluginWithFailoverTest {
 
     private final ConfigurableInstanceFactory instanceFactory = 
DI.createInitializedFactory();
@@ -73,18 +66,13 @@ public class ValidatingPluginWithFailoverTest {
     }
 
     @Test
-    public void testDoesNotLog_NoParameterThatMatchesElement_message() {
-        final StatusListener listener = mock(StatusListener.class);
-        when(listener.getStatusLevel()).thenReturn(Level.WARN);
+    public void testDoesNotLog_NoParameterThatMatchesElement_message(final 
ListStatusListener listener) {
         instanceFactory.registerBinding(Configuration.KEY, 
NullConfiguration::new);
         final StatusLogger logger = StatusLogger.getLogger();
         logger.trace("Initializing");
-        logger.registerListener(listener);
         final FailoverAppender failoverAppender = 
processor.processNodeTree(node);
 
-        verify(listener, times(1)).getStatusLevel();
-        verify(listener, never()).log(any(StatusData.class));
-        verifyNoMoreInteractions(listener);
+        Assertions.assertThat(listener.findStatusData(Level.WARN)).isEmpty();
         assertNotNull(failoverAppender);
         assertEquals("Failover", failoverAppender.getName());
     }
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
index 3d49d7e37a..b7db1ba4e9 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryPropertySetMissingConstructorTest.java
@@ -16,8 +16,9 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static 
org.apache.logging.log4j.plugins.util.ReflectionUtil.getFieldValue;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 
 import org.apache.logging.log4j.core.test.TestConstants;
 import org.apache.logging.log4j.test.junit.SetTestProperty;
@@ -34,8 +35,9 @@ public class 
ContextDataFactoryPropertySetMissingConstructorTest {
 
     @Test
     public void 
intArgReturnsSortedArrayStringMapIfPropertySpecifiedButMissingIntConstructor() 
throws Exception {
-        assertTrue(ContextDataFactory.createContextData(2) instanceof 
SortedArrayStringMap);
+        assertInstanceOf(SortedArrayStringMap.class, 
ContextDataFactory.createContextData(2));
         final SortedArrayStringMap actual = (SortedArrayStringMap) 
ContextDataFactory.createContextData(2);
-        assertEquals(2, actual.getThreshold());
+        
assertThat(getFieldValue(SortedArrayStringMap.class.getDeclaredField("threshold"),
 actual))
+                .isEqualTo(2);
     }
 }
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
index 9c365c1efd..633796ede1 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ContextDataFactoryTest.java
@@ -16,7 +16,8 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static 
org.apache.logging.log4j.plugins.util.ReflectionUtil.getFieldValue;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.logging.log4j.util.SortedArrayStringMap;
@@ -39,6 +40,7 @@ public class ContextDataFactoryTest {
     @Test
     public void intArgSetsCapacityIfNoPropertySpecified() throws Exception {
         final SortedArrayStringMap actual = (SortedArrayStringMap) 
ContextDataFactory.createContextData(2);
-        assertEquals(2, actual.getThreshold());
+        
assertThat(getFieldValue(SortedArrayStringMap.class.getDeclaredField("threshold"),
 actual))
+                .isEqualTo(2);
     }
 }
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
index 7ea70a4614..ee0a5a79e5 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
@@ -31,13 +31,17 @@ import static 
org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.lang.reflect.Constructor;
+import java.util.Properties;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Function;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.ContextDataInjector;
-import org.apache.logging.log4j.spi.LoggingSystem;
+import org.apache.logging.log4j.core.ThreadContextTestAccess;
+import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMap;
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.ProviderUtil;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
 import org.junit.After;
@@ -122,9 +126,11 @@ public class ThreadContextDataInjectorTest {
     }
 
     private void prepareThreadContext(final boolean 
isThreadContextMapInheritable) {
-        LoggingSystem.getProvider()
-                
.setThreadContextMapFactory(threadContextMapConstructor.apply(isThreadContextMapInheritable));
-        ThreadContext.init();
+        ((Log4jProvider) ProviderUtil.getProvider())
+                .instanceFactory.registerBinding(
+                        Key.forClass(ThreadContextMap.class),
+                        () -> 
threadContextMapConstructor.apply(isThreadContextMapInheritable));
+        ThreadContextTestAccess.init();
         ThreadContext.remove("baz");
         ThreadContext.put("foo", "bar");
     }
@@ -149,22 +155,24 @@ public class ThreadContextDataInjectorTest {
         final Try<Class<?>> loadedClass = 
ReflectionSupport.tryToLoadClass(THREAD_LOCAL_MAP_CLASS_NAME);
         final Class<? extends ThreadContextMap> mapClass =
                 
assertDoesNotThrow(loadedClass::get).asSubclass(ThreadContextMap.class);
-        return newInstanceWithCapacityArg(mapClass, inheritable);
+        return newInstanceWithPropertiesUtilArg(mapClass, inheritable);
     }
 
     private static ThreadContextMap createGarbageFreeMap(final boolean 
inheritable) {
         final Try<Class<?>> loadedClass = 
ReflectionSupport.tryToLoadClass(GARBAGE_FREE_MAP_CLASS_NAME);
         final Class<? extends ThreadContextMap> mapClass =
                 
assertDoesNotThrow(loadedClass::get).asSubclass(ThreadContextMap.class);
-        return newInstanceWithCapacityArg(mapClass, inheritable);
+        return newInstanceWithPropertiesUtilArg(mapClass, inheritable);
     }
 
-    private static ThreadContextMap newInstanceWithCapacityArg(
+    private static ThreadContextMap newInstanceWithPropertiesUtilArg(
             final Class<? extends ThreadContextMap> mapClass, final boolean 
inheritable) {
         final Constructor<? extends ThreadContextMap> constructor =
-                assertDoesNotThrow(() -> 
mapClass.getDeclaredConstructor(Boolean.TYPE, Integer.TYPE));
+                assertDoesNotThrow(() -> 
mapClass.getDeclaredConstructor(PropertiesUtil.class));
         assertTrue(constructor.trySetAccessible(), () -> "Unable to access 
constructor for " + mapClass);
-        return assertDoesNotThrow(
-                () -> constructor.newInstance(inheritable, 
LoggingSystem.THREAD_CONTEXT_DEFAULT_INITIAL_CAPACITY));
+        final Properties properties = new Properties();
+        properties.setProperty("log4j2.isThreadContextMapInheritable", 
Boolean.toString(inheritable));
+        final PropertiesUtil propertiesUtil = new PropertiesUtil(properties);
+        return assertDoesNotThrow(() -> 
constructor.newInstance(propertiesUtil));
     }
 }
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java
index 00b013af94..1d31f1f197 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelectorTest.java
@@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertNotSame;
 
 import java.lang.reflect.Field;
 import org.apache.logging.log4j.core.Logger;
-import org.apache.logging.log4j.util.ReflectionUtil;
+import org.apache.logging.log4j.plugins.util.ReflectionUtil;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateCustomLoggerTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateCustomLoggerTest.java
index e3343a1ea5..5932d113fa 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateCustomLoggerTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateCustomLoggerTest.java
@@ -38,9 +38,9 @@ import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.test.TestConstants;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.MessageFactory;
-import org.apache.logging.log4j.spi.LoggingSystemProperty;
 import org.apache.logging.log4j.test.TestLogger;
 import org.apache.logging.log4j.util.MessageSupplier;
 import org.apache.logging.log4j.util.Strings;
@@ -52,7 +52,7 @@ import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("functional")
 @SetSystemProperty(
-        key = LoggingSystemProperty.Constant.LOGGER_CONTEXT_FACTORY_CLASS,
+        key = TestConstants.LOGGER_CONTEXT_FACTORY,
         value = "org.apache.logging.log4j.test.TestLoggerContextFactory")
 public class GenerateCustomLoggerTest {
 
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateExtendedLoggerTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateExtendedLoggerTest.java
index 35f746d38e..cb8f49afbf 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateExtendedLoggerTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/tools/GenerateExtendedLoggerTest.java
@@ -38,10 +38,10 @@ import javax.tools.StandardJavaFileManager;
 import javax.tools.ToolProvider;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.test.TestConstants;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.MessageFactory;
 import org.apache.logging.log4j.spi.ExtendedLogger;
-import org.apache.logging.log4j.spi.LoggingSystemProperty;
 import org.apache.logging.log4j.test.TestLogger;
 import org.apache.logging.log4j.util.MessageSupplier;
 import org.apache.logging.log4j.util.Strings;
@@ -53,7 +53,7 @@ import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("functional")
 @SetSystemProperty(
-        key = LoggingSystemProperty.Constant.LOGGER_CONTEXT_FACTORY_CLASS,
+        key = TestConstants.LOGGER_CONTEXT_FACTORY,
         value = "org.apache.logging.log4j.test.TestLoggerContextFactory")
 public class GenerateExtendedLoggerTest {
 
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java
index c8785c6be7..7e5057a113 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java
@@ -44,6 +44,7 @@ import org.apache.logging.log4j.core.config.HttpWatcher;
 import org.apache.logging.log4j.core.config.Reconfigurable;
 import org.apache.logging.log4j.core.test.TestConstants;
 import org.apache.logging.log4j.core.util.datetime.FastDateFormat;
+import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.test.junit.SetTestProperty;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.junit.jupiter.api.Test;
@@ -84,7 +85,7 @@ public class WatchHttpTest {
                         .withHeader("Content-Type", XML)));
         final ConfigurationScheduler scheduler = new ConfigurationScheduler();
         scheduler.incrementScheduledItems();
-        final WatchManager watchManager = new WatchManager(scheduler);
+        final WatchManager watchManager = new WatchManager(scheduler, 
StatusLogger.getLogger());
         watchManager.setIntervalSeconds(1);
         scheduler.start();
         watchManager.start();
@@ -123,7 +124,7 @@ public class WatchHttpTest {
                         .withHeader("Content-Type", XML)));
         final ConfigurationScheduler scheduler = new ConfigurationScheduler();
         scheduler.incrementScheduledItems();
-        final WatchManager watchManager = new WatchManager(scheduler);
+        final WatchManager watchManager = new WatchManager(scheduler, 
StatusLogger.getLogger());
         watchManager.setIntervalSeconds(1);
         scheduler.start();
         watchManager.start();
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchManagerTest.java
 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchManagerTest.java
index 28c2501a60..318252f771 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchManagerTest.java
+++ 
b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchManagerTest.java
@@ -30,6 +30,7 @@ import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import org.apache.logging.log4j.core.config.ConfigurationScheduler;
+import org.apache.logging.log4j.status.StatusLogger;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledOnOs;
@@ -52,7 +53,7 @@ public class WatchManagerTest {
     public void testWatchManager() throws Exception {
         final ConfigurationScheduler scheduler = new ConfigurationScheduler();
         scheduler.incrementScheduledItems();
-        final WatchManager watchManager = new WatchManager(scheduler);
+        final WatchManager watchManager = new WatchManager(scheduler, 
StatusLogger.getLogger());
         watchManager.setIntervalSeconds(1);
         scheduler.start();
         watchManager.start();
@@ -82,7 +83,7 @@ public class WatchManagerTest {
     public void testWatchManagerReset() throws Exception {
         final ConfigurationScheduler scheduler = new ConfigurationScheduler();
         scheduler.incrementScheduledItems();
-        final WatchManager watchManager = new WatchManager(scheduler);
+        final WatchManager watchManager = new WatchManager(scheduler, 
StatusLogger.getLogger());
         watchManager.setIntervalSeconds(1);
         scheduler.start();
         watchManager.start();
@@ -115,7 +116,7 @@ public class WatchManagerTest {
     public void testWatchManagerResetFile() throws Exception {
         final ConfigurationScheduler scheduler = new ConfigurationScheduler();
         scheduler.incrementScheduledItems();
-        final WatchManager watchManager = new WatchManager(scheduler);
+        final WatchManager watchManager = new WatchManager(scheduler, 
StatusLogger.getLogger());
         watchManager.setIntervalSeconds(1);
         scheduler.start();
         watchManager.start();
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
index 8e558f42d7..5fa8b5a4f0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
@@ -65,7 +65,6 @@ import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.spi.LoggerContextShutdownAware;
 import org.apache.logging.log4j.spi.LoggerContextShutdownEnabled;
 import org.apache.logging.log4j.spi.LoggerRegistry;
-import org.apache.logging.log4j.spi.LoggingSystem;
 import org.apache.logging.log4j.spi.Terminable;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
@@ -91,7 +90,7 @@ public class LoggerContext extends AbstractLifeCycle
 
     private final Collection<Consumer<Configuration>> 
configurationStartedListeners = new ArrayList<>();
     private final Collection<Consumer<Configuration>> 
configurationStoppedListeners = new ArrayList<>();
-    private final Lazy<List<LoggerContextShutdownAware>> listeners = 
Lazy.relaxed(CopyOnWriteArrayList::new);
+    private final Lazy<List<LoggerContextShutdownAware>> listeners = 
Lazy.lazy(CopyOnWriteArrayList::new);
     private final ConfigurableInstanceFactory instanceFactory;
     private final PropertyEnvironment environment;
     private final ConfigurationScheduler configurationScheduler;
@@ -128,8 +127,11 @@ public class LoggerContext extends AbstractLifeCycle
         this.instanceFactory = Objects.requireNonNull(instanceFactory);
         this.instanceFactory.registerBinding(KEY, Lazy.weak(this));
         // Post-process the factory, after registering itself
-        ServiceLoaderUtil.safeStream(ServiceLoader.load(
-                        ConfigurableInstanceFactoryPostProcessor.class, 
LoggerContext.class.getClassLoader()))
+        ServiceLoaderUtil.safeStream(
+                        ConfigurableInstanceFactoryPostProcessor.class,
+                        ServiceLoader.load(
+                                
ConfigurableInstanceFactoryPostProcessor.class, 
LoggerContext.class.getClassLoader()),
+                        LOGGER)
                 .sorted(Comparator.comparing(
                         ConfigurableInstanceFactoryPostProcessor::getClass, 
OrderedComparator.INSTANCE))
                 .forEachOrdered(processor -> 
processor.postProcessFactory(instanceFactory));
@@ -178,7 +180,7 @@ public class LoggerContext extends AbstractLifeCycle
     /**
      * Checks that the message factory a logger was created with is the same 
as the given messageFactory. If they are
      * different log a warning to the {@linkplain StatusLogger}. A null 
MessageFactory translates to the default
-     * MessageFactory {@link LoggingSystem#getMessageFactory()}.
+     * MessageFactory.
      *
      * @param logger The logger to check
      * @param messageFactory The message factory to check.
@@ -359,7 +361,7 @@ public class LoggerContext extends AbstractLifeCycle
 
     private void setUpShutdownHook() {
         if (shutdownCallback == null) {
-            final LoggerContextFactory factory = LogManager.getFactory();
+            final LoggerContextFactory factory = 
instanceFactory.getInstance(LoggerContextFactory.class);
             if (factory instanceof ShutdownCallbackRegistry) {
                 LOGGER.debug(SHUTDOWN_HOOK_MARKER, "Shutdown hook enabled. 
Registering a new one.");
                 // LOG4J2-1642 preload ExecutorServices as it is used in 
shutdown hook
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
index cc6bc34b20..4778e90b34 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
@@ -36,7 +36,7 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.util.Closer;
 import org.apache.logging.log4j.core.util.FileUtils;
-import org.apache.logging.log4j.util.ReflectionUtil;
+import org.apache.logging.log4j.plugins.util.ReflectionUtil;
 
 // Lines too long...
 // CHECKSTYLE:OFF
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index a7662178f1..be7777bc5b 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -82,7 +82,6 @@ import org.apache.logging.log4j.plugins.model.PluginType;
 import org.apache.logging.log4j.plugins.util.OrderedComparator;
 import org.apache.logging.log4j.util.Cast;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.NameUtil;
 import org.apache.logging.log4j.util.ServiceLoaderUtil;
 import org.apache.logging.log4j.util.Strings;
 import org.jspecify.annotations.NullMarked;
@@ -188,12 +187,16 @@ public abstract class AbstractConfiguration extends 
AbstractFilterable implement
         this.configurationScheduler = 
parentInstanceFactory.getInstance(ConfigurationScheduler.class);
         this.environment = environment;
         this.instanceFactory = parentInstanceFactory.newChildInstanceFactory();
-        this.watchManager = new WatchManager(configurationScheduler);
+        this.watchManager = new WatchManager(configurationScheduler, LOGGER);
 
         configurationProcessor = new ConfigurationProcessor(instanceFactory);
         instanceFactory.registerBinding(Configuration.KEY, Lazy.weak(this));
-        ServiceLoaderUtil.safeStream(ServiceLoader.load(
-                        ConfigurableInstanceFactoryPostProcessor.class, 
AbstractConfiguration.class.getClassLoader()))
+        // Post-process the factory, after registering itself
+        ServiceLoaderUtil.safeStream(
+                        ConfigurableInstanceFactoryPostProcessor.class,
+                        ServiceLoader.load(
+                                
ConfigurableInstanceFactoryPostProcessor.class, 
LoggerContext.class.getClassLoader()),
+                        LOGGER)
                 .sorted(Comparator.comparing(
                         ConfigurableInstanceFactoryPostProcessor::getClass, 
OrderedComparator.INSTANCE))
                 .forEachOrdered(processor -> 
processor.postProcessFactory(instanceFactory));
@@ -298,8 +301,11 @@ public abstract class AbstractConfiguration extends 
AbstractFilterable implement
 
     private void initializeScriptManager() {
         try {
-            ServiceLoaderUtil.safeStream(ServiceLoader.load(
-                            ScriptManagerFactory.class, 
AbstractConfiguration.class.getClassLoader()))
+            ServiceLoaderUtil.safeStream(
+                            ScriptManagerFactory.class,
+                            ServiceLoader.load(
+                                    ScriptManagerFactory.class, 
AbstractConfiguration.class.getClassLoader()),
+                            LOGGER)
                     .findFirst()
                     .ifPresent(factory -> 
setScriptManager(factory.createScriptManager(this, getWatchManager())));
         } catch (final LinkageError | Exception e) {
@@ -1037,7 +1043,7 @@ public abstract class AbstractConfiguration extends 
AbstractFilterable implement
             return loggerConfig;
         }
         String substr = loggerName;
-        while ((substr = NameUtil.getSubName(substr)) != null) {
+        while ((substr = getSubName(substr)) != null) {
             loggerConfig = loggerConfigs.get(substr);
             if (loggerConfig != null) {
                 return loggerConfig;
@@ -1046,6 +1052,14 @@ public abstract class AbstractConfiguration extends 
AbstractFilterable implement
         return root;
     }
 
+    private static @Nullable String getSubName(final String name) {
+        if (Strings.isEmpty(name)) {
+            return null;
+        }
+        final int i = name.lastIndexOf('.');
+        return i > 0 ? name.substring(0, i) : Strings.EMPTY;
+    }
+
     @Override
     public LoggerContext getLoggerContext() {
         return loggerContext.get();
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
index 0698962d20..5c39290706 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
@@ -30,10 +30,10 @@ import 
org.apache.logging.log4j.core.config.ConfigurationSource;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.config.Reconfigurable;
 import org.apache.logging.log4j.core.config.status.StatusConfiguration;
+import org.apache.logging.log4j.kit.json.JsonReader;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.model.PluginType;
 import org.apache.logging.log4j.util.Cast;
-import org.apache.logging.log4j.util.JsonReader;
 
 public class JsonConfiguration extends AbstractConfiguration implements 
Reconfigurable {
 
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java
index 1b66b55853..d9d1ea156b 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java
@@ -47,13 +47,13 @@ import 
org.apache.logging.log4j.core.util.internal.HttpInputStreamUtil;
 import org.apache.logging.log4j.core.util.internal.LastModifiedSource;
 import org.apache.logging.log4j.core.util.internal.Status;
 import org.apache.logging.log4j.kit.env.PropertyEnvironment;
+import org.apache.logging.log4j.kit.json.JsonReader;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAliases;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.JsonReader;
 import org.apache.logging.log4j.util.PerformanceSensitive;
 
 /**
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
index eb7387a2ac..2361b6c294 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
@@ -16,8 +16,6 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import static org.apache.logging.log4j.util.Constants.isWebApp;
-
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
@@ -40,6 +38,7 @@ import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.jspecify.annotations.NullMarked;
 
@@ -431,15 +430,9 @@ public class Log4jContextFactory implements 
LoggerContextFactory, ShutdownCallba
     }
 
     public boolean isShutdownHookEnabled() {
-        return !isWebApp()
+        return !Constants.IS_WEB_APP
                 && PropertyEnvironment.getGlobal()
                         .getProperty(CoreKeys.LoggerContext.class)
                         .shutdownHookEnabled();
     }
-
-    @Override
-    public org.apache.logging.log4j.spi.LoggerContext wrapLoggerContext(
-            org.apache.logging.log4j.spi.LoggerContext loggerContext) {
-        return loggerContext;
-    }
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jInstanceFactoryPostProcessor.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jInstanceFactoryPostProcessor.java
index 74c6b95989..163a7387bd 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jInstanceFactoryPostProcessor.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jInstanceFactoryPostProcessor.java
@@ -21,13 +21,10 @@ import static 
org.apache.logging.log4j.plugins.di.Key.forClass;
 import aQute.bnd.annotation.Resolution;
 import aQute.bnd.annotation.spi.ServiceProvider;
 import org.apache.logging.log4j.core.ContextDataInjector;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.config.composite.MergeStrategy;
-import org.apache.logging.log4j.core.impl.CoreKeys.Configuration;
-import org.apache.logging.log4j.core.impl.CoreKeys.Logger;
-import org.apache.logging.log4j.core.impl.CoreKeys.LoggerContext;
-import org.apache.logging.log4j.core.impl.CoreKeys.StatusLogger;
-import org.apache.logging.log4j.core.impl.CoreKeys.ThreadContext;
 import org.apache.logging.log4j.core.selector.ContextSelector;
 import org.apache.logging.log4j.core.time.ClockFactory;
 import org.apache.logging.log4j.core.util.AuthorizationProvider;
@@ -51,32 +48,45 @@ public class Log4jInstanceFactoryPostProcessor implements 
ConfigurableInstanceFa
     @Override
     public void postProcessFactory(final ConfigurableInstanceFactory factory) {
         final PropertyEnvironment env = 
factory.getInstance(PropertyEnvironment.class);
-        registerFromProperties(factory, env);
+        // TODO: replace with an appropriate scoping of the definitions
+        if (factory.hasBinding(Configuration.KEY)) {
+            registerConfigurationServices(factory, env);
+        } else if (factory.hasBinding(LoggerContext.KEY)) {
+            registerLoggerContextSevices(factory, env);
+        } else {
+            registerGlobalServices(factory, env);
+        }
         factory.registerBundles(ClockFactory.class, DefaultBundle.class);
     }
 
-    private void registerFromProperties(final ConfigurableInstanceFactory 
factory, final PropertyEnvironment env) {
-        final Configuration configuration = 
env.getProperty(Configuration.class);
-        registerIfPresent(factory, AuthorizationProvider.class, 
configuration.authorizationProvider());
-        registerIfPresent(factory, ConfigurationFactory.class, 
configuration.configurationFactory());
-        registerIfPresent(factory, MergeStrategy.class, 
configuration.mergeStrategy());
-
-        final Logger logger = env.getProperty(Logger.class);
+    private void registerConfigurationServices(
+            final ConfigurableInstanceFactory factory, final 
PropertyEnvironment env) {
+        final CoreKeys.Logger logger = env.getProperty(CoreKeys.Logger.class);
         registerIfPresent(factory, LogEventFactory.class, 
logger.logEventFactory());
 
-        final LoggerContext loggerContext = 
env.getProperty(LoggerContext.class);
-        registerIfPresent(factory, ContextSelector.class, 
loggerContext.selector());
-        registerIfPresent(factory, ShutdownCallbackRegistry.class, 
loggerContext.shutdownCallbackRegistry());
-
-        final StatusLogger statusLogger = env.getProperty(StatusLogger.class);
+        final CoreKeys.StatusLogger statusLogger = 
env.getProperty(CoreKeys.StatusLogger.class);
         if (statusLogger.defaultStatusLevel() != null) {
             factory.registerBinding(Constants.DEFAULT_STATUS_LEVEL_KEY, 
statusLogger::defaultStatusLevel);
         }
 
-        final ThreadContext threadContext = 
env.getProperty(ThreadContext.class);
+        final CoreKeys.ThreadContext threadContext = 
env.getProperty(CoreKeys.ThreadContext.class);
         registerIfPresent(factory, ContextDataInjector.class, 
threadContext.contextDataInjector());
     }
 
+    private void registerGlobalServices(final ConfigurableInstanceFactory 
factory, final PropertyEnvironment env) {
+        final CoreKeys.LoggerContext loggerContext = 
env.getProperty(CoreKeys.LoggerContext.class);
+        registerIfPresent(factory, ContextSelector.class, 
loggerContext.selector());
+        registerIfPresent(factory, ShutdownCallbackRegistry.class, 
loggerContext.shutdownCallbackRegistry());
+    }
+
+    private void registerLoggerContextSevices(
+            final ConfigurableInstanceFactory factory, final 
PropertyEnvironment env) {
+        final CoreKeys.Configuration configuration = 
env.getProperty(CoreKeys.Configuration.class);
+        registerIfPresent(factory, AuthorizationProvider.class, 
configuration.authorizationProvider());
+        registerIfPresent(factory, ConfigurationFactory.class, 
configuration.configurationFactory());
+        registerIfPresent(factory, MergeStrategy.class, 
configuration.mergeStrategy());
+    }
+
     private <T> void registerIfPresent(
             final ConfigurableInstanceFactory instanceFactory,
             final Class<T> serviceType,
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jProvider.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jProvider.java
index 2ce91a0166..27778e3a55 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jProvider.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jProvider.java
@@ -25,6 +25,8 @@ import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.spi.Provider;
+import org.apache.logging.log4j.spi.ThreadContextMap;
+import org.apache.logging.log4j.util.Constants;
 
 /**
  * Binding for the Log4j API.
@@ -32,7 +34,7 @@ import org.apache.logging.log4j.spi.Provider;
 @ServiceProvider(value = Provider.class, resolution = Resolution.OPTIONAL)
 public class Log4jProvider extends Provider {
 
-    private final ConfigurableInstanceFactory instanceFactory;
+    final ConfigurableInstanceFactory instanceFactory;
 
     public Log4jProvider() {
         this(DI.createInitializedFactory());
@@ -40,10 +42,11 @@ public class Log4jProvider extends Provider {
 
     @Inject
     public Log4jProvider(final ConfigurableInstanceFactory instanceFactory) {
-        super(10, "3.0.0", Log4jContextFactory.class);
+        super(10, CURRENT_VERSION, Log4jContextFactory.class);
         this.instanceFactory = instanceFactory;
         instanceFactory.registerBinding(Key.forClass(Provider.class), () -> 
this);
         instanceFactory.registerBinding(Key.forClass(Log4jProvider.class), () 
-> this);
+        instanceFactory.registerBinding(Key.forClass(ThreadContextMap.class), 
super::getThreadContextMapInstance);
     }
 
     @Override
@@ -56,15 +59,19 @@ public class Log4jProvider extends Provider {
         final PropertyEnvironment environment = 
instanceFactory.getInstance(PropertyEnvironment.class);
         final CoreKeys.ThreadContext threadContext = 
environment.getProperty(CoreKeys.ThreadContext.class);
         if (threadContext.enable() && threadContext.enableMap()) {
-
             if (threadContext.mapClass() != null) {
                 return threadContext.mapClass();
             }
-
-            return threadContext.garbageFree()
-                    ? 
"org.apache.logging.log4j.spi.GarbageFreeSortedArrayThreadContextMap"
-                    : 
"org.apache.logging.log4j.spi.CopyOnWriteSortedArrayThreadContextMap";
+            if (Constants.ENABLE_THREADLOCALS) {
+                return threadContext.garbageFree() ? GARBAGE_FREE_CONTEXT_MAP 
: COPY_ON_WRITE_CONTEXT_MAP;
+            }
+            return WEB_APP_CONTEXT_MAP;
         }
-        return "org.apache.logging.log4j.spi.NoOpThreadContextMap";
+        return NO_OP_CONTEXT_MAP;
+    }
+
+    @Override
+    public ThreadContextMap getThreadContextMapInstance() {
+        return 
instanceFactory.getInstance(Key.forClass(ThreadContextMap.class));
     }
 }
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
index 24d8604bca..7b36d1b762 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
@@ -31,6 +31,7 @@ import org.apache.logging.log4j.core.ContextDataInjector;
 import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.util.ContextDataProvider;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
+import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.ServiceLoaderUtil;
 import org.apache.logging.log4j.util.StringMap;
@@ -64,11 +65,12 @@ public class ThreadContextDataInjector {
         final List<ContextDataProvider> providers = new ArrayList<>();
         final ServiceLoader<ContextDataProvider> serviceLoader =
                 ServiceLoader.load(ContextDataProvider.class, 
ThreadContextDataInjector.class.getClassLoader());
-        ServiceLoaderUtil.safeStream(serviceLoader).forEachOrdered(provider -> 
{
-            if (providers.stream().noneMatch((p) -> 
p.getClass().isAssignableFrom(provider.getClass()))) {
-                providers.add(provider);
-            }
-        });
+        ServiceLoaderUtil.safeStream(ContextDataProvider.class, serviceLoader, 
StatusLogger.getLogger())
+                .forEachOrdered(provider -> {
+                    if (providers.stream().noneMatch((p) -> 
p.getClass().isAssignableFrom(provider.getClass()))) {
+                        providers.add(provider);
+                    }
+                });
         return Collections.unmodifiableList(providers);
     }
 
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java
index 6df54530bd..1798920605 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java
@@ -37,6 +37,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.AbstractLifeCycle;
 import org.apache.logging.log4j.core.config.ConfigurationScheduler;
 import org.apache.logging.log4j.plugins.Inject;
+import org.apache.logging.log4j.plugins.Named;
 import org.apache.logging.log4j.plugins.Singleton;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.ServiceLoaderUtil;
@@ -144,10 +145,14 @@ public class WatchManager extends AbstractLifeCycle {
     private final ConcurrentMap<Source, ConfigurationMonitor> watchers = new 
ConcurrentHashMap<>();
 
     @Inject
-    public WatchManager(final ConfigurationScheduler scheduler) {
+    public WatchManager(
+            final ConfigurationScheduler scheduler,
+            final @Named("StatusLogger") org.apache.logging.log4j.Logger 
statusLogger) {
         this.scheduler = Objects.requireNonNull(scheduler, "scheduler");
         eventServiceList = ServiceLoaderUtil.safeStream(
-                        ServiceLoader.load(WatchEventService.class, 
WatchManager.class.getClassLoader()))
+                        WatchEventService.class,
+                        ServiceLoader.load(WatchEventService.class, 
WatchManager.class.getClassLoader()),
+                        statusLogger)
                 .collect(Collectors.toList());
     }
 
diff --git 
a/log4j-api/src/main/java/org/apache/logging/log4j/util/JsonReader.java 
b/log4j-kit/src/main/java/org/apache/logging/log4j/kit/json/JsonReader.java
similarity index 99%
rename from 
log4j-api/src/main/java/org/apache/logging/log4j/util/JsonReader.java
rename to 
log4j-kit/src/main/java/org/apache/logging/log4j/kit/json/JsonReader.java
index 9d1de4b1df..fe0416dba3 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/JsonReader.java
+++ b/log4j-kit/src/main/java/org/apache/logging/log4j/kit/json/JsonReader.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.kit.json;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
diff --git 
a/log4j-kit/src/main/java/org/apache/logging/log4j/kit/json/package-info.java 
b/log4j-kit/src/main/java/org/apache/logging/log4j/kit/json/package-info.java
new file mode 100644
index 0000000000..c50e64d810
--- /dev/null
+++ 
b/log4j-kit/src/main/java/org/apache/logging/log4j/kit/json/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+@Export
+@Version("3.0.0")
+package org.apache.logging.log4j.kit.json;
+
+import org.osgi.annotation.bundle.Export;
+import org.osgi.annotation.versioning.Version;
diff --git 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/JsonReaderTest.java
 b/log4j-kit/src/test/java/org/apache/logging/log4j/kit/json/JsonReaderTest.java
similarity index 99%
rename from 
log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/JsonReaderTest.java
rename to 
log4j-kit/src/test/java/org/apache/logging/log4j/kit/json/JsonReaderTest.java
index b4bb32ff1a..1e9698c429 100644
--- 
a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/JsonReaderTest.java
+++ 
b/log4j-kit/src/test/java/org/apache/logging/log4j/kit/json/JsonReaderTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.logging.log4j.core.util;
+package org.apache.logging.log4j.kit.json;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -22,7 +22,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import org.apache.logging.log4j.util.JsonReader;
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;

Reply via email to