This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch release-2.12.x/LOG4J2-3242 in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit a70e2383caf70c2cb2fe827e6eb136109ed57c25 Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Fri Dec 17 15:48:27 2021 -0500 [LOG4J2-3242] Rename JNDI enablement property from 'log4j2.enableJndi' to 'log4j2.enableJndiLookup', 'log4j2.enableJndiJms', and 'log4j2.enableJndiContextSelector'. Cherry-pick from branch release-2.x, resolve conflicts, and tweak. --- .../log4j/core/appender/AbstractManager.java | 3 +- .../log4j/core/appender/mom/JmsManager.java | 13 +- .../logging/log4j/core/lookup/Interpolator.java | 13 +- .../logging/log4j/core/lookup/JndiLookup.java | 52 +- .../apache/logging/log4j/core/net/JndiManager.java | 39 +- .../log4j/core/selector/JndiContextSelector.java | 4 +- .../log4j/core/appender/mom/JmsAppenderTest.java | 7 +- .../routing/RoutingAppenderWithJndiTest.java | 125 ++++ .../log4j/core/lookup/InterpolatorTest.java | 2 + .../log4j/core/lookup/JndiDisabledLookupTest.java | 38 ++ .../logging/log4j/core/lookup/JndiLookupTest.java | 42 +- .../core/lookup/JndiRestrictedLookupTest.java | 43 ++ .../logging/log4j/core/net/JndiManagerTest.java | 98 +++ .../apache/logging/log4j/test/JUnit5Bridge.java | 35 ++ src/changes/changes.xml | 693 +++++++++++++++++++++ src/site/xdoc/manual/appenders.xml | 6 + src/site/xdoc/manual/configuration.xml.vm | 53 ++ 17 files changed, 1235 insertions(+), 31 deletions(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java index e85871f..bf2c53a 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/AbstractManager.java @@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.appender; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -110,7 +111,7 @@ public abstract class AbstractManager implements AutoCloseable { @SuppressWarnings("unchecked") M manager = (M) MAP.get(name); if (manager == null) { - manager = factory.createManager(name, data); + manager = Objects.requireNonNull(factory, "factory").createManager(name, data); if (manager == null) { throw new IllegalStateException("ManagerFactory [" + factory + "] unable to create manager for [" + name + "] with data [" + data + "]"); diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java index c9f105b..d2d397d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/mom/JmsManager.java @@ -125,17 +125,16 @@ public class JmsManager extends AbstractManager { @Override public JmsManager createManager(final String name, final JmsManagerConfiguration data) { - if (JndiManager.isJndiEnabled()) { + if (JndiManager.isJndiJmsEnabled()) { try { return new JmsManager(name, data); } catch (final Exception e) { logger().error("Error creating JmsManager using JmsManagerConfiguration [{}]", data, e); return null; } - } else { - logger().error("Jndi has not been enabled. The log4j2.enableJndi property must be set to true"); - return null; } + logger().error("JNDI must be enabled by setting log4j2.enableJndiJms=true"); + return null; } } @@ -354,7 +353,7 @@ public class JmsManager extends AbstractManager { * @param object * The LogEvent or String message to wrap. * @return A new JMS message containing the provided object. - * @throws JMSException + * @throws JMSException if the JMS provider fails to create a message due to some internal error. */ public Message createMessage(final Serializable object) throws JMSException { if (object instanceof String) { @@ -375,7 +374,7 @@ public class JmsManager extends AbstractManager { * Creates a MessageConsumer on this Destination using the current Session. * * @return A MessageConsumer on this Destination. - * @throws JMSException + * @throws JMSException if the session fails to create a consumer due to some internal error. */ public MessageConsumer createMessageConsumer() throws JMSException { return this.session.createConsumer(this.destination); @@ -389,7 +388,7 @@ public class JmsManager extends AbstractManager { * @param destination * The JMS Destination for the MessageProducer * @return A MessageProducer on this Destination. - * @throws JMSException + * @throws JMSException if the session fails to create a MessageProducer due to some internal error. */ public MessageProducer createMessageProducer(final Session session, final Destination destination) throws JMSException { 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 c8409ab..3d8c07d 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 @@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.ConfigurationAware; import org.apache.logging.log4j.core.config.plugins.util.PluginManager; import org.apache.logging.log4j.core.config.plugins.util.PluginType; +import org.apache.logging.log4j.core.net.JndiManager; import org.apache.logging.log4j.core.util.Loader; import org.apache.logging.log4j.core.util.ReflectionUtil; import org.apache.logging.log4j.status.StatusLogger; @@ -73,7 +74,7 @@ public class Interpolator extends AbstractConfigurationAwareLookup { for (final Map.Entry<String, PluginType<?>> entry : plugins.entrySet()) { try { final Class<? extends StrLookup> clazz = entry.getValue().getPluginClass().asSubclass(StrLookup.class); - if (!clazz.getName().equals("org.apache.logging.log4j.core.lookup.JndiLookup")) { + if (!clazz.getName().equals("org.apache.logging.log4j.core.lookup.JndiLookup") || JndiManager.isJndiLookupEnabled()) { strLookupMap.put(entry.getKey().toLowerCase(), ReflectionUtil.instantiate(clazz)); } } catch (final Throwable t) { @@ -101,6 +102,16 @@ public class Interpolator extends AbstractConfigurationAwareLookup { strLookupMap.put("main", MainMapLookup.MAIN_SINGLETON); strLookupMap.put("marker", new MarkerLookup()); strLookupMap.put("java", new JavaLookup()); + // JNDI + if (JndiManager.isJndiLookupEnabled()) { + try { + // [LOG4J2-703] We might be on Android + strLookupMap.put(LOOKUP_KEY_JNDI, + Loader.newCheckedInstanceOf("org.apache.logging.log4j.core.lookup.JndiLookup", StrLookup.class)); + } catch (final LinkageError | Exception e) { + handleError(LOOKUP_KEY_JNDI, e); + } + } // JMX input args try { // We might be on Android diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java index bd19e54..a783ea4 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/JndiLookup.java @@ -16,9 +16,16 @@ */ package org.apache.logging.log4j.core.lookup; +import java.util.Objects; + +import javax.naming.NamingException; + import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.net.JndiManager; import org.apache.logging.log4j.status.StatusLogger; /** @@ -26,17 +33,54 @@ import org.apache.logging.log4j.status.StatusLogger; */ @Plugin(name = "jndi", category = StrLookup.CATEGORY) public class JndiLookup extends AbstractLookup { + private static final Logger LOGGER = StatusLogger.getLogger(); - private static final String RESULT = "JNDI is not supported"; + private static final Marker LOOKUP = MarkerManager.getMarker("LOOKUP"); + + /** JNDI resource path prefix used in a J2EE container */ + static final String CONTAINER_JNDI_RESOURCE_PATH_PREFIX = "java:comp/env/"; + + /** + * Constructs a new instance or throw IllegalStateException if this feature is disabled. + */ + public JndiLookup() { + if (!JndiManager.isJndiLookupEnabled()) { + throw new IllegalStateException("JNDI must be enabled by setting log4j2.enableJndiLookup=true"); + } + } + /** * Looks up the value of the JNDI resource. + * * @param event The current LogEvent (is ignored by this StrLookup). - * @param key the JNDI resource name to be looked up, may be null + * @param key the JNDI resource name to be looked up, may be null * @return The String value of the JNDI resource. */ @Override public String lookup(final LogEvent event, final String key) { - LOGGER.warn("Attempt to use JNDI Lookup"); - return RESULT; + if (key == null) { + return null; + } + final String jndiName = convertJndiName(key); + try (final JndiManager jndiManager = JndiManager.getDefaultManager()) { + return Objects.toString(jndiManager.lookup(jndiName), null); + } catch (final NamingException e) { + LOGGER.warn(LOOKUP, "Error looking up JNDI resource [{}].", jndiName, e); + return null; + } + } + + /** + * Convert the given JNDI name to the actual JNDI name to use. Default implementation applies the "java:comp/env/" + * prefix unless other scheme like "java:" is given. + * + * @param jndiName The name of the resource. + * @return The fully qualified name to look up. + */ + private String convertJndiName(final String jndiName) { + if (!jndiName.startsWith(CONTAINER_JNDI_RESOURCE_PATH_PREFIX) && jndiName.indexOf(':') == -1) { + return CONTAINER_JNDI_RESOURCE_PATH_PREFIX + jndiName; + } + return jndiName; } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/JndiManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/JndiManager.java index 06e2793..e005c62 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/JndiManager.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/JndiManager.java @@ -39,11 +39,29 @@ import org.apache.logging.log4j.util.PropertiesUtil; public class JndiManager extends AbstractManager { private static final JndiManagerFactory FACTORY = new JndiManagerFactory(); + private static final String PREFIX = "log4j2.enableJndi"; + private static final String JAVA_SCHEME = "java"; private final Context context; + private static boolean isJndiEnabled(final String subKey) { + return PropertiesUtil.getProperties().getBooleanProperty(PREFIX + subKey, false); + } + public static boolean isJndiEnabled() { - return PropertiesUtil.getProperties().getBooleanProperty("log4j2.enableJndi", false); + return isJndiContextSelectorEnabled() || isJndiJmsEnabled() || isJndiLookupEnabled(); + } + + public static boolean isJndiContextSelectorEnabled() { + return isJndiEnabled("ContextSelector"); + } + + public static boolean isJndiJmsEnabled() { + return isJndiEnabled("Jms"); + } + + public static boolean isJndiLookupEnabled() { + return isJndiEnabled("Lookup"); } private JndiManager(final String name, final Context context) { @@ -181,7 +199,7 @@ public class JndiManager extends AbstractManager { } try { URI uri = new URI(name); - if (uri.getScheme() == null || uri.getScheme().equals("java")) { + if (uri.getScheme() == null || uri.getScheme().equals(JAVA_SCHEME)) { return (T) this.context.lookup(name); } LOGGER.warn("Unsupported JNDI URI - {}", name); @@ -195,15 +213,14 @@ public class JndiManager extends AbstractManager { @Override public JndiManager createManager(final String name, final Properties data) { - if (isJndiEnabled()) { - try { - return new JndiManager(name, new InitialContext(data)); - } catch (final NamingException e) { - LOGGER.error("Error creating JNDI InitialContext.", e); - return null; - } - } else { - return new JndiManager(name, null); + if (!isJndiEnabled()) { + throw new IllegalStateException(String.format("JNDI must be enabled by setting one of the %s* properties to true", PREFIX)); + } + try { + return new JndiManager(name, new InitialContext(data)); + } catch (final NamingException e) { + LOGGER.error("Error creating JNDI InitialContext for '{}'.", name, e); + return null; } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java index 81ec3f3..7da852d 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/JndiContextSelector.java @@ -93,8 +93,8 @@ public class JndiContextSelector implements NamedContextSelector { private static final StatusLogger LOGGER = StatusLogger.getLogger(); public JndiContextSelector() { - if (!JndiManager.isJndiEnabled()) { - throw new IllegalStateException("JNDI must be enabled by setting log4j2.enableJndi=true"); + if (!JndiManager.isJndiContextSelectorEnabled()) { + throw new IllegalStateException("JNDI must be enabled by setting log4j2.enableJndiContextSelector=true"); } } diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderTest.java index daf2d0e..4c5b1a9 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/mom/JmsAppenderTest.java @@ -85,8 +85,13 @@ public class JmsAppenderTest { public RuleChain rules = RuleChain.outerRule(jndiRule).around(ctx); @BeforeClass + public static void afterClass() throws Exception { + System.clearProperty("log4j2.enableJndiJms"); + } + + @BeforeClass public static void beforeClass() throws Exception { - System.setProperty("log4j2.enableJndi", "true"); + System.setProperty("log4j2.enableJndiJms", "true"); } public JmsAppenderTest() throws Exception { diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/routing/RoutingAppenderWithJndiTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/routing/RoutingAppenderWithJndiTest.java new file mode 100644 index 0000000..899fd5e --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/appender/routing/RoutingAppenderWithJndiTest.java @@ -0,0 +1,125 @@ +/* + * 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.appender.routing; + +import java.io.File; +import java.util.Collections; +import java.util.Map; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.apache.logging.log4j.EventLogger; +import org.apache.logging.log4j.junit.JndiRule; +import org.apache.logging.log4j.junit.LoggerContextRule; +import org.apache.logging.log4j.message.StructuredDataMessage; +import org.apache.logging.log4j.test.appender.ListAppender; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.rules.RuleChain; + +import static org.junit.Assert.*; + +/** + * RoutingAppenderWithJndiTest + */ +public class RoutingAppenderWithJndiTest { + + public static final String JNDI_CONTEXT_NAME = "java:comp/env/logging/context-name"; + private ListAppender listAppender1; + private ListAppender listAppender2; + + public static LoggerContextRule loggerContextRule = new LoggerContextRule("log4j-routing-by-jndi.xml"); + + @ClassRule + public static RuleChain rules = RuleChain.outerRule(new JndiRule(initBindings())).around(loggerContextRule); + + private static Map<String, Object> initBindings() { + System.setProperty("log4j2.enableJndiLookup", "true"); + //System.setProperty("log4j2.enableJndiJms", "true"); + //System.setProperty("log4j2.enableJndiContextSelector", "true"); + return Collections.emptyMap(); + } + + @Before + public void before() { + listAppender1 = RoutingAppenderWithJndiTest.loggerContextRule.getListAppender("List1"); + listAppender2 = RoutingAppenderWithJndiTest.loggerContextRule.getListAppender("List2"); + } + + @After + public void after() { + if (listAppender1 != null) { + listAppender1.clear(); + } + if (listAppender2 != null) { + listAppender2.clear(); + } + } + + @Test + public void routingTest() throws NamingException { + // default route when there's no jndi resource + StructuredDataMessage msg = new StructuredDataMessage("Test", "This is a message from unknown context", "Context"); + EventLogger.logEvent(msg); + final File defaultLogFile = new File("target/routingbyjndi/routingbyjnditest-unknown.log"); + assertTrue("The default log file was not created", defaultLogFile.exists()); + + // now set jndi resource to Application1 + final Context context = new InitialContext(); + context.bind(JNDI_CONTEXT_NAME, "Application1"); + + msg = new StructuredDataMessage("Test", "This is a message from Application1", "Context"); + EventLogger.logEvent(msg); + assertNotNull("No events generated", listAppender1.getEvents()); + assertTrue("Incorrect number of events. Expected 1, got " + listAppender1.getEvents().size(), listAppender1.getEvents().size() == 1); + + // now set jndi resource to Application2 + context.rebind(JNDI_CONTEXT_NAME, "Application2"); + + msg = new StructuredDataMessage("Test", "This is a message from Application2", "Context"); + EventLogger.logEvent(msg); + assertNotNull("No events generated", listAppender2.getEvents()); + assertTrue("Incorrect number of events. Expected 1, got " + listAppender2.getEvents().size(), listAppender2.getEvents().size() == 1); + assertTrue("Incorrect number of events. Expected 1, got " + listAppender1.getEvents().size(), listAppender1.getEvents().size() == 1); + + msg = new StructuredDataMessage("Test", "This is another message from Application2", "Context"); + EventLogger.logEvent(msg); + assertNotNull("No events generated", listAppender2.getEvents()); + assertTrue("Incorrect number of events. Expected 2, got " + listAppender2.getEvents().size(), listAppender2.getEvents().size() == 2); + assertTrue("Incorrect number of events. Expected 1, got " + listAppender1.getEvents().size(), listAppender1.getEvents().size() == 1); + + // now set jndi resource to Application3. + // The context name, 'Application3', will be used as log file name by the default route. + context.rebind("java:comp/env/logging/context-name", "Application3"); + msg = new StructuredDataMessage("Test", "This is a message from Application3", "Context"); + EventLogger.logEvent(msg); + final File application3LogFile = new File("target/routingbyjndi/routingbyjnditest-Application3.log"); + assertTrue("The Application3 log file was not created", application3LogFile.exists()); + + // now set jndi resource to Application4 + // The context name, 'Application4', will be used as log file name by the default route. + context.rebind("java:comp/env/logging/context-name", "Application4"); + msg = new StructuredDataMessage("Test", "This is a message from Application4", "Context"); + EventLogger.logEvent(msg); + final File application4LogFile = new File("target/routingbyjndi/routingbyjnditest-Application4.log"); + assertTrue("The Application3 log file was not created", application4LogFile.exists()); + } +} diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/InterpolatorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/InterpolatorTest.java index 0af36fd..fc6f3d8 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/InterpolatorTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/InterpolatorTest.java @@ -44,12 +44,14 @@ public class InterpolatorTest { protected void before() throws Throwable { System.setProperty(TESTKEY, TESTVAL); System.setProperty(TESTKEY2, TESTVAL); + System.setProperty("log4j2.enableJndiLookup", "true"); } @Override protected void after() { System.clearProperty(TESTKEY); System.clearProperty(TESTKEY2); + System.clearProperty("log4j2.enableJndiLookup"); } }); diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiDisabledLookupTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiDisabledLookupTest.java new file mode 100644 index 0000000..362a67d --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiDisabledLookupTest.java @@ -0,0 +1,38 @@ +/* + * 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 org.apache.logging.log4j.test.JUnit5Bridge; +import org.junit.Test; + +/** + * JndiDisabledLookupTest + * + * Verifies the Lookups are disabled without the log4j2.enableJndiLookup property set to true. + */ +public class JndiDisabledLookupTest { + + @Test + public void testLookup() { + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + new JndiLookup(); + } + }); + } +} diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiLookupTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiLookupTest.java index ba45808..d02364b 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiLookupTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiLookupTest.java @@ -16,17 +16,20 @@ */ package org.apache.logging.log4j.core.lookup; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.apache.logging.log4j.junit.JndiRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; -import static org.junit.Assert.*; - /** * JndiLookupTest */ @@ -42,8 +45,22 @@ public class JndiLookupTest { @Rule public JndiRule jndiRule = new JndiRule(createBindings()); + @AfterClass + public static void afterClass() { + System.setProperty("log4j2.enableJndiLookup", "true"); + } + + @BeforeClass + public static void beforeClass() { + System.clearProperty("log4j2.enableJndiLookup"); + } + private Map<String, Object> createBindings() { - return new HashMap<>(); + final Map<String, Object> map = new HashMap<>(); + map.put(JndiLookup.CONTAINER_JNDI_RESOURCE_PATH_PREFIX + TEST_CONTEXT_RESOURCE_NAME, TEST_CONTEXT_NAME); + map.put(JndiLookup.CONTAINER_JNDI_RESOURCE_PATH_PREFIX + TEST_INTEGRAL_NAME, TEST_INTEGRAL_VALUE); + map.put(JndiLookup.CONTAINER_JNDI_RESOURCE_PATH_PREFIX + TEST_STRINGS_NAME, TEST_STRINGS_COLLECTION); + return map; } @Test @@ -51,6 +68,23 @@ public class JndiLookupTest { final StrLookup lookup = new JndiLookup(); String contextName = lookup.lookup(TEST_CONTEXT_RESOURCE_NAME); - assertEquals("JNDI is not supported", contextName); + assertEquals(TEST_CONTEXT_NAME, contextName); + + contextName = lookup.lookup(JndiLookup.CONTAINER_JNDI_RESOURCE_PATH_PREFIX + TEST_CONTEXT_RESOURCE_NAME); + assertEquals(TEST_CONTEXT_NAME, contextName); + + final String nonExistingResource = lookup.lookup("logging/non-existing-resource"); + assertNull(nonExistingResource); + } + + @Test + public void testNonStringLookup() throws Exception { + // LOG4J2-1310 + final StrLookup lookup = new JndiLookup(); + final String integralValue = lookup.lookup(TEST_INTEGRAL_NAME); + assertEquals(String.valueOf(TEST_INTEGRAL_VALUE), integralValue); + final String collectionValue = lookup.lookup(TEST_STRINGS_NAME); + assertEquals(String.valueOf(TEST_STRINGS_COLLECTION), collectionValue); } + } diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiRestrictedLookupTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiRestrictedLookupTest.java new file mode 100644 index 0000000..e40cdb2 --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/lookup/JndiRestrictedLookupTest.java @@ -0,0 +1,43 @@ +/* + * 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 org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.assertNull; + +/** + * JndiLookupTest + */ +public class JndiRestrictedLookupTest { + + private static final String DOMAIN = "apache.org"; + + @BeforeClass + public static void beforeClass() { + System.setProperty("log4j2.enableJndiLookup", "true"); + } + + @Test + public void testDnsLookup() throws Exception { + final StrLookup lookup = new JndiLookup(); + String result = lookup.lookup("dns:/" + DOMAIN); + assertNull("DNS data returend", result); + + } +} diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/net/JndiManagerTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/JndiManagerTest.java new file mode 100644 index 0000000..e2fd8f7 --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/net/JndiManagerTest.java @@ -0,0 +1,98 @@ +/* + * 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.net; + +import static org.junit.Assert.assertFalse; + +import java.util.Properties; + +import org.apache.logging.log4j.test.JUnit5Bridge; +import org.junit.Test; + +/** + * Tests {@link JndiManager}. + */ +public class JndiManagerTest { + + @Test + public void testIsJndiEnabled() { + assertFalse(JndiManager.isJndiEnabled()); + } + + @Test + public void testIsJndiContextSelectorEnabled() { + assertFalse(JndiManager.isJndiContextSelectorEnabled()); + } + + @Test + public void testIsJndiJmsEnabled() { + assertFalse(JndiManager.isJndiJmsEnabled()); + } + + @Test + public void testIsJndiLookupEnabled() { + assertFalse(JndiManager.isJndiLookupEnabled()); + } + + @Test + public void testNoInstanceByDefault() { + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + JndiManager.getDefaultManager(); + } + }); + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + JndiManager.getDefaultManager(null); + } + }); + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + JndiManager.getDefaultManager("A"); + } + }); + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + JndiManager.getJndiManager(null); + } + }); + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + JndiManager.getJndiManager(new Properties()); + } + }); + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + JndiManager.getJndiManager(null, null, null, null, null, null); + } + }); + JUnit5Bridge.assertThrows(IllegalStateException.class, new Runnable() { + @Override + public void run() { + JndiManager.getJndiManager("A", "A", "A", "A", "A", new Properties()); + } + }); + } + +} diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/test/JUnit5Bridge.java b/log4j-core/src/test/java/org/apache/logging/log4j/test/JUnit5Bridge.java new file mode 100644 index 0000000..c331433 --- /dev/null +++ b/log4j-core/src/test/java/org/apache/logging/log4j/test/JUnit5Bridge.java @@ -0,0 +1,35 @@ +/* + * 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.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +public class JUnit5Bridge { + + /** This branch is on Java 7 and uses JUnit 4, hence this hack. */ + public static <T> void assertThrows(Class<T> expectedType, Runnable runnable) { + try { + runnable.run(); + fail("Expected " + expectedType.getCanonicalName()); + } catch (Throwable t) { + assertEquals(expectedType, t.getClass()); + } + + } + +} diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c060fee..e9355ce 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -29,9 +29,702 @@ - "update" - Change - "remove" - Removed --> +<<<<<<< log4j-2.12 <release version="2.12.3" date="2021-12-dd" description="GA Release 2.12.3"> <action issue="LOG4J2-3230" dev="ckozak" type="fix"> Fix string substitution recursion. +======= + <release version="2.17.0" date="2021-MM-dd" description="GA Release 2.17.0"> + <action issue="LOG4J2-3242" dev="rgoers, ggregory" type="fix"> + Limit JNDI to the java protocol only. JNDI will remain disabled by default. Rename JNDI enablement property from + 'log4j2.enableJndi' to 'log4j2.enableJndiLookup', 'log4j2.enableJndiJms', and 'log4j2.enableJndiContextSelector'. + </action> + <action issue="LOG4J2-3241" dev="rgoers" type="fix"> + Do not declare log4j-api-java9 and log4j-core-java9 as dependencies as it causes problems with the + Maven enforcer plugin. + </action> + <action issue="LOG4J2-3247" dev="ggregory" type="fix"> + PropertiesConfiguration.parseAppenderFilters NPE when parsing properties file filters. + </action> + <action issue="LOG4J2-3249" dev="ggregory" type="fix"> + Log4j 1.2 bridge for Syslog Appender defaults to port 512 instead of 514. + </action> + <action issue="LOG4J2-3237" dev="ggregory" type="fix"> + Log4j 1.2 bridge API hard codes the Syslog protocol to TCP. + </action> + </release> + <release version="2.16.0" date="2021-12-13" description="GA Release 2.16.0"> + <action issue="LOG4J2-3208" dev="rgoers" type="fix"> + Disable JNDI by default. Require log4j2.enableJndi to be set to true to allow JNDI. + </action> + <action issue="LOG4J2-3211" dev="rgoers" type="fix"> + Completely remove support for Message Lookups. + </action> + </release> + <release version="2.15.0" date="2021-12-06" description="GA Release 2.15.0"> + <!-- ADDS --> + <action issue="LOG4J2-3198" dev="ckozak" type="add"> + Pattern layout no longer enables lookups within message text by default for cleaner API boundaries and reduced + formatting overhead. The old 'log4j2.formatMsgNoLookups' which enabled this behavior has been removed as well + as the 'nolookups' message pattern converter option. The old behavior can be enabled on a per-pattern basis + using '%m{lookups}'. + </action> + <action issue="LOG4J2-3194" dev="rgoers" type="add" due-to="markuss"> + Allow fractional attributes for size attribute of SizeBsaedTriggeringPolicy. + </action> + <action issue="LOG4J2-2978" dev="rgoers" type="add" due-to="Michael Seele"> + Add support for Jakarta EE 9 (Tomcat 10 / Jetty 11) + </action> + <action issue="LOG4J2-3189" dev="ckozak" type="add"> + Improve NameAbbreviator worst-case performance. + </action> + <action issue="LOG4J2-3170" dev="vy" type="add" due-to="Gareth Smith"> + Make CRLF/HTML encoding run in O(n) worst-case time, rather than O(n^2). + </action> + <action issue="LOG4J2-3133" dev="ckozak" type="add"> + Add missing slf4j-api singleton accessors to log4j-slf4j-impl (1.7) StaticMarkerBinder and StaticMDCBinder. + This doesn't impact behavior or correctness, but avoids throwing and catching NoSuchMethodErrors when slf4j + is initialized and avoids linkage linting warnings. + </action> + <action issue="LOG4J2-2885" dev="vy" type="add" due-to="Markus Spann"> + Add support for US-style date patterns and micro/nano seconds to FixedDateTime. + </action> + <action issue="LOG4J2-3116" dev="rgupta" type="add"> + Add JsonTemplateLayout for Google Cloud Platform structured logging layout. + </action> + <action issue="LOG4J2-3067" dev="vy" type="add"> + Add CounterResolver to JsonTemplateLayout. + </action> + <action issue="LOG4J2-3074" dev="vy" type="add"> + Add replacement parameter to ReadOnlyStringMapResolver. + </action> + <action issue="LOG4J2-3051" dev="vy" type="add"> + Add CaseConverterResolver to JsonTemplateLayout. + </action> + <action issue="LOG4J2-3064" dev="rgoers" type="add"> + Add Arbiters and SpringProfile plugin. + </action> + <action issue="LOG4J2-3056" dev="vy" type="add" due-to="Marcono1234"> + Refactor MD5 usage for sharing sensitive information. + </action> + <action issue="LOG4J2-3004" dev="vy" type="add"> + Add plugin support to JsonTemplateLayout. + </action> + <action issue="LOG4J2-3050" dev="rgoers" type="add"> + Allow AdditionalFields to be ignored if their value is null or a zero-length String. + </action> + <action issue="LOG4J2-3049" dev="rgoers" type="add"> + Allow MapMessage and ThreadContext attributes to be prefixed. + </action> + <action issue="LOG4J2=3048" dev="rgoers" type="add"> + Add improved MapMessge support to GelfLayout. + </action> + <action issue="LOG4J2-3044" dev="rgoers" type="add"> + Add RepeatPatternConverter. + </action> + <action issue="LOG4J2-2940" dev="ckozak" type="add"> + Context selectors are aware of their dependence upon the callers ClassLoader, allowing + basic context selectors to avoid the unnecessary overhead of walking the stack to + determine the caller's ClassLoader. + </action> + <action issue="LOG4J2-2940" dev="ckozak" type="add"> + Add BasicAsyncLoggerContextSelector equivalent to AsyncLoggerContextSelector for + applications with a single LoggerContext. This selector avoids classloader lookup + overhead incurred by the existing AsyncLoggerContextSelector. + </action> + <action issue="LOG4J2-3041" dev="rgoers" type="add"> + Allow a PatternSelector to be specified on GelfLayout. + </action> + <action issue="LOG4J2-3141" dev="ckozak" type="add"> + Avoid ThreadLocal overhead in RandomAccessFileAppender, RollingRandomAccessFileManager, + and MemoryMappedFileManager due to the unused setEndOfBatch and isEndOfBatch methods. + The methods on LogEvent are preferred. + </action> + <action issue="LOG4J2-3144" dev="ckozak" type="add"> + Prefer string.getBytes(Charset) over string.getBytes(String) + based on performance improvements in modern Java releases. + </action> + <action issue="LOG4J2-3171" dev="ckozak" type="add"> + Improve PatternLayout performance by reducing unnecessary indirection and branching. + </action> + <!-- FIXES --> + <action issue="LOG4J2-3166" dev="rgoers"> + Fix Log Event Level vs Logger Config Level table. + </action> + <action issue="LOG4J2-2540" dev="rgoers"> + Minor documentation correctsion regarding log levels. + </action> + <action issue="LOG4J2-2541" dev="rgoers" due-to="Gerold Broser"> + Minor documentation corrections in the configuration section. + </action> + <action issue="LOG4J2-2553" dev="rgoers"> + Correct documentation for SyslogAppender when using TLS. + </action> + <action issue="LOG4J2-1798" dev="rgoers" due-to="Viacheslav Zhivaev"> + Handle interrupted exceptions that occur during rollover. + </action> + <action issue="LOG4J2-2951" dev="rgoers"> + Log4j 1.x properties were not being substituted. + </action> + <action issue="LOG4J2-3201" dev="rgoers" type="fix"> + Limit the protocols JNDI can use by default. Limit the servers and classes that can be accessed via LDAP. + </action> + <action issue="LOG4J2-3114" dev="rgoers" type="fix" due-to="Barnabas Bodnar"> + Enable immediate flush on RollingFileAppender when buffered i/o is not enabled. + </action> + <action issue="LOG4J2-3168" dev="rgoers" type="fix" due-to="Benjamin Wöster"> + Fix bug when file names contain regex characters. + </action> + <action issue="LOG4J2-3110" dev="rgoers" type="fix" due-to="Arturo Bernal"> + Fix the number of {}-placeholders in the string literal argument does not match the number of other arguments + to the logging call. + </action> + <action issue="LOG4J2-3060" dev="vy" type="fix" due-to=" Nikita Mikhailov"> + Fix thread-safety issues in DefaultErrorHandler. + </action> + <action issue="LOG4J2-3185" dev="vy" type="fix" due-to="mzbonnt"> + Fix thread-safety issues in DefaultErrorHandler. + </action> + <action issue="LOG4J2-3183" dev="vy" type="fix"> + Avoid using MutableInstant of the event as a cache key in JsonTemplateLayout. + </action> + <action issue="LOG4J2-2829" dev="vy" type="fix"> + SocketAppender should propagate failures when reconnection fails. + </action> + <action issue="LOG4J2-3172" dev="vy" type="fix" due-to="Barry Fleming"> + Buffer immutable log events in the SmtpManager. + </action> + <action issue="LOG4J2-3175" dev="vy" type="fix" due-to="wuqian0808"> + Avoid KafkaManager override when topics differ. + </action> + <action issue="LOG4J2-3160" dev="vy" type="fix" due-to="Lars Bohl"> + Fix documentation on how to toggle log4j2.debug system property. + </action> + <action issue="LOG4J2-3159" dev="ckozak" type="fix"> + Fixed an unlikely race condition in Log4jMarker.getParents() volatile access. + </action> + <action issue="LOG4J2-3153" dev="ckozak" type="fix"> + DatePatternConverter performance is not impacted by microsecond-precision clocks when such precision isn't + required. + </action> + <action issue="LOG4J2-2808" dev="ckozak" type="fix" due-to="Asapha Halifa"> + LoggerContext skips resolving localhost when hostName is configured. + </action> + <action issue="LOG4J2-3150" dev="ckozak" type="fix"> + RandomAccessFile appender uses the correct default buffer size of 256 kB + rather than the default appender buffer size of 8 kB. + </action> + <action issue="LOG4J2-3142" dev="ckozak" type="fix" due-to="John Meikle"> + log4j-1.2-api implements LogEventAdapter.getTimestamp() based on the original event timestamp + instead of returning zero. + </action> + <action issue="LOG4J2-3083" dev="ckozak" type="fix"> + log4j-slf4j-impl and log4j-slf4j18-impl correctly detect the calling class using both LoggerFactory.getLogger + methods as well as LoggerFactory.getILoggerFactory().getLogger. + </action> + <action issue="LOG4J2-2816" dev="vy" type="fix" due-to="Jacob Shields"> + Handle Disruptor event translation exceptions. + </action> + <action issue="LOG4J2-3121" dev="ggregory" type="fix" due-to="Markus Spann"> + log4j2 config modified at run-time may trigger incomplete MBean re-initialization due to InstanceAlreadyExistsException. + </action> + <action issue="LOG4J2-3107" dev="vy" type="fix" due-to="Markus Spann"> + SmtpManager.createManagerName ignores port. + </action> + <action issue="LOG4J2-3080" dev="vy" type="fix"> + Use SimpleMessage in Log4j 1 Category whenever possible. + </action> + <action issue="LOG4J2-3102" dev="ckozak" type="fix"> + Fix a regression in 2.14.1 which allowed the AsyncAppender background thread to keep the JVM alive because + the daemon flag was not set. + </action> + <action issue="LOG4J2-3103" dev="ckozak" type="fix" due-to="Mike Glazer"> + Fix race condition which can result in ConcurrentModificationException on context.stop. + </action> + <action issue="LOG4J2-3092" dev="vy" type="fix" due-to="xmh51"> + Fix JsonWriter memory leaks due to retained excessive buffer growth. + </action> + <action issue="LOG4J2-3089" dev="vy" type="fix" due-to="Tim Perry"> + Fix sporadic JsonTemplateLayoutNullEventDelimiterTest failures on Windows. + </action> + <action issue="LOG4J2-3075" dev="vy" type="fix"> + Fix formatting of nanoseconds in JsonTemplateLayout. + </action> + <action issue="LOG4J2-3087" dev="vy" type="fix" due-to="Anton Klarén"> + Fix race in JsonTemplateLayout where a timestamp could end up unquoted. + </action> + <action issue="LOG4J2-3070" dev="vy" type="fix" due-to="Romain Manni-Bucau"> + Ensure EncodingPatternConverter#handlesThrowable is implemented. + </action> + <action issue="LOG4J2-3054" dev="ckozak" type="fix"> + BasicContextSelector hasContext and shutdown take the default context into account + </action> + <action issue="LOG4J2-2940" dev="ckozak" type="fix"> + Slf4j implementations walk the stack at most once rather than twice to determine the caller's class loader. + </action> + <action issue="LOG4J2-2965" dev="ckozak" type="fix"> + Fixed a deadlock between the AsyncLoggerContextSelector and java.util.logging.LogManager by updating Disruptor to 3.4.4. + </action> + <action issue="LOG4J2-3095" dev="ggregory" type="fix" due-to="Kenny MacLeod, Gary Gregory"> + Category.setLevel should accept null value. + </action> + <action issue="LOG4J2-3174" dev="vy" type="fix" due-to="romainmoreau"> + Wrong subject on mail when it depends on the LogEvent + </action> + <!-- UPDATES --> + <action dev="rgoers" issue="" type="update"> + Update Spring framework to 5.3.13, Spring Boot to 2.5.7, and Spring Cloud to 2020.0.4. + </action> + <action issue="LOG4J2-2025" dev="rgoers" type="update"> + Provide support for overriding the Tomcat Log class in Tomcat 8.5+. + </action> + <action dev="ggregory" issue="" type="update"> + Updated dependencies. + + - com.fasterxml.jackson.core:jackson-annotations ................. 2.12.2 -> 2.12.4 + - com.fasterxml.jackson.core:jackson-core ........................ 2.12.2 -> 2.12.4 + - com.fasterxml.jackson.core:jackson-databind .................... 2.12.2 -> 2.12.4 + - com.fasterxml.jackson.dataformat:jackson-dataformat-xml ........ 2.12.2 -> 2.12.4 + - com.fasterxml.jackson.dataformat:jackson-dataformat-yaml ....... 2.12.2 -> 2.12.4 + - com.fasterxml.jackson.module:jackson-module-jaxb-annotations ... 2.12.2 -> 2.12.4 + - com.fasterxml.woodstox:woodstox-core ........................... 6.2.4 -> 6.2.6 + - commons-io:commons-io .......................................... 2.8.0 -> 2.11.0 + - net.javacrumbs.json-unit:json-unit ............................. 2.24.0 -> 2.25.0 + - net.javacrumbs.json-unit:json-unit ............................. 2.25.0 -> 2.27.0 + - org.apache.activemq:activemq-broker ............................ 5.16.1 -> 5.16.2 + - org.apache.activemq:activemq-broker ............................ 5.16.2 -> 5.16.3 + - org.apache.commons:commons-compress ............................ 1.20 -> 1.21 + - org.apache.commons:commons-csv ................................. 1.8 -> 1.9.0 + - org.apache.commons:commons-dbcp2 ............................... 2.8.0 -> 2.9.0 + - org.apache.commons:commons-pool2 ............................... 2.9.0 -> 2.11.1 + - org.apache.maven.plugins:maven-failsafe-plugin ................. 2.22.2 -> 3.0.0-M5 + - org.apache.maven.plugins:maven-surefire-plugin ................. 2.22.2 -> 3.0.0-M5 + - org.apache.rat:apache-rat-plugin ............................... 0.12 -> 0.13 + - org.assertj:assertj-core ....................................... 3.19.0 -> 3.20.2 + - org.codehaus.groovy:groovy-dateutil ............................ 3.0.7 -> 3.0.8 + - org.codehaus.groovy:groovy-jsr223 .............................. 3.0.7 -> 3.0.8 + - org.codehaus.plexus:plexus-utils ............................... 3.3.0 -> 3.4.0 + - org.eclipse.persistence:javax.persistence ...................... 2.1.1 -> 2.2.1 + - org.eclipse.persistence:org.eclipse.persistence.jpa ............ 2.6.5 -> 2.6.9 + - org.eclipse.persistence:org.eclipse.persistence.jpa ............ 2.7.8 -> 2.7.9 + - org.fusesource.jansi ........................................... 2.3.2 -> 2.3.4 + - org.fusesource.jansi:jansi ..................................... 2.3.1 -> 2.3.2 + - org.hsqldb:hsqldb .............................................. 2.5.1 -> 2.5.2 + - org.junit.jupiter:junit-jupiter-engine ......................... 5.7.1 -> 5.7.2 + - org.junit.jupiter:junit-jupiter-migrationsupport ............... 5.7.1 -> 5.7.2 + - org.junit.jupiter:junit-jupiter-params ......................... 5.7.1 -> 5.7.2 + - org.junit.vintage:junit-vintage-engine ......................... 5.7.1 -> 5.7.2 + - org.liquibase:liquibase-core ................................... 3.5.3 -> 3.5.5 + - org.mockito:mockito-core ....................................... 3.8.0 -> 3.11.2 + - org.mockito:mockito-junit-jupiter .............................. 3.8.0 -> 3.11.2 + - org.springframework:spring-aop ................................. 5.3.3 -> 5.3.9 + - org.springframework:spring-beans ............................... 5.3.3 -> 5.3.9 + - org.springframework:spring-context ............................. 5.3.3 -> 5.3.9 + - org.springframework:spring-context-support ..................... 5.3.3 -> 5.3.9 + - org.springframework:spring-core ................................ 5.3.3 -> 5.3.9 + - org.springframework:spring-expression .......................... 5.3.3 -> 5.3.9 + - org.springframework:spring-oxm ................................. 5.3.3 -> 5.3.9 + - org.springframework:spring-test ................................ 5.3.3 -> 5.3.9 + - org.springframework:spring-web ................................. 5.3.3 -> 5.3.9 + - org.springframework:spring-webmvc .............................. 5.3.3 -> 5.3.9 + - org.tukaani:xz ................................................. 1.8 -> 1.9 + </action> + </release> + <release version="2.14.1" date="2021-03-06" description="GA Release 2.14.1"> + <!-- FIXES --> + <action issue="LOG4J2-3033" dev="rgoers" type="fix"> + Add log method with no parameters - i.e. it has an empty message. + </action> + <action issue="LOG4J2-2947" dev="rgoers" type="fix"> + Document that LogBuilder default methods do nothing. + </action> + <action issue="LOG4J2-2948" dev="vy" type="fix"> + Replace HashSet with IdentityHashMap in ParameterFormatter to detect cycles. + </action> + <action issue="LOG4J2-3028" dev="ckozak" type="fix" due-to="Jakub Kozlowski"> + OutputStreamManager.flushBuffer always resets the buffer, previously the buffer was not reset after an exception. + </action> + <action issue="LOG4J2-2981" dev="rgoers" type="fix"> + OnStartupTriggeringPolicy would fail to cause the file to roll over with DirectWriteTriggeringPolicy + unless minSize was set to 0. + </action> + <action issue="LOG4J2-2990" dev="rgoers" type="fix" due-to="Diogo Monteiro"> + Reduce garbage by using putAll when copying the ThreadContext for SLF4J. + </action> + <action issue="LOG4J2-3006" dev="rgoers" type="fix"> + Directly create a thread instead of using the common ForkJoin pool when initializing ThreadContextDataInjector" + </action> + <action issue="LOG4J2-2624" dev="mattsicker" type="fix" due-to="Tim Perry"> + Allow auto-shutdown of log4j in log4j-web to be turned off and provide a + ServletContextListener "Log4jShutdownOnContextDestroyedListener" to stop log4j. + Register the listener at the top of web.xml to ensure the shutdown happens last. + </action> + <action issue="LOG4J2-1606" dev="mattsicker" type="fix" due-to="Tim Perry"> + Allow auto-shutdown of log4j in log4j-web to be turned off and provide a + ServletContextListener "Log4jShutdownOnContextDestroyedListener" to stop log4j. + Register the listener at the top of web.xml to ensure the shutdown happens last. + </action> + <action issue="LOG4J2-2998" dev="vy" type="fix"> + Fix truncation of excessive strings ending with a high surrogate in JsonWriter. + </action> + <action issue="LOG4J2-2977" dev="vy" due-to="Ron Grabowski"> + Replace outdated PatternLayout.createLayout() calls in docs with createDefaultLayout(). + </action> + <action issue="LOG4J2-2973" dev="vy" type="fix" due-to="Fabio Ricchiuti"> + Rename EventTemplateAdditionalField#type (conflicting with properties file parser) to "format". + </action> + <action issue="LOG4J2-2972" dev="vy" type="fix"> + Refactor AsyncAppender and AppenderControl for handling of Throwables. + </action> + <action issue="LOG4J2-2985" dev="vy" type="fix"> + Add eventTemplateRootObjectKey parameter to JsonTemplateLayout. + </action> + <action issue="LOG4J2-2974" dev="rgoers" type="fix"> + Log4j would fail to initialize in Java 8 with log4j-spring-boot. + </action> + <action issue="LOG4J2-2964" dev="vy" type="fix" due-to="Valery Yatsynovich"> + Merge packages from several Configurations in Composite Configuration. + </action> + <action issue="LOG4J2-2961" dev="vy" type="fix"> + Fix reading of JsonTemplateLayout event additional fields from config. + </action> + <action issue="LOG4J2-2916" dev="vy" type="fix" due-to="wuqian0808"> + Avoid redundant Kafka producer instantiation causing thread leaks. + </action> + <action issue="LOG4J2-2967" dev="ckozak" type="fix"> + Fix JsonTemplateLayout index based parameter resolution when messages contain too few parameters. + </action> + <action issue="LOG4J2-2976" dev="ckozak" type="fix"> + JdbcAppender composes an incorrect INSERT statement without a ColumnMapping element. + </action> + <action issue="LOG4J2-3014" dev="ggregory" type="fix" due-to="Lee Breisacher, Gary Gregory"> + Log4j1ConfigurationConverter on Windows produces "
" at end of every line. + </action> + <action issue="LOG4J2-3131" dev="ggregory" type="fix" due-to="Adam Long, Gary Gregory"> + Attempting to call getExtendedStackTraceAsString() after deserializing JSON LogEvent results in a NPE. + </action> + <action issue="LOG4J2-3131" dev="ggregory" type="fix" due-to="Gary Gregory"> + NoGcLayout allocates empty bytes arrays for its header and footer. + </action> + <!-- ADDS --> + <action issue="LOG4J2-2962" dev="vy" type="add"> + Enrich "map" resolver by unifying its backend with "mdc" resolver. + </action> + <action issue="LOG4J2-2999" dev="vy" type="add"> + Replace JsonTemplateLayout resolver configurations table in docs with sections. + </action> + <action issue="LOG4J2-2993" dev="vy" type="add"> + Support stack trace truncation in JsonTemplateLayout. + </action> + <!-- UPDATES --> + <action issue="LOG4J2-2923" dev="rgoers" type="update"> + Add Rollover Listener to aid in unit test validation. + </action> + <action issue="LOG4J2-2893" dev="rgoers" type="update"> + Allow reconfiguration when Log4j 1 configuration files are updated. + </action> + <action dev="rgoers" type="update"> + Update Spring dependencies to 5.3.2, Spring Boot to 2.3.6, and Spring Cloud to Hoxton.SR9 + </action> + <action dev="ggregory" type="update"> + Update org.fusesource.jansi:jansi 1.17.1 -> 2.0.1. + </action> + <action dev="ggregory" type="update"> + Update commons-codec:commons-codec 1.14 -> 1.15. + </action> + <action dev="ggregory" type="update"> + Update org.apache.commons:commons-lang3 3.10 -> 3.11. + </action> + <action dev="ggregory" type="update"> + Update org.apache.commons:commons-pool2 2.8.1 -> 2.9.0. + </action> + <action dev="ggregory" type="update"> + Update org.apache.commons:commons-dbcp2 2.4.0 -> 2.8.0. + </action> + <action dev="ggregory" type="update"> + Update commons-io:commons-io 2.7 -> 2.8.0. + </action> + <action dev="ggregory" type="update"> + Update org.codehaus.groovy:* 3.0.5 -> 3.0.6. + </action> + <action dev="ggregory" type="update"> + Update com.fasterxml.jackson.*:* 2.11.2 - 2.11.3. + </action> + <action dev="ggregory" type="update"> + Update org.springframework:* 5.2.8.RELEASE -> 5.3.1. + </action> + <action dev="ggregory" type="update"> + Update junit:junit 4.13 -> 4.13.1. + </action> + <action dev="ggregory" type="update"> + Update org.xmlunit:* 2.7.0 -> 2.8.0. + </action> + <action dev="ggregory" type="update"> + Update org.assertj:assertj-core 3.14.0 -> 3.18.1. + </action> + <action dev="ggregory" type="update"> + Update org.awaitility:awaitility 4.0.2 -> 4.0.3. + </action> + <action dev="ggregory" type="update"> + Update org.codehaus.plexus:plexus-utils 3.2.0 -> 3.3.0. + </action> + <action dev="ggregory" type="update"> + Update MongoDB 3 plugin: org.mongodb:mongodb-driver 3.12.6 -> 3.12.7. + </action> + <action dev="ggregory" type="update"> + Update MongoDB 4 plugin: org.mongodb:* 4.1.0 -> 4.1.1. + </action> + <action dev="ggregory" type="update"> + Update org.eclipse.tycho:org.eclipse.osgi 3.12.1.v20170821-1548 -> 3.13.0.v20180226-1711. + </action> + <action dev="ggregory" type="update"> + Update de.flapdoodle.embed:de.flapdoodle.embed.mongo 2.2.0 -> 3.0.0. + </action> + <action dev="ggregory" type="update"> + Update net.javacrumbs.json-unit:json-unit 1.31.1 -> 2.22.0. + </action> + <action dev="ggregory" type="update"> + Update Mockito 3.6.0 -> 3.7.0. + </action> + <action dev="ggregory" type="update"> + Update XML Unit 2.8.0 -> 2.8.2. + </action> + <action dev="ggregory" type="update"> + Update JSON Unit 2.21.0 -> 2.22.0. + </action> + <action dev="ggregory" type="update"> + Update JaCoCo 0.8.3 -> 0.8.6. + </action> + <action dev="ggregory" type="update"> + Update org.apache.activemq:* 5.16.0 -> 5.16.1. + </action> + <action dev="ggregory" type="update"> + Update org.mockito:mockito-* 3.7.0 -> 3.7.7. + </action> + <action dev="ggregory" type="update"> + Update org.springframework:* 5.3.2 -> 5.3.3. + </action> + <action dev="ggregory" type="update"> + Update mongodb4.version 4.1.1 -> 4.2.0. + </action> + <action dev="ggregory" type="update"> + Update org.fusesource.jansi:jansi 1.18 -> 2.2.0. + </action> + <action dev="ggregory" type="update"> + Update org.assertj:assertj-core 3.18.1 -> 3.19.0. + </action> + <action dev="ggregory" type="update"> + Update net.javacrumbs.json-unit:json-unit 2.22.0 -> 2.23.0. + </action> + <action dev="ggregory" type="update"> + Update Woodstox 5.0.3 -> 6.2.3 to match Jackson 2.12.1. + </action> + <action dev="ggregory" type="update"> + Update org.apache.activemq:* 5.16.0 -> 5.16.1. + </action> + <action dev="ggregory" type="update"> + Update org.mockito:mockito-* 3.7.0 -> 3.7.7. + </action> + <action dev="ggregory" type="update"> + Update org.springframework:* 5.3.2 -> 5.3.3. + </action> + <action dev="ggregory" type="update"> + Update mongodb4.version 4.1.1 -> 4.2.0. + </action> + <action dev="ggregory" type="update"> + Update org.fusesource.jansi:jansi 1.18 -> 2.3.1. + </action> + <action dev="ggregory" type="update"> + Update org.assertj:assertj-core 3.18.1 -> 3.19.0. + </action> + <action dev="ggregory" type="update"> + Update net.javacrumbs.json-unit:json-unit 2.22.0 -> 2.23.0. + </action> + <action dev="ggregory" type="update"> + Update net.javacrumbs.json-unit:json-unit 2.22.0 -> 2.23.0. + </action> + <action dev="ggregory" type="update"> + - com.fasterxml.jackson.core:jackson-annotations ................. 2.12.1 -> 2.12.2 + - com.fasterxml.jackson.core:jackson-core ........................ 2.12.1 -> 2.12.2 + - com.fasterxml.jackson.core:jackson-databind .................... 2.12.1 -> 2.12.2 + - com.fasterxml.jackson.dataformat:jackson-dataformat-xml ........ 2.12.1 -> 2.12.2 + - com.fasterxml.jackson.dataformat:jackson-dataformat-yaml ....... 2.12.1 -> 2.12.2 + - com.fasterxml.jackson.module:jackson-module-jaxb-annotations ... 2.12.1 -> 2.12.2 + - org.apache.commons:commons-lang3 ............................... 3.11 -> 3.12.0 + - org.junit.jupiter:junit-jupiter-engine ......................... 5.7.0 -> 5.7.1 + - org.junit.jupiter:junit-jupiter-migrationsupport ............... 5.7.0 -> 5.7.1 + - org.junit.jupiter:junit-jupiter-params ......................... 5.7.0 -> 5.7.1 + - org.junit.vintage:junit-vintage-engine ......................... 5.7.0 -> 5.7.1 + - org.mockito:mockito-core ....................................... 3.7.7 -> 3.8.0 + - org.mockito:mockito-junit-jupiter .............................. 3.7.7 -> 3.8.0 + - org.mongodb:bson ............................................... 4.2.0 -> 4.2.2 + - org.mongodb:mongodb-driver-sync ................................ 4.2.0 -> 4.2.2 + </action> + </release> + <release version="2.14.0" date="2020-11-06" description="GA Release 2.14.0"> + <action issue="LOG4J2-2925" dev="rgoers" type="fix"> + Fix broken link in FAQ. + </action> + <action issue="LOG4J2-2957" dev="vy" type="add"> + Add JsonTemplateLayout. + </action> + <action issue="LOG4J2-2911" dev="rgoers" type="fix"> + Log4j2EventListener in spring.cloud.config.client listens for wrong event. + </action> + <action issue="LOG4J2-2889" dev="mattsicker" type="update" due-to="Geng Yuanzhe"> + Add date pattern support for HTML layout. + </action> + <action issue="LOG4J2-2919" dev="mattsicker" type="fix" due-to="Geng Yuanzhe"> + Call ReliabilityStrategy's beforeStopAppenders() method before stopping AsyncAppender. + </action> + <action issue="LOG4J2-2892" dev="rgoers" type="update" due-to="Jakub Lukes"> + Allow GelfLayout to produce newline delimited events. + </action> + <action issue="LOG4J2-2906" dev="rgoers" type="fix" due-to="Stephen Joyner"> + Fix UnsupportedOperationException when initializing the Log4j2CloudConfigLoggingSystem. + </action> + <action issue="LOG4J2-2908" dev="rgoers" type="fix"> + Move Spring Lookup and Spring PropertySource to its own module. + </action> + <action issue="LOG4J2-2910" dev="rgoers" type="fix"> + Log4j-web should now stores the servlet context as a map entry instead of in the single external context field. + </action> + <action issue="LOG4J2-2822" dev="rgoers" type="fix"> + Javadoc link in ThreadContext description was incorrect. + </action> + <action issue="LOG4J2-2894" dev="rgoers" type="fix"> + Fix spelling error in log message. + </action> + <action issue="LOG4J2-2901" dev="rgoers" type="fix"> + Missing configuration files should be ignored when creating a composite configuration. + </action> + <action issue="LOG4J2-2883" dev="rgoers" type="fix"> + When using DirectFileRolloverStrategy the file pattern was not being recalculated on + size based rollover after a time based rollover had occurred. + </action> + <action issue="LOG4J2-2875" dev="rgoers" type="fix"> + Rollover was failing to create directories when using a DirectFileeRolloverStrategy. + </action> + <action issue="LOG4J2-2859" dev="rgoers" type="fix" due-to="Yanming Zhou"> + Fixed typos where mergeFactory should be mergeStrategy. + </action> + <action issue="LOG4J2-2832" dev="rgoers" type="fix" due-to="Benjamin Asbach"> + Correct class name printed in error message in RollingFileAppender. + </action> + <action issue="LOG4J2-2882" dev="rgoers" type="fix" due-to="Emmanuel Bourg"> + Support java.util.logging filters when using that API. + </action> + <action issue="LOG4J2-2880" dev="rgoers" type="fix"> + Create StackWalker benchmark. Revert back to StackWalker.walk based on benchmark results. + </action> + <action issue="LOG4J2-2867" dev="rgoers" type="fix"> + Obtain ContextDataProviders asynchronously. + </action> + <action issue="LOG4J2-2877" dev="rgoers" type="fix"> + Determine the container id to obtain container and image information. + </action> + <action issue="LOG4J2-2844" dev="ggregory" type="fix"> + Null pointer exception when no network interfaces are available. + </action> + <action issue="LOG4J2-2848" dev="ggregory" type="add"> + Create module log4j-mongodb4 to use new major version 4 MongoDB driver. + </action> + <action issue="LOG4J2-2851" dev="ggregory" type="remove"> + Drop log4j-mongodb2 module. + </action> + <action dev="ggregory" type="update"> + Update MongoDB tests to require Java 8 unconditionally now that Log4j requires Java 8. + </action> + <action dev="ggregory" type="update"> + Update mongodb3.version from 3.12.1 to 3.12.6. + </action> + <action dev="ggregory" type="update"> + Update com.fasterxml.jackson.* 2.10.2 -> 2.11.0. + </action> + <action dev="ggregory" type="update"> + Update org.apache.activemq:activemq-broker 5.15.11 -> 5.16.0. + </action> + <action dev="ggregory" type="update"> + Update org.apache.commons:commons-compress 1.19 -> 1.20. + </action> + <action dev="ggregory" type="update"> + Update org.apache.commons:commons-csv 1.7 -> 1.8. + </action> + <action dev="ggregory" type="update"> + Update org.apache.commons:commons-lang3 3.9 -> 3.10. + </action> + <action dev="ggregory" type="update"> + Update org.codehaus.groovy:* 2.5.6 -> 3.0.5. + </action> + <action dev="ggregory" type="update"> + Update tests junit:junit 4.12 -> 4.13. + </action> + <action dev="ggregory" type="update"> + Update tests commons-io:commons-io 2.6 -> 2.7. + </action> + <action dev="ggregory" type="update"> + Update jackson 2.11.0 -> 2.11.2. + </action> + <action dev="ggregory" type="update"> + Update tests hsqldb 2.5.0 -> 2.5.1. + </action> + <action issue="LOG4J2-2895" dev="ckozak" type="fix"> + Fix potential deadlock in asynchronous logging by avoiding blocking for queue space on Log4jThreads + </action> + <action issue="LOG4J2-2837" dev="ckozak" type="fix"> + Disruptor and JUL no longer recursively start the AsyncLoggerDisruptor + resulting in an extra disruptor background thread constantly waiting. + </action> + <action issue="LOG4J2-2867" dev="ckozak" type="fix"> + RingBufferLogEventTranslator uses a static ContextDataInjector instead of initializing a new object + on each thread. + </action> + <action issue="LOG4J2-2858" dev="ckozak" type="add" due-to="Stepan Gorban"> + More flexible configuration of the Disruptor WaitStrategy. + </action> + <action issue="LOG4J2-2898" dev="ckozak" type="fix" due-to="Turbanov Andrey"> + Avoid initializing volatile fields with default values. + </action> + <action issue="LOG4J2-2899" dev="ckozak" type="fix"> + Fix log4j-1.2-api LogEventWrapper threadId and priority accessors when called multiple times. + </action> + <action issue="LOG4J2-2939" dev="ckozak" type="fix" due-to="Constantin Hirsch"> + Fix NPE in MDCContextMap on 'contains' and 'isEmpty' invocations. + </action> + <action issue="LOG4J2-2954" dev="ckozak" type="fix" due-to="Henry Tung"> + Prevent premature garbage collection of shutdown hooks in DefaultShutdownCallbackRegistry. + </action> + </release> + <release version="2.13.3" date="2020-05-10" description="GA Release 2.13.3"> + <action issue="LOG4J2-2838" dev="rgoers" type="fix"> + Fix NullPointerException in ThreadContextDataInjector. + </action> + </release> + <release version="2.13.2" date="2020-04-23" description="GA Release 2.13.2"> + <action issue="LOG4J2-2824" dev="rgoers" type="fix" due-to="CrazyBills"> + Implement requiresLocation in GelfLayout to reflect whether location information is used in the message Pattern. + </action> + <action issue="LOG4J2-2588" dev="rgoers" type="fix"> + Add option to restore printing timeMillis in the JsonLayout. + </action> + <action issue="LOG4J2-2766" dev="rgoers" type="fix"> + Initialize pattern processor before triggering policy during reconfiguration. + </action> + <action issue="LOG4J2-2457" dev="rgoers" type="update"> + Allow the file extension in the file pattern to be modified during reconfiguration. + </action> + <action issue="LOG4J2-2810" dev="rgoers" type="fix"> + Add information about using a url in log4j.configurationFile. + </action> + <action issue="LOG4J2-2813" dev="rgoers" type="fix" due-to="Keith D Gregory"> + serializeToBytes was checking wrong variable for null. + </action> + <action issue="LOG4J2-2814" dev="rgoers" type="fix"> + Fix Javadoc for ScriptPatternSelector. + </action> + <action issue="LOG4J2-2793" dev="rgoers" type="fix" due-to="Renukaprasad C"> + Allow trailing and leading spaces in log level. +>>>>>>> 4a4b753 [LOG4J2-3242] Rename JNDI enablement property from 'log4j2.enableJndi' to 'log4j2.enableJndiLookup', 'log4j2.enableJndiJms', and 'log4j2.enableJndiContextSelector'. </action> <action issue="LOG4J2-2819" dev="mattsicker" type="update"> Add support for specifying an SSL configuration for SmtpAppender. diff --git a/src/site/xdoc/manual/appenders.xml b/src/site/xdoc/manual/appenders.xml index d1c14fa..03c660e 100644 --- a/src/site/xdoc/manual/appenders.xml +++ b/src/site/xdoc/manual/appenders.xml @@ -1527,6 +1527,12 @@ public class ConnectionFactory { <a name="JMSTopicAppender"/> <subsection name="JMS Appender"> <p>The JMS Appender sends the formatted log event to a JMS Destination.</p> +<<<<<<< log4j-2.12 +======= + <p>The JMS Appender requires JNDI support so as of release 2.16.0 this appender will not function unless + <code>log4j2.enableJndiJms=true</code> is configured as a system property or environment + variable. See the <a href="./configuration.html#enableJndiJms">enableJndiJms</a> system property.</p> +>>>>>>> 4a4b753 [LOG4J2-3242] Rename JNDI enablement property from 'log4j2.enableJndi' to 'log4j2.enableJndiLookup', 'log4j2.enableJndiJms', and 'log4j2.enableJndiContextSelector'. <p> Note that in Log4j 2.0, this appender was split into a JMSQueueAppender and a JMSTopicAppender. Starting in Log4j 2.1, these appenders were combined into the JMS Appender which makes no distinction between queues diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm index 727a323..ef8280d 100644 --- a/src/site/xdoc/manual/configuration.xml.vm +++ b/src/site/xdoc/manual/configuration.xml.vm @@ -1938,6 +1938,59 @@ public class AwesomeTest { </td> </tr> <tr> +<<<<<<< log4j-2.12 +======= + <td><a name="enableJndiContextSelector"/>log4j2.enableJndiContextSelector</td> + <td>LOG4J_ENABLE_JNDI_CONTEXT_SELECTOR</td> + <td>false</td> + <td> + When true, the Log4j context selector that uses the JNDI java protocol is enabled. When false, the default, they are disabled. + </td> + </tr> + <tr> + <td><a name="enableJndiJms"/>log4j2.enableJndiJms</td> + <td>LOG4J_ENABLE_JNDI_JMS</td> + <td>false</td> + <td> + When true, the Log4j JMS Appender that uses JNDI's java protocol is enabled. When false, the default, they are disabled. + </td> + </tr> + <tr> + <td><a name="enableJndiLookup"/>log4j2.enableJndiLookup</td> + <td>LOG4J_ENABLE_JNDI_LOOKUP</td> + <td>false</td> + <td> + When true, the Log4j lookup that uses JNDI's java protocol is enabled. When false, the default, they are disabled. + </td> + </tr> + <tr> + <td><a name="allowedLdapClasses"/>log4j2.allowedLdapClasses</td> + <td>LOG4J_ALLOWED_LDAP_CLASSES</td> + <td> </td> + <td> + System property that specifies fully qualified class names that may be accessed by LDAP. The classes + must implement Serializable. By default only Java primitive classes are allowed. + </td> + </tr> + <tr> + <td><a name="allowedLdapHosts"/>log4j2.allowedLdapHosts</td> + <td>LOG4J_ALLOWED_LDAP_HOSTS</td> + <td> </td> + <td> + System property that adds host names or ip addresses that may be access by LDAP. By default it only allows + the local host names and ip addresses. + </td> + </tr> + <tr> + <td><a name="allowedJndiProtocols"/>log4j2.allowedJndiProtocols</td> + <td>LOG4J_ALLOWED_JNDI_PROTOCOLS</td> + <td> </td> + <td> + System property that adds protocol names that JNDI will allow. By default it only allows java, ldap, and ldaps. + </td> + </tr> + <tr> +>>>>>>> 4a4b753 [LOG4J2-3242] Rename JNDI enablement property from 'log4j2.enableJndi' to 'log4j2.enableJndiLookup', 'log4j2.enableJndiJms', and 'log4j2.enableJndiContextSelector'. <td><a name="uuidSequence"/>log4j2.uuidSequence <br /> (<a name="org.apache.logging.log4j.uuidSequence"/>org.apache.logging.log4j.uuidSequence)