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