You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2024/01/24 19:56:24 UTC

(logging-log4j2) 02/02: Move async logger tests to `log4j-async-logger`

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

pkarwasz pushed a commit to branch move-async
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 0c553cf73cae162baf59562697c35081e6ddca6f
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Tue Jan 23 15:57:47 2024 +0100

    Move async logger tests to `log4j-async-logger`
    
    We move all the tests using `AsyncLogger` and `AsyncLoggerConfig` from
    `log4j-core-test` to a new artifact `log4j-async-logger` in preparation
    for splitting async support out of `log4j-core`.
---
 log4j-async-logger/pom.xml                         | 68 ++++++++++++++++++++++
 .../async/AsyncLoggerClassLoadDeadlockTest.java    | 29 ++++++---
 .../log4j/core/async/AsyncLoggerConfig2Test.java   | 26 +++++----
 .../log4j/core/async/AsyncLoggerConfig3Test.java   | 11 ++--
 .../log4j/core/async/AsyncLoggerConfig4Test.java   |  0
 .../core/async/AsyncLoggerConfigAutoFlushTest.java | 25 ++++----
 .../core/async/AsyncLoggerConfigErrorOnFormat.java | 13 +++--
 .../log4j/core/async/AsyncLoggerConfigTest.java    |  0
 .../AsyncLoggerConfigUseAfterShutdownTest.java     | 22 +++----
 .../AsyncLoggerConfigWithAsyncEnabledTest.java     |  0
 ...AsyncLoggerContextSelectorInitialStateTest.java |  0
 .../core/async/AsyncLoggerContextSelectorTest.java |  0
 .../log4j/core/async/AsyncLoggerContextTest.java   |  0
 .../AsyncLoggerCustomSelectorLocationTest.java     | 34 ++++-------
 .../core/async/AsyncLoggerDefaultLocationTest.java |  9 +--
 .../AsyncLoggerEventTranslationExceptionTest.java  | 12 ++--
 .../log4j/core/async/AsyncLoggerLocationTest.java  | 23 ++++----
 .../log4j/core/async/AsyncLoggerNanoTimeTest.java  |  2 +-
 .../logging/log4j/core/async/AsyncLoggerTest.java  | 22 +++----
 .../AsyncLoggerTestArgumentFreedOnErrorTest.java   |  1 -
 .../core/async/AsyncLoggerThreadContextTest.java   | 15 ++---
 .../async/AsyncLoggerTimestampMessageTest.java     |  2 +-
 .../async/AsyncLoggerUseAfterShutdownTest.java     | 23 ++++----
 .../async/AsyncLoggersWithAsyncAppenderTest.java   |  0
 .../AsyncLoggersWithAsyncLoggerConfigTest.java     |  2 +-
 .../async/AsyncQueueFullPolicyFactoryTest.java     |  0
 .../log4j/core/async/AsyncRootReloadTest.java      | 19 +++---
 .../log4j/core/async/AsyncThreadContextTest.java   | 18 ++++--
 .../async/BasicAsyncLoggerContextSelectorTest.java |  0
 .../async/DisruptorConfigurationInvalidTest.java   |  0
 .../core/async/DisruptorConfigurationTest.java     |  0
 .../async/GarbageFreeAsyncThreadContextTest.java   |  0
 .../log4j/core/async/Log4j2Jira1688AsyncTest.java  |  2 +-
 .../core/async/QueueFullAsyncLogger2Test.java      |  2 +-
 .../core/async/QueueFullAsyncLogger3Test.java      |  3 +-
 .../async/QueueFullAsyncLoggerConfig2Test.java     |  2 +-
 ...lAsyncLoggerConfigLoggingFromToString2Test.java |  2 +-
 ...llAsyncLoggerConfigLoggingFromToStringTest.java |  1 +
 .../core/async/QueueFullAsyncLoggerConfigTest.java |  1 +
 ...ueueFullAsyncLoggerLoggingFromToStringTest.java |  1 +
 .../log4j/core/async/QueueFullAsyncLoggerTest.java |  1 +
 .../log4j/core/async/RingBufferLogEventTest.java   |  0
 ...AsyncWaitStrategyIncorrectFactoryConfigTest.xml |  0
 .../async/AsyncLoggerClassLoadDeadlockTest.xml     |  0
 .../log4j/core/async/AsyncLoggerConfig2Test.xml    |  2 +-
 .../log4j/core/async/AsyncLoggerConfig3Test.xml    |  2 +-
 .../log4j/core/async/AsyncLoggerConfig4Test.xml    |  0
 .../core/async}/AsyncLoggerConfigAutoFlushTest.xml |  2 +-
 .../core/async}/AsyncLoggerConfigErrorOnFormat.xml |  2 +-
 .../log4j/core/async/AsyncLoggerConfigTest.xml     |  0
 .../AsyncLoggerConfigUseAfterShutdownTest.xml      |  0
 .../AsyncLoggerConfigWithAsyncEnabledTest.xml      |  0
 .../AsyncLoggerCustomSelectorLocationTest.xml      |  2 +-
 .../core/async}/AsyncLoggerDefaultLocationTest.xml |  0
 .../AsyncLoggerEventTranslationExceptionTest.xml   | 12 ++--
 .../log4j/core/async}/AsyncLoggerLocationTest.xml  |  2 +-
 .../log4j/core/async/AsyncLoggerNanoTimeTest.xml   |  4 +-
 .../logging/log4j/core/async}/AsyncLoggerTest.xml  |  2 +-
 .../AsyncLoggerTestArgumentFreedOnErrorTest.xml    | 12 ++--
 .../core/async}/AsyncLoggerThreadContextTest.xml   |  0
 .../async}/AsyncLoggerTimestampMessageTest.xml     |  0
 .../core/async/AsyncLoggerUseAfterShutdownTest.xml |  0
 .../async/AsyncLoggersWithAsyncAppenderTest.xml    |  0
 .../AsyncLoggersWithAsyncLoggerConfigTest.xml      |  0
 .../log4j/core/async/AsyncRootReloadTest.xml       |  0
 .../async/AsyncThreadContextTest/ALL_ASYNC.xml     |  0
 .../BOTH_ALL_ASYNC_AND_MIXED.xml                   |  0
 .../core/async/AsyncThreadContextTest/MIXED.xml    |  0
 .../async/DisruptorConfigurationInvalidTest.xml    |  0
 .../core/async/DisruptorConfigurationTest.xml      |  0
 .../log4j/core/async/Log4j2Jira1688AsyncTest.xml   |  9 ++-
 ...ullAsyncLoggerConfigLoggingFromToStringTest.xml |  0
 .../core/async/QueueFullAsyncLoggerConfigTest.xml  |  0
 .../log4j/core/GarbageCollectionHelper.java        |  3 +-
 .../log4j/core/ThreadContextTestAccess.java        |  0
 .../log4j/core/async/QueueFullAbstractTest.java    |  1 +
 .../log4j/core/test}/TestPatternConverters.java    |  3 +-
 .../log4j/core/test}/async/BlockingAppender.java   |  2 +-
 .../log4j/core/test/async/package-info.java        | 22 +++++++
 .../log4j/core/async/QueueFullAbstractTest.xml     |  0
 .../core/async/AsyncLoggerClassLoadDeadlock.java   | 32 ----------
 .../core/async/QueueFullAsyncAppenderTest.java     |  1 +
 pom.xml                                            |  7 +++
 83 files changed, 299 insertions(+), 214 deletions(-)

