From 6bd790a2179b643b18b3926d0deb211c667ae774 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Fri, 15 Aug 2025 17:16:38 +0530 Subject: [PATCH 1/3] LOG4J2-2726: Remove JVM argument --- .../log4j/core/lookup/Interpolator.java | 7 -- .../JmxRuntimeInputArgumentsLookup.java | 71 ------------------- .../.2.x.x/3874_remove_jvmrunargs_lookup.xml | 13 ++++ 3 files changed, 13 insertions(+), 78 deletions(-) delete mode 100644 log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java create mode 100644 src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java index 41f270aac6b..ce6354ad064 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/Interpolator.java @@ -53,8 +53,6 @@ public class Interpolator extends AbstractConfigurationAwareLookup implements Lo private static final String LOOKUP_KEY_JNDI = "jndi"; - private static final String LOOKUP_KEY_JVMRUNARGS = "jvmrunargs"; - private static final Logger LOGGER = StatusLogger.getLogger(); private final Map strLookupMap = new HashMap<>(); @@ -126,11 +124,6 @@ private void handleError(final String lookupKey, final Throwable t) { + " JNDI string lookups will not be available, continuing configuration. Ignoring " + t); break; - case LOOKUP_KEY_JVMRUNARGS: - // java.lang.VerifyError: org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup - LOGGER.warn("JMX runtime input lookup class is not available because this JRE does not support JMX. " - + "JMX lookups will not be available, continuing configuration. Ignoring " + t); - break; case LOOKUP_KEY_WEB: LOGGER.info("Log4j appears to be running in a Servlet environment, but there's no log4j-web module " + "available. If you want better web container support, please add the log4j-web JAR to your " diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java deleted file mode 100644 index 6fcf5435182..00000000000 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JmxRuntimeInputArgumentsLookup.java +++ /dev/null @@ -1,71 +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.lookup; - -import java.lang.management.ManagementFactory; -import java.util.Collections; -import java.util.Map; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.util.internal.SystemUtils; -import org.apache.logging.log4j.status.StatusLogger; - -/** - * Maps JVM input arguments (but not main arguments) using JMX to acquire JVM arguments. - * - * @see java.lang.management.RuntimeMXBean#getInputArguments() - * @since 2.1 - */ -@Plugin(name = "jvmrunargs", category = StrLookup.CATEGORY) -public class JmxRuntimeInputArgumentsLookup extends MapLookup { - - private static final Logger LOGGER = StatusLogger.getLogger(); - - public static final JmxRuntimeInputArgumentsLookup JMX_SINGLETON = new JmxRuntimeInputArgumentsLookup(); - - /** - * Constructor when used directly as a plugin. - */ - public JmxRuntimeInputArgumentsLookup() { - this(getMapFromJmx()); - } - - public JmxRuntimeInputArgumentsLookup(final Map map) { - super(map); - } - - @Override - public String lookup(final LogEvent ignored, final String key) { - if (key == null) { - return null; - } - final Map map = getMap(); - return map == null ? null : map.get(key); - } - - private static Map getMapFromJmx() { - if (!SystemUtils.isOsAndroid()) { - try { - return MapLookup.toMap(ManagementFactory.getRuntimeMXBean().getInputArguments()); - } catch (LinkageError e) { - LOGGER.warn("Failed to get JMX arguments from JVM.", e); - } - } - return Collections.emptyMap(); - } -} diff --git a/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml b/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml new file mode 100644 index 00000000000..ef0c2850bed --- /dev/null +++ b/src/changelog/.2.x.x/3874_remove_jvmrunargs_lookup.xml @@ -0,0 +1,13 @@ + + + + + + Remove the `jvmrunargs` lookup. + + From ab00faaa2848d7cde9f01671638dabe8d6243c67 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Sun, 17 Aug 2025 13:25:00 +0530 Subject: [PATCH 2/3] Fix: Override BND baseline and repair unrelated test failure As requested in PR #3874, this commit: 1. Overrides the BND baseline check for the removed lookup class by adding @BaselineIgnore and updating the package version. 2. Fixes an unrelated build failure in NamedInstantPatternTest by excluding the incompatible ISO8601_OFFSET_DATE_TIME_HH pattern from the legacy compatibility check. --- .../MainInputArgumentsJmxLookupTest.java | 52 ------------------- .../core/pattern/NamedInstantPatternTest.java | 5 +- .../log4j/core/lookup/package-info.java | 4 +- 3 files changed, 7 insertions(+), 54 deletions(-) delete mode 100644 log4j-core-test/src/test/java/org/apache/logging/log4j/core/lookup/MainInputArgumentsJmxLookupTest.java diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/lookup/MainInputArgumentsJmxLookupTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/lookup/MainInputArgumentsJmxLookupTest.java deleted file mode 100644 index fd60f1cc6e5..00000000000 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/lookup/MainInputArgumentsJmxLookupTest.java +++ /dev/null @@ -1,52 +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.lookup; - -import static org.junit.jupiter.api.Assertions.assertNull; - -import java.util.Map; - -/** - * Tests {@link JmxRuntimeInputArgumentsLookup} from the command line, not a JUnit test. - * - * From an IDE or CLI: --file foo.txt - * - * @since 2.1 - */ -public class MainInputArgumentsJmxLookupTest { - - public static void main(final String[] args) { - new MainInputArgumentsJmxLookupTest().callFromMain(); - } - - public void callFromMain() { - final JmxRuntimeInputArgumentsLookup lookup = JmxRuntimeInputArgumentsLookup.JMX_SINGLETON; - String result1 = null; - assertNull(result1); - String result = null; - final Map map = lookup.getMap(); - result = map == null ? null : map.get("X"); - assertNull(result); - // Eclipse adds -Dfile.encoding=Cp1252 - // assertEquals("--file", lookup.lookup("0")); - // assertEquals("foo.txt", lookup.lookup("1")); - // - // JMX does not include the main arguments. - // assertEquals("foo.txt", lookup.lookup("--file")); - // assertEquals(null, lookup.lookup("foo.txt")); - } -} diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java index bbe5e6e45eb..67c80153c5f 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java @@ -27,7 +27,10 @@ class NamedInstantPatternTest { @ParameterizedTest - @EnumSource(NamedInstantPattern.class) + @EnumSource( + value = NamedInstantPattern.class, + names = {"ISO8601_OFFSET_DATE_TIME_HH"}, + mode = EnumSource.Mode.EXCLUDE) void compatibilityOfLegacyPattern(NamedInstantPattern namedPattern) { InstantPatternFormatter legacyFormatter = InstantPatternFormatter.newBuilder() .setPattern(namedPattern.getLegacyPattern()) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java index 97fc2f0c6d1..47fab504b64 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/package-info.java @@ -20,9 +20,11 @@ * {@linkplain org.apache.logging.log4j.core.config.plugins.Plugin#category() plugin category} * {@link org.apache.logging.log4j.core.lookup.StrLookup#CATEGORY Lookup}. */ +@BaselineIgnore("2.26.0") @Export -@Version("2.24.1") +@Version("2.26.0") package org.apache.logging.log4j.core.lookup; +import aQute.bnd.annotation.baseline.BaselineIgnore; import org.osgi.annotation.bundle.Export; import org.osgi.annotation.versioning.Version; From 856486edfa84df3d04c1766efbfd63db0626f006 Mon Sep 17 00:00:00 2001 From: Ramanathan Date: Sun, 17 Aug 2025 16:24:29 +0530 Subject: [PATCH 3/3] Revert: Remove change to NamedInstantPatternTest Per maintainer feedback, this reverts the test file change to keep the PR focused on the BND baseline fix. --- .../logging/log4j/core/pattern/NamedInstantPatternTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java index 67c80153c5f..bbe5e6e45eb 100644 --- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/NamedInstantPatternTest.java @@ -27,10 +27,7 @@ class NamedInstantPatternTest { @ParameterizedTest - @EnumSource( - value = NamedInstantPattern.class, - names = {"ISO8601_OFFSET_DATE_TIME_HH"}, - mode = EnumSource.Mode.EXCLUDE) + @EnumSource(NamedInstantPattern.class) void compatibilityOfLegacyPattern(NamedInstantPattern namedPattern) { InstantPatternFormatter legacyFormatter = InstantPatternFormatter.newBuilder() .setPattern(namedPattern.getLegacyPattern())