diff --git a/log4j-async-logger/pom.xml b/log4j-async-logger/pom.xml
new file mode 100644
index 0000000000..5d37d3d80f
--- /dev/null
+++ b/log4j-async-logger/pom.xml
@@ -0,0 +1,68 @@
+<?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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.logging.log4j</groupId>
+    <artifactId>log4j</artifactId>
+    <version>${revision}</version>
+    <relativePath>../log4j-parent</relativePath>
+  </parent>
+
+  <artifactId>log4j-async-logger</artifactId>
+  <name>Log4j Async Logger</name>
+  <description>Alternative implementation of logger that uses LMAX Disruptor.</description>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.lmax</groupId>
+      <artifactId>disruptor</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.awaitility</groupId>
+      <artifactId>awaitility</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+  </dependencies>
+</project>
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.java
similarity index 60%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.java
index c015520406..4836bbbfbd 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.java
@@ -18,21 +18,24 @@ package org.apache.logging.log4j.core.async;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.test.junit.SetTestProperty;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 /**
  * Test class loading deadlock condition from the LOG4J2-1457
  */
 @Tag("async")
-@SetSystemProperty(
-        key = Log4jPropertyKey.Constant.CONTEXT_SELECTOR_CLASS_NAME,
+@SetTestProperty(
+        key = "LoggerContext.selector",
         value = "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.ASYNC_LOGGER_RING_BUFFER_SIZE, value = "128")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerConsoleTest.xml")
+@SetTestProperty(key = "AsyncLogger.ringBufferSize", value = "128")
+@SetTestProperty(
+        key = "Configuration.file",
+        value = "org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.xml")
 public class AsyncLoggerClassLoadDeadlockTest {
 
     static final int RING_BUFFER_SIZE = 128;
@@ -41,7 +44,19 @@ public class AsyncLoggerClassLoadDeadlockTest {
     @Timeout(value = 30)
     public void testClassLoaderDeadlock() throws Exception {
         // touch the class so static init will be called
-        final AsyncLoggerClassLoadDeadlock temp = new AsyncLoggerClassLoadDeadlock();
+        final DeadLock temp = new DeadLock();
         assertNotNull(temp);
     }
+
+    static final class DeadLock {
+        static {
+            final Logger log = LogManager.getLogger("com.foo.bar.deadlock");
+            final Exception e = new Exception();
+            // the key to reproducing the problem is to fill up the ring buffer so that
+            // log.info call will block on ring buffer as well
+            for (int i = 0; i < AsyncLoggerClassLoadDeadlockTest.RING_BUFFER_SIZE * 2; ++i) {
+                log.info("clinit", e);
+            }
+        }
+    }
 }
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest2.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig2Test.java
similarity index 70%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest2.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig2Test.java
index 3c92d26b1d..a36c756959 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest2.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig2Test.java
@@ -22,35 +22,37 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
-import org.apache.logging.log4j.LogManager;
+import java.nio.file.Path;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
+import org.apache.logging.log4j.test.junit.UsingStatusListener;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerConfigTest2.xml")
-public class AsyncLoggerConfigTest2 {
+@UsingStatusListener
+public class AsyncLoggerConfig2Test {
+
+    @TempLoggingDir
+    private static Path loggingPath;
 
     @Test
-    public void testConsecutiveReconfigure() throws Exception {
-        final File file = new File("target", "AsyncLoggerConfigTest2.log");
-        assertTrue(!file.exists() || file.delete(), "Deleted old file before test");
+    @LoggerContextSource
+    public void testConsecutiveReconfigure(final LoggerContext ctx) throws Exception {
+        final File file = loggingPath.resolve("AsyncLoggerConfigTest2.log").toFile();
 
-        final Logger log = LogManager.getLogger("com.foo.Bar");
+        final Logger log = ctx.getLogger("com.foo.Bar");
         final String msg = "Message before reconfig";
         log.info(msg);
 
-        final LoggerContext ctx = LoggerContext.getContext(false);
         ctx.reconfigure();
         ctx.reconfigure();
 
         final String msg2 = "Message after reconfig";
         log.info(msg2);
-        CoreLoggerContexts.stopLoggerContext(file); // stop async thread
+        ctx.stop(); // stop async thread
 
         final BufferedReader reader = new BufferedReader(new FileReader(file));
         final String line1 = reader.readLine();
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest3.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig3Test.java
similarity index 92%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest3.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig3Test.java
index 39b26a518c..f46c75b61f 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest3.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig3Test.java
@@ -16,6 +16,7 @@
  */
 package org.apache.logging.log4j.core.async;
 
+import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.logging.log4j.Level;
@@ -24,17 +25,19 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ParameterizedMessage;
-import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
 @Tag("async")
 @Tag("sleepy")
-public class AsyncLoggerConfigTest3 {
+public class AsyncLoggerConfig3Test {
+
+    @TempLoggingDir
+    private static Path loggingPath;
 
     @Test
-    @CleanUpFiles("target/AsyncLoggerConfigTest2.log")
-    @LoggerContextSource("AsyncLoggerConfigTest2.xml")
+    @LoggerContextSource
     public void testNoConcurrentModificationException(final Logger log) throws Exception {
         log.info("initial message");
         Thread.sleep(500);
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
similarity index 62%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
index b022853d64..12b745207a 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.java
@@ -20,29 +20,30 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.File;
 import java.nio.file.Files;
-import org.apache.logging.log4j.LogManager;
+import java.nio.file.Path;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerConfigAutoFlushTest.xml")
 public class AsyncLoggerConfigAutoFlushTest {
 
+    @TempLoggingDir
+    private static Path loggingPath;
+
     @Test
-    @CleanUpFiles("target/AsyncLoggerConfigAutoFlushTest.log")
-    public void testFlushAtEndOfBatch() throws Exception {
-        final File file = new File("target", "AsyncLoggerConfigAutoFlushTest.log");
-        assertTrue(!file.exists() || file.delete(), "Deleted old file before test");
+    @LoggerContextSource
+    public void testFlushAtEndOfBatch(final LoggerContext ctx) throws Exception {
+        final File file =
+                loggingPath.resolve("AsyncLoggerConfigAutoFlushTest.log").toFile();
 
-        final Logger log = LogManager.getLogger("com.foo.Bar");
+        final Logger log = ctx.getLogger("com.foo.Bar");
         final String msg = "Message flushed with immediate flush=false";
         log.info(msg);
-        CoreLoggerContexts.stopLoggerContext(file); // stop async thread
+        ctx.stop(); // stop async thread
         final String contents = Files.readString(file.toPath());
         assertTrue(contents.contains(msg), "line1 correct");
     }
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
similarity index 89%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
index fbfec402d0..1b144842a0 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.java
@@ -23,29 +23,34 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.File;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.List;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
 import org.apache.logging.log4j.core.test.CoreLoggerContexts;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.message.AsynchronouslyFormattable;
 import org.apache.logging.log4j.message.Message;
-import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerConfigErrorOnFormat.xml")
 @SetSystemProperty(
         key = Log4jPropertyKey.Constant.LOG_EVENT_FACTORY_CLASS_NAME,
         value = "org.apache.logging.log4j.core.impl.DefaultLogEventFactory")
 public class AsyncLoggerConfigErrorOnFormat {
 
+    @TempLoggingDir
+    private static Path loggingPath;
+
     @Test
-    @CleanUpFiles("target/AsyncLoggerConfigErrorOnFormat.log")
+    @LoggerContextSource
     public void testError() throws Exception {
-        final File file = new File("target", "AsyncLoggerConfigErrorOnFormat.log");
+        final File file =
+                loggingPath.resolve("AsyncLoggerConfigErrorOnFormat.log").toFile();
         assertTrue(!file.exists() || file.delete(), "Deleted old file before test");
 
         final Logger log = LogManager.getLogger("com.foo.Bar");
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.java
similarity index 65%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.java
index 9a3877b1af..29f20f63e5 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.java
@@ -16,29 +16,31 @@
  */
 package org.apache.logging.log4j.core.async;
 
+import java.nio.file.Path;
 import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.apache.logging.log4j.spi.AbstractLogger;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerConfigTest.xml")
 public class AsyncLoggerConfigUseAfterShutdownTest {
 
+    @TempLoggingDir
+    private static Path loggingPath;
+
     @Test
-    public void testNoErrorIfLogAfterShutdown() throws Exception {
-        final Logger log = LogManager.getLogger("com.foo.Bar");
+    @LoggerContextSource
+    public void testNoErrorIfLogAfterShutdown(final LoggerContext ctx) throws Exception {
+        final Logger log = ctx.getLogger("com.foo.Bar");
         log.info("some message");
-        CoreLoggerContexts.stopLoggerContext(); // stop async thread
+        ctx.stop(); // stop async thread
 
         // call the #logMessage() method to bypass the isEnabled check:
         // before the LOG4J2-639 fix this would throw a NPE
-        ((AbstractLogger) log).logMessage("com.foo.Bar", Level.INFO, null, new SimpleMessage("msg"), null);
+        log.logMessage(Level.INFO, null, "com.foo.Bar", null, new SimpleMessage("msg"), null);
     }
 }
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorInitialStateTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorInitialStateTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorInitialStateTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorInitialStateTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelectorTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerContextTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.java
similarity index 75%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.java
index 5b274ab26f..f75fe35977 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.java
@@ -25,47 +25,37 @@ import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.net.URI;
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.List;
-import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
 import org.apache.logging.log4j.core.selector.ContextSelector;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
 import org.apache.logging.log4j.core.test.junit.ContextSelectorType;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.plugins.Singleton;
-import org.apache.logging.log4j.test.junit.CleanUpFiles;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
 @Tag("async")
 @ContextSelectorType(AsyncLoggerCustomSelectorLocationTest.CustomAsyncContextSelector.class)
-@CleanUpFiles("target/AsyncLoggerCustomSelectorLocationTest.log")
 public class AsyncLoggerCustomSelectorLocationTest {
 
-    @BeforeEach
-    public void beforeEach() throws Exception {
-        System.setProperty(
-                Log4jPropertyKey.CONFIG_LOCATION.getSystemKey(), "AsyncLoggerCustomSelectorLocationTest.xml");
-    }
-
-    @AfterEach
-    public void afterEach() throws Exception {
-        System.clearProperty(Log4jPropertyKey.CONFIG_LOCATION.getSystemKey());
-    }
+    @TempLoggingDir
+    private static Path loggingPath;
 
     @Test
-    public void testCustomAsyncSelectorLocation() throws Exception {
-        final File file = new File("target", "AsyncLoggerCustomSelectorLocationTest.log");
-        final Logger log = LogManager.getLogger("com.foo.Bar");
-        final Logger logIncludingLocation = LogManager.getLogger("com.include.location.Bar");
+    @LoggerContextSource
+    public void testCustomAsyncSelectorLocation(final LoggerContext ctx) throws Exception {
+        final File file =
+                loggingPath.resolve("AsyncLoggerCustomSelectorLocationTest.log").toFile();
+        final Logger log = ctx.getLogger("com.foo.Bar");
+        final Logger logIncludingLocation = ctx.getLogger("com.include.location.Bar");
         final String msg = "Async logger msg with location";
         log.info(msg);
         logIncludingLocation.info(msg);
-        CoreLoggerContexts.stopLoggerContext(false, file); // stop async thread
+        ctx.stop(); // stop async thread
 
         final BufferedReader reader = new BufferedReader(new FileReader(file));
         final String firstLine = reader.readLine();
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.java
similarity index 82%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.java
index 33cca5ff64..3d5ecfd09e 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.java
@@ -21,22 +21,19 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
-import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerDefaultLocationTest.xml")
 public class AsyncLoggerDefaultLocationTest {
     @Test
-    public void testAsyncLogWritesToLog() throws Exception {
-        final LoggerContext context = (LoggerContext) LogManager.getContext(false);
+    @LoggerContextSource
+    public void testAsyncLogWritesToLog(final LoggerContext context) throws Exception {
         final ListAppender app = context.getConfiguration().getAppender("List");
         assertNotNull(app);
         final Logger log = context.getLogger("com.foo.Bar");
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.java
similarity index 93%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.java
index ffbe9238f9..bc7e9ca545 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.java
@@ -23,11 +23,11 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import com.lmax.disruptor.ExceptionHandler;
 import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
 import org.apache.logging.log4j.core.test.junit.ContextSelectorType;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ReusableSimpleMessage;
 import org.apache.logging.log4j.spi.AbstractLogger;
@@ -44,16 +44,16 @@ import org.junitpioneer.jupiter.SetSystemProperty;
  */
 @Tag("async")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "log4j2-console.xml")
 @SetSystemProperty(
         key = Log4jPropertyKey.Constant.ASYNC_LOGGER_EXCEPTION_HANDLER_CLASS_NAME,
         value = "org.apache.logging.log4j.core.async.AsyncLoggerEventTranslationExceptionTest$TestExceptionHandler")
 class AsyncLoggerEventTranslationExceptionTest {
 
     @Test
-    void testEventTranslationExceptionDoesNotCauseAsyncEventException() {
+    @LoggerContextSource
+    void testEventTranslationExceptionDoesNotCauseAsyncEventException(final LoggerContext ctx) {
 
-        final Logger log = LogManager.getLogger("com.foo.Bar");
+        final Logger log = ctx.getLogger("com.foo.Bar");
 
         assertTrue(TestExceptionHandler.INSTANTIATED, "TestExceptionHandler was not configured properly");
 
@@ -61,7 +61,7 @@ class AsyncLoggerEventTranslationExceptionTest {
         assertThrows(TestMessageException.class, () -> ((AbstractLogger) log)
                 .logMessage("com.foo.Bar", Level.INFO, null, exceptionThrowingMessage, null));
 
-        CoreLoggerContexts.stopLoggerContext(); // stop async thread
+        ctx.stop(); // stop async thread
 
         assertFalse(
                 TestExceptionHandler.EVENT_EXCEPTION_ENCOUNTERED, "ExceptionHandler encountered an event exception");
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java
similarity index 72%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java
index b9bc4da8c3..fb81b286b0 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.java
@@ -22,30 +22,31 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
-import org.apache.logging.log4j.LogManager;
+import java.nio.file.Path;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
+import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.test.junit.ContextSelectorType;
-import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerLocationTest.xml")
-@CleanUpFiles("target/AsyncLoggerLocationTest.log")
 public class AsyncLoggerLocationTest {
 
+    @TempLoggingDir
+    private static Path loggingPath;
+
     @Test
-    public void testAsyncLogWritesToLog() throws Exception {
-        final File file = new File("target", "AsyncLoggerLocationTest.log");
+    @LoggerContextSource
+    public void testAsyncLogWritesToLog(final LoggerContext ctx) throws Exception {
+        final File file = loggingPath.resolve("AsyncLoggerLocationTest.log").toFile();
         // System.out.println(f.getAbsolutePath());
-        final Logger log = LogManager.getLogger("com.foo.Bar");
+        final Logger log = ctx.getLogger("com.foo.Bar");
         final String msg = "Async logger msg with location";
         log.info(msg);
-        CoreLoggerContexts.stopLoggerContext(false, file); // stop async thread
+        ctx.stop(); // stop async thread
 
         final BufferedReader reader = new BufferedReader(new FileReader(file));
         final String line1 = reader.readLine();
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.java
similarity index 98%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.java
index 069fef4f34..02137cd983 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.java
@@ -35,7 +35,7 @@ import org.junit.jupiter.api.Test;
 
 @Tag("async")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
-@LoggerContextSource("NanoTimeToFileTest.xml")
+@LoggerContextSource
 public class AsyncLoggerNanoTimeTest {
 
     @Test
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java
similarity index 76%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java
index 99ac7c374f..319e9d0e87 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTest.java
@@ -23,32 +23,34 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
+import java.nio.file.Path;
 import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
+import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.test.junit.ContextSelectorType;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.time.internal.DummyNanoClock;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerTest.xml")
 public class AsyncLoggerTest {
 
+    @TempLoggingDir
+    private static Path loggingPath;
+
     @Test
-    public void testAsyncLogWritesToLog() throws Exception {
-        final File file = new File("target", "AsyncLoggerTest.log");
-        // System.out.println(f.getAbsolutePath());
-        file.delete();
+    @LoggerContextSource
+    public void testAsyncLogWritesToLog(final LoggerContext ctx) throws Exception {
+        final File file = loggingPath.resolve("AsyncLoggerTest.log").toFile();
 
-        final AsyncLogger log = (AsyncLogger) LogManager.getLogger("com.foo.Bar");
+        final AsyncLogger log = (AsyncLogger) ctx.getLogger("com.foo.Bar");
         assertTrue(log.getNanoClock() instanceof DummyNanoClock);
 
         final String msg = "Async logger msg";
         log.info(msg, new InternalError("this is not a real error"));
-        CoreLoggerContexts.stopLoggerContext(false, file); // stop async thread
+        ctx.stop(); // stop async thread
 
         final BufferedReader reader = new BufferedReader(new FileReader(file));
         final String line1 = reader.readLine();
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.java
similarity index 97%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.java
index c8f413d74a..17774c3765 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.java
@@ -31,7 +31,6 @@ import org.junit.jupiter.api.Test;
 import org.junitpioneer.jupiter.SetSystemProperty;
 
 @Tag("async")
-@SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "log4j2-console.xml")
 @SetSystemProperty(key = Log4jPropertyKey.Constant.GC_ENABLE_DIRECT_ENCODERS, value = "true")
 @SetSystemProperty(key = Log4jPropertyKey.Constant.ASYNC_LOGGER_FORMAT_MESSAGES_IN_BACKGROUND, value = "true")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.java
similarity index 81%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.java
index 69b1753f9a..2cd7adf0ce 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.java
@@ -23,12 +23,11 @@ import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
 import java.nio.file.Path;
-import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
+import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.test.junit.ContextSelectorType;
-import org.apache.logging.log4j.test.junit.SetTestProperty;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.apache.logging.log4j.test.junit.UsingStatusListener;
 import org.junit.jupiter.api.Tag;
@@ -36,7 +35,6 @@ import org.junit.jupiter.api.Test;
 
 @Tag("async")
 @UsingStatusListener
-@SetTestProperty(key = "Configuration.file", value = "AsyncLoggerThreadContextTest.xml")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
 public class AsyncLoggerThreadContextTest {
 
@@ -44,18 +42,17 @@ public class AsyncLoggerThreadContextTest {
     private static Path loggingPath;
 
     @Test
-    public void testAsyncLogWritesToLog() throws Exception {
+    @LoggerContextSource
+    public void testAsyncLogWritesToLog(final LoggerContext ctx) throws Exception {
         final File file = loggingPath.resolve("AsyncLoggerTest.log").toFile();
-        // System.out.println(f.getAbsolutePath());
-        file.delete();
 
         ThreadContext.push("stackvalue");
         ThreadContext.put("KEY", "mapvalue");
 
-        final Logger log = LogManager.getLogger("com.foo.Bar");
+        final Logger log = ctx.getLogger("com.foo.Bar");
         final String msg = "Async logger msg";
         log.info(msg, new InternalError("this is not a real error"));
-        CoreLoggerContexts.stopLoggerContext(false, file); // stop async thread
+        ctx.stop(); // stop async thread
 
         final BufferedReader reader = new BufferedReader(new FileReader(file));
         final String line1 = reader.readLine();
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
similarity index 98%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
index 982449067c..256ee7130e 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.java
@@ -43,7 +43,7 @@ import org.opentest4j.AssertionFailedError;
  */
 @Tag("async")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
-@LoggerContextSource("AsyncLoggerTimestampMessageTest.xml")
+@LoggerContextSource
 public class AsyncLoggerTimestampMessageTest {
 
     @Factory
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.java
similarity index 63%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.java
index 73ec29efb3..520300e05c 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.java
@@ -17,35 +17,32 @@
 package org.apache.logging.log4j.core.async;
 
 import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
-import org.apache.logging.log4j.core.test.CoreLoggerContexts;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.junit.ContextSelectorType;
+import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.message.SimpleMessage;
-import org.apache.logging.log4j.spi.AbstractLogger;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
-import org.junitpioneer.jupiter.SetSystemProperty;
 
 /**
  * Test for <a href="https://issues.apache.org/jira/browse/LOG4J2-639">LOG4J2-639</a>
  */
 @Tag("async")
 @Tag("functional")
+@ContextSelectorType(AsyncLoggerContextSelector.class)
 public class AsyncLoggerUseAfterShutdownTest {
+
     @Test
-    @SetSystemProperty(
-            key = Log4jPropertyKey.Constant.CONTEXT_SELECTOR_CLASS_NAME,
-            value = "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector")
-    @SetSystemProperty(key = Log4jPropertyKey.Constant.CONFIG_LOCATION, value = "AsyncLoggerTest.xml")
-    public void testNoErrorIfLogAfterShutdown() throws Exception {
-        final Logger log = LogManager.getLogger("com.foo.Bar");
+    @LoggerContextSource
+    public void testNoErrorIfLogAfterShutdown(final LoggerContext ctx) throws Exception {
+        final Logger log = ctx.getLogger("com.foo.Bar");
         final String msg = "Async logger msg";
         log.info(msg, new InternalError("this is not a real error"));
-        CoreLoggerContexts.stopLoggerContext(); // stop async thread
+        ctx.stop(); // stop async thread
 
         // call the #logMessage() method to bypass the isEnabled check:
         // before the LOG4J2-639 fix this would throw a NPE
-        ((AbstractLogger) log).logMessage("com.foo.Bar", Level.INFO, null, new SimpleMessage("msg"), null);
+        log.logMessage(Level.INFO, null, "com.foo.Bar", null, new SimpleMessage("msg"), null);
     }
 }
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.java
similarity index 97%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.java
index 4256906f11..c7690d858a 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.java
@@ -40,7 +40,7 @@ public class AsyncLoggersWithAsyncLoggerConfigTest {
     }
 
     @Test
-    @LoggerContextSource("AsyncLoggersWithAsyncLoggerConfigTest.xml")
+    @LoggerContextSource
     public void testLoggingWorks(final Logger logger, @Named("List") final ListAppender appender) throws Exception {
         logger.error("This is a test");
         logger.warn("Hello world!");
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncRootReloadTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncRootReloadTest.java
similarity index 77%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncRootReloadTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncRootReloadTest.java
index bfe7ac3a32..45807b6072 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncRootReloadTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncRootReloadTest.java
@@ -19,10 +19,11 @@ package org.apache.logging.log4j.core.async;
 import java.io.File;
 import java.net.URISyntaxException;
 import java.net.URL;
-import org.apache.logging.log4j.Logger;
+import java.nio.file.Path;
+import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.util.FileUtils;
-import org.apache.logging.log4j.test.junit.CleanUpFiles;
+import org.apache.logging.log4j.test.junit.TempLoggingDir;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
@@ -33,16 +34,16 @@ import org.junit.jupiter.api.Test;
 @Tag("sleepy")
 public class AsyncRootReloadTest {
 
-    private static final String ISSUE = "LOG4J2-807";
-    private static final String ISSUE_CONFIG = ISSUE + ".xml";
-    private static final String LOG = "target/" + ISSUE + ".log";
-    private static final String RESOURCE = "classpath:" + ISSUE_CONFIG;
+    private static final String ISSUE_CONFIG =
+            "/" + AsyncRootReloadTest.class.getName().replace('.', '/') + ".xml";
+
+    @TempLoggingDir
+    private Path loggingPath;
 
     @Test
-    @CleanUpFiles(LOG)
-    @LoggerContextSource(RESOURCE)
+    @LoggerContextSource
     public void testLog4j2_807(final Logger logger) throws InterruptedException, URISyntaxException {
-        final URL url = AsyncRootReloadTest.class.getResource("/" + ISSUE_CONFIG);
+        final URL url = AsyncRootReloadTest.class.getResource(ISSUE_CONFIG);
         final File configFile = FileUtils.fileFromUri(url.toURI());
 
         logger.info("Log4j configured, will be reconfigured in approx. 5 sec");
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
similarity index 95%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
index 4b28ed58f0..819eaa0f90 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
@@ -22,6 +22,7 @@ import static org.awaitility.Awaitility.waitAtMost;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.concurrent.TimeUnit;
@@ -35,7 +36,6 @@ import org.apache.logging.log4j.core.impl.Log4jPropertyKey;
 import org.apache.logging.log4j.core.selector.ClassLoaderContextSelector;
 import org.apache.logging.log4j.core.selector.ContextSelector;
 import org.apache.logging.log4j.core.test.CoreLoggerContexts;
-import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.spi.LoggingSystemProperty;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
@@ -67,16 +67,22 @@ public class AsyncThreadContextTest {
     private static Path loggingPath;
 
     enum Mode {
-        ALL_ASYNC(AsyncLoggerContextSelector.class, "AsyncLoggerThreadContextTest.xml"),
-        MIXED(ClassLoaderContextSelector.class, "AsyncLoggerConfigThreadContextTest.xml"),
-        BOTH_ALL_ASYNC_AND_MIXED(AsyncLoggerContextSelector.class, "AsyncLoggerConfigThreadContextTest.xml");
+        ALL_ASYNC(AsyncLoggerContextSelector.class),
+        MIXED(ClassLoaderContextSelector.class),
+        BOTH_ALL_ASYNC_AND_MIXED(AsyncLoggerContextSelector.class);
 
         final Class<? extends ContextSelector> contextSelectorType;
         final URI configUri;
 
-        Mode(final Class<? extends ContextSelector> contextSelectorType, final String file) {
+        Mode(final Class<? extends ContextSelector> contextSelectorType) {
             this.contextSelectorType = contextSelectorType;
-            configUri = NetUtils.toURI(file);
+            try {
+                configUri = AsyncThreadContextTest.class
+                        .getResource(AsyncThreadContextTest.class.getSimpleName() + "/" + name() + ".xml")
+                        .toURI();
+            } catch (URISyntaxException e) {
+                throw new IllegalArgumentException(e);
+            }
         }
     }
 
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/BasicAsyncLoggerContextSelectorTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/BasicAsyncLoggerContextSelectorTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/BasicAsyncLoggerContextSelectorTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/BasicAsyncLoggerContextSelectorTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/GarbageFreeAsyncThreadContextTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/GarbageFreeAsyncThreadContextTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/GarbageFreeAsyncThreadContextTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/GarbageFreeAsyncThreadContextTest.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
similarity index 98%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
index 7f0a872616..5b5e1ef57b 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.java
@@ -35,7 +35,7 @@ import org.junit.jupiter.api.Test;
  */
 @Tag("async")
 @ContextSelectorType(AsyncLoggerContextSelector.class)
-@LoggerContextSource("log4j-list.xml")
+@LoggerContextSource
 public class Log4j2Jira1688AsyncTest {
 
     private static Object[] createArray(final int size) {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest2.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLogger2Test.java
similarity index 95%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest2.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLogger2Test.java
index 5699a28630..beda3aa982 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest2.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLogger2Test.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.test.junit.SetTestProperty;
  * is immutable.
  */
 @SetTestProperty(key = "AsyncLogger.formatMsg", value = "true")
-public class QueueFullAsyncLoggerTest2 extends QueueFullAsyncLoggerTest {
+public class QueueFullAsyncLogger2Test extends QueueFullAsyncLoggerTest {
 
     @Override
     protected void checkConfig(final LoggerContext ctx) {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest3.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLogger3Test.java
similarity index 96%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest3.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLogger3Test.java
index 51be5edf8d..1df420b8d7 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest3.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLogger3Test.java
@@ -24,6 +24,7 @@ import java.util.concurrent.CountDownLatch;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.GarbageCollectionHelper;
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.async.BlockingAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.apache.logging.log4j.message.Message;
@@ -40,7 +41,7 @@ import org.junit.jupiter.api.Timeout;
 @SetTestProperty(key = "AsyncLogger.ringBufferSize", value = "128")
 @SetTestProperty(key = "AsyncLogger.formatMsg", value = "true")
 @SetTestProperty(key = "AsyncLogger.queueFullPolicy", value = "Discard")
-public class QueueFullAsyncLoggerTest3 extends QueueFullAbstractTest {
+public class QueueFullAsyncLogger3Test extends QueueFullAbstractTest {
 
     @Override
     protected void checkConfig(final LoggerContext ctx) {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest2.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfig2Test.java
similarity index 95%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest2.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfig2Test.java
index 918fe6c13e..ef5f5f0455 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest2.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfig2Test.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.test.junit.SetTestProperty;
  * Tests queue full scenarios with AsyncLoggers in configuration.
  */
 @SetTestProperty(key = "AsyncLogger.formatMsg", value = "true")
-public class QueueFullAsyncLoggerConfigTest2 extends QueueFullAsyncLoggerConfigTest {
+public class QueueFullAsyncLoggerConfig2Test extends QueueFullAsyncLoggerConfigTest {
 
     @Override
     protected void checkConfig(final LoggerContext ctx) throws ReflectiveOperationException {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest2.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToString2Test.java
similarity index 95%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest2.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToString2Test.java
index d503e34367..7820f1c1e5 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest2.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToString2Test.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.test.junit.SetTestProperty;
  * Tests queue full scenarios with AsyncLoggers in configuration.
  */
 @SetTestProperty(key = "AsyncLogger.formatMsg", value = "true")
-public class QueueFullAsyncLoggerConfigLoggingFromToStringTest2
+public class QueueFullAsyncLoggerConfigLoggingFromToString2Test
         extends QueueFullAsyncLoggerConfigLoggingFromToStringTest {
 
     @Override
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
similarity index 96%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
index 7b1c069273..cdeec6a0f5 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.async;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.async.BlockingAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.apache.logging.log4j.test.junit.SetTestProperty;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
similarity index 96%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
index de6a0cd674..76eaa471dd 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.core.async;
 
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.async.BlockingAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.apache.logging.log4j.test.junit.SetTestProperty;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
similarity index 96%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
index db061b2caf..49e3e125b8 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerLoggingFromToStringTest.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.core.async;
 
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.async.BlockingAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.apache.logging.log4j.test.junit.SetTestProperty;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
similarity index 96%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
index eb83ab4f28..064517ae63 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
+++ b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerTest.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.core.async;
 
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.async.BlockingAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.apache.logging.log4j.test.junit.SetTestProperty;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java b/log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
rename to log4j-async-logger/src/test/java/org/apache/logging/log4j/core/async/RingBufferLogEventTest.java
diff --git a/log4j-core-test/src/test/resources/AsyncWaitStrategyIncorrectFactoryConfigTest.xml b/log4j-async-logger/src/test/resources/AsyncWaitStrategyIncorrectFactoryConfigTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/AsyncWaitStrategyIncorrectFactoryConfigTest.xml
rename to log4j-async-logger/src/test/resources/AsyncWaitStrategyIncorrectFactoryConfigTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.xml
similarity index 100%
copy from log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlockTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConfigTest2.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig2Test.xml
similarity index 94%
copy from log4j-core-test/src/test/resources/AsyncLoggerConfigTest2.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig2Test.xml
index d4090ca4ee..188f173ac8 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerConfigTest2.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig2Test.xml
@@ -18,7 +18,7 @@
 <Configuration status="off">
   <Appenders>
     <File name="File"
-          fileName="target/AsyncLoggerConfigTest2.log"
+          fileName="${test:logging.path}/AsyncLoggerConfigTest2.log"
           bufferedIO="false"
           immediateFlush="true"
           append="true">
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConfigTest2.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig3Test.xml
similarity index 94%
rename from log4j-core-test/src/test/resources/AsyncLoggerConfigTest2.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig3Test.xml
index d4090ca4ee..188f173ac8 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerConfigTest2.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig3Test.xml
@@ -18,7 +18,7 @@
 <Configuration status="off">
   <Appenders>
     <File name="File"
-          fileName="target/AsyncLoggerConfigTest2.log"
+          fileName="${test:logging.path}/AsyncLoggerConfigTest2.log"
           bufferedIO="false"
           immediateFlush="true"
           append="true">
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfig4Test.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConfigAutoFlushTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.xml
similarity index 94%
rename from log4j-core-test/src/test/resources/AsyncLoggerConfigAutoFlushTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.xml
index 32a9dda46c..5dd6428cb6 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerConfigAutoFlushTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigAutoFlushTest.xml
@@ -18,7 +18,7 @@
 <Configuration status="off">
   <Appenders>
     <File name="File"
-          fileName="target/AsyncLoggerConfigAutoFlushTest.log"
+          fileName="${test:logging.path}/AsyncLoggerConfigAutoFlushTest.log"
           bufferedIO="true"
           immediateFlush="false"
           append="false">
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConfigErrorOnFormat.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.xml
similarity index 94%
rename from log4j-core-test/src/test/resources/AsyncLoggerConfigErrorOnFormat.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.xml
index 8dd03842e1..3752763819 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerConfigErrorOnFormat.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigErrorOnFormat.xml
@@ -18,7 +18,7 @@
 <Configuration status="off">
   <Appenders>
     <RandomAccessFile name="File"
-          fileName="target/AsyncLoggerConfigErrorOnFormat.log"
+          fileName="${test:logging.path}/AsyncLoggerConfigErrorOnFormat.log"
           bufferedIO="false"
           immediateFlush="true"
           append="false">
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.xml
similarity index 100%
copy from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.xml
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigUseAfterShutdownTest.xml
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerConfigWithAsyncEnabledTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerCustomSelectorLocationTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.xml
similarity index 91%
rename from log4j-core-test/src/test/resources/AsyncLoggerCustomSelectorLocationTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.xml
index 30bfa3e9c1..35d0be64a7 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerCustomSelectorLocationTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerCustomSelectorLocationTest.xml
@@ -17,7 +17,7 @@
   -->
 <Configuration status="OFF">
   <Appenders>
-    <RandomAccessFile name="RandomAccessFile" fileName="target/AsyncLoggerCustomSelectorLocationTest.log"
+    <RandomAccessFile name="RandomAccessFile" fileName="${test:logging.path}/AsyncLoggerCustomSelectorLocationTest.log"
                       immediateFlush="false" append="false">
       <PatternLayout>
         <Pattern>%d %p %c{1.} [%t] %X{aKey} %location %m %ex%n</Pattern>
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerDefaultLocationTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/AsyncLoggerDefaultLocationTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerDefaultLocationTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.xml
similarity index 83%
copy from log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.xml
index f178a581f8..d85749123b 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerEventTranslationExceptionTest.xml
@@ -15,18 +15,16 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<Configuration status="off">
+<Configuration status="OFF">
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
-      <PatternLayout>
-        <Pattern>%xEx{0}</Pattern>
-      </PatternLayout>
+      <PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable" />
     </Console>
   </Appenders>
-
   <Loggers>
-    <Root level="info">
-      <AppenderRef ref="Console"/>
+    <Logger name="org.foo" level="DEBUG" />
+    <Root level="TRACE">
+      <AppenderRef ref="Console" />
     </Root>
   </Loggers>
 </Configuration>
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerLocationTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.xml
similarity index 92%
rename from log4j-core-test/src/test/resources/AsyncLoggerLocationTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.xml
index 18d69dbd9b..ccffbc7390 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerLocationTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerLocationTest.xml
@@ -17,7 +17,7 @@
   -->
 <Configuration status="OFF">
   <Appenders>
-    <RandomAccessFile name="RandomAccessFile" fileName="target/AsyncLoggerLocationTest.log"
+    <RandomAccessFile name="RandomAccessFile" fileName="${test:logging.path}/AsyncLoggerLocationTest.log"
 	    		immediateFlush="false" append="false">
       <PatternLayout>
         <Pattern>%d %p %c{1.} [%t] %X{aKey} %location %m %ex%n</Pattern>
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerTimestampMessageTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.xml
similarity index 91%
copy from log4j-core-test/src/test/resources/AsyncLoggerTimestampMessageTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.xml
index e2abd60e37..f86ce79421 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerTimestampMessageTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerNanoTimeTest.xml
@@ -18,12 +18,12 @@
 <Configuration status="off">
   <Appenders>
     <List name="list">
-      <PatternLayout pattern="%d{UNIX_MILLIS} %m"/>
+      <PatternLayout pattern="%N AND %nano AND %m"/>
     </List>
   </Appenders>
 
   <Loggers>
-    <Root level="info" includeLocation="false">
+    <Root level="info">
       <AppenderRef ref="list"/>
     </Root>
   </Loggers>
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTest.xml
similarity index 92%
copy from log4j-core-test/src/test/resources/AsyncLoggerTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTest.xml
index 5047563bca..c97bf21fc0 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTest.xml
@@ -17,7 +17,7 @@
   -->
 <Configuration status="off">
   <Appenders>
-    <RandomAccessFile name="RandomAccessFile" fileName="target/AsyncLoggerTest.log"
+    <RandomAccessFile name="RandomAccessFile" fileName="${test:logging.path}/AsyncLoggerTest.log"
 	    		immediateFlush="false" append="false">
       <PatternLayout>
         <Pattern>%d %p %c{1.} [%t] %X{aKey} %location %m %ex%n</Pattern>
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.xml
similarity index 83%
rename from log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.xml
index f178a581f8..d85749123b 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggerConsoleTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTestArgumentFreedOnErrorTest.xml
@@ -15,18 +15,16 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<Configuration status="off">
+<Configuration status="OFF">
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
-      <PatternLayout>
-        <Pattern>%xEx{0}</Pattern>
-      </PatternLayout>
+      <PatternLayout pattern="%d [%t] %-5level: %msg%n%throwable" />
     </Console>
   </Appenders>
-
   <Loggers>
-    <Root level="info">
-      <AppenderRef ref="Console"/>
+    <Logger name="org.foo" level="DEBUG" />
+    <Root level="TRACE">
+      <AppenderRef ref="Console" />
     </Root>
   </Loggers>
 </Configuration>
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerThreadContextTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.xml
similarity index 100%
copy from log4j-core-test/src/test/resources/AsyncLoggerThreadContextTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerThreadContextTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerTimestampMessageTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/AsyncLoggerTimestampMessageTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerTimestampMessageTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/AsyncLoggerTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggerUseAfterShutdownTest.xml
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncAppenderTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggersWithAsyncLoggerConfigTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.xml
similarity index 100%
copy from log4j-core-test/src/test/resources/AsyncLoggersWithAsyncLoggerConfigTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncLoggersWithAsyncLoggerConfigTest.xml
diff --git a/log4j-core-test/src/test/resources/LOG4J2-807.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncRootReloadTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/LOG4J2-807.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncRootReloadTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerThreadContextTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncThreadContextTest/ALL_ASYNC.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/AsyncLoggerThreadContextTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncThreadContextTest/ALL_ASYNC.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConfigThreadContextTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncThreadContextTest/BOTH_ALL_ASYNC_AND_MIXED.xml
similarity index 100%
copy from log4j-core-test/src/test/resources/AsyncLoggerConfigThreadContextTest.xml
copy to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncThreadContextTest/BOTH_ALL_ASYNC_AND_MIXED.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggerConfigThreadContextTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncThreadContextTest/MIXED.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/AsyncLoggerConfigThreadContextTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/AsyncThreadContextTest/MIXED.xml
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationInvalidTest.xml
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/DisruptorConfigurationTest.xml
diff --git a/log4j-core-test/src/test/resources/AsyncLoggersWithAsyncLoggerConfigTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.xml
similarity index 88%
rename from log4j-core-test/src/test/resources/AsyncLoggersWithAsyncLoggerConfigTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.xml
index 8e5ca9f12c..fd7fdf6852 100644
--- a/log4j-core-test/src/test/resources/AsyncLoggersWithAsyncLoggerConfigTest.xml
+++ b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/Log4j2Jira1688AsyncTest.xml
@@ -18,13 +18,12 @@
 <Configuration status="off">
   <Appenders>
     <List name="List">
-      <PatternLayout pattern="%c %m"/>
+      <PatternLayout pattern="[%-5level] %c{1.} %msg%n" />
     </List>
   </Appenders>
-
   <Loggers>
-    <AsyncRoot level="trace">
-      <AppenderRef ref="List"/>
-    </AsyncRoot>
+    <Root level="debug">
+      <AppenderRef ref="List" />
+    </Root>
   </Loggers>
 </Configuration>
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigLoggingFromToStringTest.xml
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.xml b/log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.xml
rename to log4j-async-logger/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAsyncLoggerConfigTest.xml
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
similarity index 95%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
rename to log4j-core-test/src/main/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
index b7aea87421..1feff3edd8 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/GarbageCollectionHelper.java
@@ -18,7 +18,6 @@ package org.apache.logging.log4j.core;
 
 import static org.junit.Assert.assertTrue;
 
-import com.google.common.io.ByteStreams;
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -27,7 +26,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 public final class GarbageCollectionHelper implements Closeable, Runnable {
-    private static final OutputStream sink = ByteStreams.nullOutputStream();
+    private static final OutputStream sink = OutputStream.nullOutputStream();
     private final AtomicBoolean running = new AtomicBoolean();
     private final CountDownLatch latch = new CountDownLatch(1);
     private final Thread gcThread = new Thread(new Runnable() {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/ThreadContextTestAccess.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/ThreadContextTestAccess.java
similarity index 100%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/ThreadContextTestAccess.java
rename to log4j-core-test/src/main/java/org/apache/logging/log4j/core/ThreadContextTestAccess.java
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
similarity index 99%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
rename to log4j-core-test/src/main/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
index 2dc85a0974..5085f7ec4f 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/async/QueueFullAbstractTest.java
@@ -37,6 +37,7 @@ import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.AsyncAppender;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.LoggerConfig;
+import org.apache.logging.log4j.core.test.async.BlockingAppender;
 import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.status.StatusData;
 import org.apache.logging.log4j.status.StatusLogger;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/TestPatternConverters.java
similarity index 97%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
rename to log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/TestPatternConverters.java
index 3f06139531..d1400e40d0 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/TestPatternConverters.java
@@ -14,8 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.logging.log4j.core;
+package org.apache.logging.log4j.core.test;
 
+import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.pattern.ConverterKeys;
 import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
 import org.apache.logging.log4j.plugins.Namespace;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/async/BlockingAppender.java
similarity index 98%
rename from log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
rename to log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/async/BlockingAppender.java
index 5ffabe8118..ddee82e620 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/BlockingAppender.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/async/BlockingAppender.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.async;
+package org.apache.logging.log4j.core.test.async;
 
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/async/package-info.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/async/package-info.java
new file mode 100644
index 0000000000..666b01d264
--- /dev/null
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/async/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.core.test.async;
+
+import org.osgi.annotation.bundle.Export;
+import org.osgi.annotation.versioning.Version;
diff --git a/log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAbstractTest.xml b/log4j-core-test/src/main/resources/org/apache/logging/log4j/core/async/QueueFullAbstractTest.xml
similarity index 100%
rename from log4j-core-test/src/test/resources/org/apache/logging/log4j/core/async/QueueFullAbstractTest.xml
rename to log4j-core-test/src/main/resources/org/apache/logging/log4j/core/async/QueueFullAbstractTest.xml
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlock.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlock.java
deleted file mode 100644
index 3e6be93817..0000000000
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncLoggerClassLoadDeadlock.java
+++ /dev/null
@@ -1,32 +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.core.async;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-class AsyncLoggerClassLoadDeadlock {
-    static {
-        final Logger log = LogManager.getLogger("com.foo.bar.deadlock");
-        final Exception e = new Exception();
-        // the key to reproducing the problem is to fill up the ring buffer so that
-        // log.info call will block on ring buffer as well
-        for (int i = 0; i < AsyncLoggerClassLoadDeadlockTest.RING_BUFFER_SIZE * 2; ++i) {
-            log.info("clinit", e);
-        }
-    }
-}
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java
index 0e73bf8c2b..e2383a8691 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/QueueFullAsyncAppenderTest.java
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.core.async;
 
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.test.async.BlockingAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextSource;
 import org.apache.logging.log4j.core.test.junit.Named;
 import org.junit.jupiter.api.Test;
diff --git a/pom.xml b/pom.xml
index 26b3c44413..f4fd649db7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -236,6 +236,7 @@
     <module>log4j-api</module>
     <module>log4j-api-test</module>
     <module>log4j-appserver</module>
+    <module>log4j-async-logger</module>
     <module>log4j-config-jackson</module>
     <module>log4j-config-properties</module>
     <module>log4j-config-yaml</module>
@@ -374,6 +375,12 @@
         <version>${project.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>org.apache.logging.log4j</groupId>
+        <artifactId>log4j-async-logger</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
       <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-config-jackson</artifactId>