You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2016/10/17 11:19:07 UTC

[1/9] logging-log4j2 git commit: LOG4J2-1623 Configurable JVM shutdown hook timeout

Repository: logging-log4j2
Updated Branches:
  refs/heads/master 197997ac3 -> 19418b37d


LOG4J2-1623  Configurable JVM shutdown hook timeout


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/705e2725
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/705e2725
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/705e2725

Branch: refs/heads/master
Commit: 705e27253ca14cdf0e50039cada041065e308aee
Parents: 3176c96
Author: Mikael St�ldal <mi...@magine.com>
Authored: Mon Oct 3 18:54:27 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Mon Oct 3 18:54:27 2016 +0200

----------------------------------------------------------------------
 .../logging/log4j/core/LoggerContext.java       |  9 ++--
 .../core/config/AbstractConfiguration.java      | 10 +++++
 .../log4j/core/config/Configuration.java        |  2 +
 .../builder/api/ConfigurationBuilder.java       |  7 ++++
 .../config/builder/impl/BuiltConfiguration.java |  4 ++
 .../impl/DefaultConfigurationBuilder.java       | 14 +++++++
 .../composite/CompositeConfiguration.java       |  2 +
 .../core/config/json/JsonConfiguration.java     |  9 ++--
 .../PropertiesConfigurationBuilder.java         |  3 ++
 .../log4j/core/config/xml/XmlConfiguration.java |  3 +-
 .../core/ShutdownTimeoutConfigurationTest.java  | 44 ++++++++++++++++++++
 .../builder/ConfigurationBuilderTest.java       |  5 ++-
 .../resources/log4j-test-shutdownTimeout.xml    | 38 +++++++++++++++++
 src/changes/changes.xml                         |  5 +++
 src/site/xdoc/manual/configuration.xml.vm       |  8 +++-
 15 files changed, 151 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
----------------------------------------------------------------------
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 7e13963..c964965 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
@@ -16,8 +16,6 @@
  */
 package org.apache.logging.log4j.core;
 
-import static org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.SHUTDOWN_HOOK_MARKER;
-
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.io.File;
@@ -38,7 +36,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.config.ConfigurationListener;
-import org.apache.logging.log4j.core.config.ConfigurationSource; // SUPPRESS CHECKSTYLE
+import org.apache.logging.log4j.core.config.ConfigurationSource;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.config.NullConfiguration;
 import org.apache.logging.log4j.core.config.Reconfigurable;
@@ -56,6 +54,8 @@ import org.apache.logging.log4j.spi.LoggerRegistry;
 import org.apache.logging.log4j.spi.Terminable;
 import org.apache.logging.log4j.util.PropertiesUtil;
 
+import static org.apache.logging.log4j.core.util.ShutdownCallbackRegistry.SHUTDOWN_HOOK_MARKER;
+
 /**
  * The LoggerContext is the anchor for the logging system. It maintains a list of all the loggers requested by
  * applications and a reference to the Configuration. The Configuration will contain the configured loggers, appenders,
@@ -265,6 +265,7 @@ public class LoggerContext extends AbstractLifeCycle
             if (factory instanceof ShutdownCallbackRegistry) {
                 LOGGER.debug(SHUTDOWN_HOOK_MARKER, "Shutdown hook enabled. Registering a new one.");
                 try {
+                    final long shutdownTimeoutMillis = this.configuration.getShutdownTimeoutMillis();
                     this.shutdownCallback = ((ShutdownCallbackRegistry) factory).addShutdownCallback(new Runnable() {
                         @Override
                         public void run() {
@@ -272,7 +273,7 @@ public class LoggerContext extends AbstractLifeCycle
                             final LoggerContext context = LoggerContext.this;
                             LOGGER.debug(SHUTDOWN_HOOK_MARKER, "Stopping LoggerContext[name={}, {}]",
                                     context.getName(), context);
-                            context.stop();
+                            context.stop(shutdownTimeoutMillis, TimeUnit.MILLISECONDS);
                         }
 
                         @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
----------------------------------------------------------------------
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 c740b8c..3a6a58e 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
@@ -102,6 +102,11 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
     protected boolean isShutdownHookEnabled = true;
 
     /**
+     * Shutdown timeout in milliseconds.
+     */
+    protected long shutdownTimeoutMillis = 0;
+
+    /**
      * The Script manager.
      */
     protected ScriptManager scriptManager;
@@ -395,6 +400,11 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
         return isShutdownHookEnabled;
     }
 
+    @Override
+    public long getShutdownTimeoutMillis() {
+        return shutdownTimeoutMillis;
+    }
+
     public void setup() {
         // default does nothing, subclasses do work.
     }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
index 1a55b48..95e6edc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configuration.java
@@ -128,6 +128,8 @@ public interface Configuration extends Filterable {
 
     boolean isShutdownHookEnabled();
 
+    long getShutdownTimeoutMillis();
+
     ConfigurationScheduler getScheduler();
 
     /**

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
index 4dc9b69..b115651 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.core.config.builder.api;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Filter;
@@ -367,6 +368,12 @@ public interface ConfigurationBuilder<T extends Configuration> extends Builder<T
      */
     ConfigurationBuilder<T> setShutdownHook(String flag);
 
+    /**
+     * Specifies how long time appenders and other plugins will get to shutdown when the JVM shuts down.
+     * Default is zero. (Not used if {@link #setShutdownHook(String)} is set to "disable".)
+     * @return this builder instance.
+     */
+    ConfigurationBuilder<T> setShutdownTimeout(long timeout, TimeUnit timeUnit);
 
     /**
      * Sets the level of the StatusLogger.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java
index aa7761c..c241dfb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/BuiltConfiguration.java
@@ -147,6 +147,10 @@ public class BuiltConfiguration extends AbstractConfiguration {
         isShutdownHookEnabled = !"disable".equalsIgnoreCase(flag);
     }
 
+    public void setShutdownTimeoutMillis(long shutdownTimeoutMillis) {
+        this.shutdownTimeoutMillis = shutdownTimeoutMillis;
+    }
+
     public void setMonitorInterval(final int intervalSeconds) {
         if (this instanceof Reconfigurable && intervalSeconds > 0) {
             final ConfigurationSource configSource = getConfigurationSource();

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
index d8531d6..183094d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/impl/DefaultConfigurationBuilder.java
@@ -22,6 +22,7 @@ import java.io.StringWriter;
 import java.lang.reflect.Constructor;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
@@ -71,6 +72,7 @@ public class DefaultConfigurationBuilder<T extends BuiltConfiguration> implement
     private String destination;
     private String packages;
     private String shutdownFlag;
+    private long shutdownTimeoutMillis;
     private String advertiser;
     private LoggerContext loggerContext;
     private String name;
@@ -186,6 +188,9 @@ public class DefaultConfigurationBuilder<T extends BuiltConfiguration> implement
             if (shutdownFlag != null) {
                 configuration.setShutdownHook(shutdownFlag);
             }
+            if (shutdownTimeoutMillis > 0) {
+                configuration.setShutdownTimeoutMillis(shutdownTimeoutMillis);
+            }
             if (advertiser != null) {
                 configuration.createAdvertiser(advertiser, source);
             }
@@ -249,6 +254,9 @@ public class DefaultConfigurationBuilder<T extends BuiltConfiguration> implement
         if (shutdownFlag != null) {
             xmlWriter.writeAttribute("shutdownHook", shutdownFlag);
         }
+        if (shutdownTimeoutMillis > 0) {
+            xmlWriter.writeAttribute("shutdownTimeout", String.valueOf(shutdownTimeoutMillis));
+        }
         if (advertiser != null) {
             xmlWriter.writeAttribute("advertiser", advertiser);
         }
@@ -514,6 +522,12 @@ public class DefaultConfigurationBuilder<T extends BuiltConfiguration> implement
     }
 
     @Override
+    public ConfigurationBuilder<T> setShutdownTimeout(final long timeout, final TimeUnit timeUnit) {
+        this.shutdownTimeoutMillis = timeUnit.toMillis(timeout);
+        return this;
+    }
+
+    @Override
     public ConfigurationBuilder<T> setStatusLevel(final Level level) {
         this.level = level;
         return this;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
index fa941d7..e38c62b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/composite/CompositeConfiguration.java
@@ -87,6 +87,8 @@ public class CompositeConfiguration extends AbstractConfiguration implements Rec
                 statusConfig.withDestination(value);
             } else if ("shutdownHook".equalsIgnoreCase(key)) {
                 isShutdownHookEnabled = !"disable".equalsIgnoreCase(value);
+            } else if ("shutdownTimeout".equalsIgnoreCase(key)) {
+                shutdownTimeoutMillis = Long.parseLong(value);
             } else if ("verbose".equalsIgnoreCase(key)) {
                 statusConfig.withVerbosity(value);
             } else if ("packages".equalsIgnoreCase(key)) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/json/JsonConfiguration.java
----------------------------------------------------------------------
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 497496a..5b38dfb 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
@@ -26,6 +26,9 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.AbstractConfiguration;
 import org.apache.logging.log4j.core.config.Configuration;
@@ -40,10 +43,6 @@ import org.apache.logging.log4j.core.config.status.StatusConfiguration;
 import org.apache.logging.log4j.core.util.FileWatcher;
 import org.apache.logging.log4j.core.util.Patterns;
 
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 /**
  * Creates a Node hierarchy from a JSON file.
  */
@@ -81,6 +80,8 @@ public class JsonConfiguration extends AbstractConfiguration implements Reconfig
                     statusConfig.withDestination(value);
                 } else if ("shutdownHook".equalsIgnoreCase(key)) {
                     isShutdownHookEnabled = !"disable".equalsIgnoreCase(value);
+                } else if ("shutdownTimeout".equalsIgnoreCase(key)) {
+                    shutdownTimeoutMillis = Long.parseLong(value);
                 } else if ("verbose".equalsIgnoreCase(entry.getKey())) {
                     statusConfig.withVerbosity(value);
                 } else if ("packages".equalsIgnoreCase(key)) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
index a4362b7..3d24a9b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core.config.properties;
 
 import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Appender;
@@ -54,6 +55,7 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
     private static final String ADVERTISER_KEY = "advertiser";
     private static final String STATUS_KEY = "status";
     private static final String SHUTDOWN_HOOK = "shutdownHook";
+    private static final String SHUTDOWN_TIMEOUT = "shutdownTimeout";
     private static final String VERBOSE = "verbose";
     private static final String DEST = "dest";
     private static final String PACKAGES = "packages";
@@ -89,6 +91,7 @@ public class PropertiesConfigurationBuilder extends ConfigurationBuilderFactory
         builder
             .setStatusLevel(Level.toLevel(rootProperties.getProperty(STATUS_KEY), Level.ERROR))
             .setShutdownHook(rootProperties.getProperty(SHUTDOWN_HOOK))
+            .setShutdownTimeout(Long.parseLong(rootProperties.getProperty(SHUTDOWN_TIMEOUT, "0")), TimeUnit.MILLISECONDS)
             .setVerbosity(rootProperties.getProperty(VERBOSE))
             .setDestination(rootProperties.getProperty(DEST))
             .setPackages(rootProperties.getProperty(PACKAGES))

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
index 2608552..51f31d4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/xml/XmlConfiguration.java
@@ -24,7 +24,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
-
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -120,6 +119,8 @@ public class XmlConfiguration extends AbstractConfiguration implements Reconfigu
                     statusConfig.withDestination(value);
                 } else if ("shutdownHook".equalsIgnoreCase(key)) {
                     isShutdownHookEnabled = !"disable".equalsIgnoreCase(value);
+                } else if ("shutdownTimeout".equalsIgnoreCase(key)) {
+                    shutdownTimeoutMillis = Long.parseLong(value);
                 } else if ("verbose".equalsIgnoreCase(key)) {
                     statusConfig.withVerbosity(value);
                 } else if ("packages".equalsIgnoreCase(key)) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/test/java/org/apache/logging/log4j/core/ShutdownTimeoutConfigurationTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/ShutdownTimeoutConfigurationTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/ShutdownTimeoutConfigurationTest.java
new file mode 100644
index 0000000..5e0734c
--- /dev/null
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/ShutdownTimeoutConfigurationTest.java
@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.junit.LoggerContextRule;
+import org.junit.ClassRule;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ */
+public class ShutdownTimeoutConfigurationTest {
+
+    private static final String CONFIG = "log4j-test-shutdownTimeout.xml";
+
+    @ClassRule
+    public static LoggerContextRule context = new LoggerContextRule(CONFIG);
+
+    @Test
+    public void testShutdownFlag() {
+        final Configuration config = context.getConfiguration();
+        assertNotNull("No configuration", config);
+        assertEquals(5000, config.getShutdownTimeoutMillis());
+    }
+
+}
+

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
index 2d48605..431ac01 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/builder/ConfigurationBuilderTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.core.config.builder;
 
+import java.util.concurrent.TimeUnit;
+
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.appender.ConsoleAppender;
@@ -36,6 +38,7 @@ public class ConfigurationBuilderTest {
     private void addTestFixtures(final String name, final ConfigurationBuilder<BuiltConfiguration> builder) {
         builder.setConfigurationName(name);
         builder.setStatusLevel(Level.ERROR);
+        builder.setShutdownTimeout(5000, TimeUnit.MILLISECONDS);
         builder.add(builder.newScriptFile("target/test-classes/scripts/filter.groovy").addIsWatched(true));
         builder.add(builder.newFilter("ThresholdFilter", Filter.Result.ACCEPT, Filter.Result.NEUTRAL)
                 .addAttribute("level", Level.DEBUG));
@@ -56,7 +59,7 @@ public class ConfigurationBuilderTest {
 
     private final static String expectedXml =
             "<?xml version='1.0' encoding='UTF-8'?>" + EOL +
-            "<Configuration name=\"config name\" status=\"ERROR\" packages=\"foo,bar\">" + EOL +
+            "<Configuration name=\"config name\" status=\"ERROR\" packages=\"foo,bar\" shutdownTimeout=\"5000\">" + EOL +
                 INDENT + "<Properties>" + EOL +
                 INDENT + INDENT + "<Property name=\"MyKey\">MyValue</Property>" + EOL +
                 INDENT + "</Properties>" + EOL +

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/log4j-core/src/test/resources/log4j-test-shutdownTimeout.xml
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/resources/log4j-test-shutdownTimeout.xml b/log4j-core/src/test/resources/log4j-test-shutdownTimeout.xml
new file mode 100644
index 0000000..19b25c9
--- /dev/null
+++ b/log4j-core/src/test/resources/log4j-test-shutdownTimeout.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<Configuration status="OFF" name="XMLConfigTest" monitorInterval="5" shutdownTimeout="5000">
+  <Appenders>
+    <Console name="STDOUT">
+      <PatternLayout pattern="%m MDC%X%n"/>
+    </Console>
+    <List name="List">
+    </List>
+  </Appenders>
+
+  <Loggers>
+    <Logger name="org.apache.logging.log4j.test1" level="debug" additivity="false">
+      <AppenderRef ref="STDOUT"/>
+    </Logger>>
+
+    <Root level="trace">
+      <AppenderRef ref="List"/>
+    </Root>
+  </Loggers>
+
+</Configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index cd2f379..6bd144c 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -23,6 +23,11 @@
     <title>Changes</title>
   </properties>
   <body>
+    <release version="2.7.1" date="2016-XX-XX" description="GA Release 2.7.1">
+      <action issue="LOG4J2-1623" dev="mikes" type="fix">
+        Configurable JVM shutdown hook timeout.
+      </action>
+    </release>
     <release version="2.7" date="2016-10-02" description="GA Release 2.7">
       <action issue="LOG4J2-1618" dev="rpopma" type="fix" due-to="Raman Gupta">
         Fixed ClassCastException when using JUL logging during shutdown.

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/705e2725/src/site/xdoc/manual/configuration.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm
index 60419a4..acd41fd 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -408,6 +408,10 @@ public class Bar {
                  shutdown hook is enabled by default but may be disabled by setting this attribute to "disable"</td>
               </tr>
               <tr>
+                 <td>shutdownTimeout</td>
+                 <td>Specifies how many milliseconds appenders and other plugins will get to shutdown when the JVM shuts down.
+                 Default is zero. (Not used if <tt>shutdownHook</tt> is set to "disable".)</td>
+              <tr>
                 <td>status</td>
                 <td>The level of internal Log4j events that should be logged to the console.
                 Valid values for this attribute are "trace", "debug", "info", "warn", "error" and "fatal".
@@ -841,8 +845,8 @@ public class Bar {
             </p>
             <p>
               Properties configuration files support the advertiser, monitorInterval, name, packages, shutdownHook,
-              status, verbose, and dest attrbutes. See <a href="#ConfigurationSyntax">Configuration Syntax</a> for the
-              definitions of these attributes.
+              shutdownTimeout, status, verbose, and dest attrbutes. See <a href="#ConfigurationSyntax">Configuration Syntax</a>
+              for the definitions of these attributes.
             </p>
           <pre class="prettyprint linenums">
 status = error


[6/9] logging-log4j2 git commit: Merge branch 'master' into LOG4J2-1623

Posted by mi...@apache.org.
Merge branch 'master' into LOG4J2-1623


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/3064471e
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/3064471e
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/3064471e

Branch: refs/heads/master
Commit: 3064471eaa1b7f7d3c5e38349281e1ccdd054cfa
Parents: c92c327 2da9dfa
Author: Mikael St�ldal <mi...@magine.com>
Authored: Thu Oct 6 13:29:28 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Thu Oct 6 13:29:28 2016 +0200

----------------------------------------------------------------------
 log4j-bom/pom.xml                                                | 4 ----
 .../main/java/org/apache/logging/log4j/core/LoggerContext.java   | 2 +-
 .../java/org/apache/logging/log4j/core/util/CyclicBuffer.java    | 4 ++--
 .../org/apache/logging/log4j/core/util/ExecutorServices.java     | 4 ++--
 src/site/site.xml                                                | 1 +
 src/site/xdoc/javadoc.xml                                        | 4 ++++
 6 files changed, 10 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/3064471e/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
----------------------------------------------------------------------


[7/9] logging-log4j2 git commit: LOG4J2-1623 Fix Javadoc

Posted by mi...@apache.org.
LOG4J2-1623 Fix Javadoc


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6482da5b
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6482da5b
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6482da5b

Branch: refs/heads/master
Commit: 6482da5b325a8d42bc79ade754a1d5b904c6dcea
Parents: 3064471
Author: Mikael St�ldal <mi...@magine.com>
Authored: Thu Oct 6 13:42:17 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Thu Oct 6 13:42:17 2016 +0200

----------------------------------------------------------------------
 .../log4j/core/config/builder/api/ConfigurationBuilder.java | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6482da5b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
index b115651..8141c25 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/builder/api/ConfigurationBuilder.java
@@ -369,9 +369,14 @@ public interface ConfigurationBuilder<T extends Configuration> extends Builder<T
     ConfigurationBuilder<T> setShutdownHook(String flag);
 
     /**
-     * Specifies how long time appenders and other plugins will get to shutdown when the JVM shuts down.
-     * Default is zero. (Not used if {@link #setShutdownHook(String)} is set to "disable".)
+     * How long appenders and background tasks will get to shutdown when the JVM shuts down.
+     * Default is zero which mean that each appender uses its default timeout, and don't wait for background
+     * tasks. Not all appenders will honor this, it is a hint and not an absolute guarantee that the shutdown
+     * procedure will not take longer. Setting this too low increase the risk of losing outstanding log events
+     * not yet written to the final destination. (Not used if {@link #setShutdownHook(String)} is set to "disable".)
      * @return this builder instance.
+     *
+     * @see LoggerContext#stop(long, TimeUnit)
      */
     ConfigurationBuilder<T> setShutdownTimeout(long timeout, TimeUnit timeUnit);
 


[9/9] logging-log4j2 git commit: Merge branch 'master' into LOG4J2-1623

Posted by mi...@apache.org.
Merge branch 'master' into LOG4J2-1623

# Conflicts:
#	src/changes/changes.xml


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/19418b37
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/19418b37
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/19418b37

Branch: refs/heads/master
Commit: 19418b37df948609a8852a17f206076048043f6f
Parents: 6482da5 197997a
Author: Mikael St�ldal <mi...@magine.com>
Authored: Mon Oct 17 13:14:16 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Mon Oct 17 13:14:16 2016 +0200

----------------------------------------------------------------------
 .../logging/log4j/util/PropertiesUtil.java      | 597 ++++++++++---------
 .../log4j/core/appender/AbstractAppender.java   |   8 +
 .../log4j/core/appender/ConsoleAppender.java    |  23 +-
 .../core/appender/MemoryMappedFileAppender.java |   2 +-
 .../logging/log4j/core/layout/HtmlLayout.java   |  81 +--
 .../logging/log4j/core/lookup/JndiLookup.java   |   5 +-
 .../appender/ConsoleAppenderBuilderTest.java    |  80 ++-
 pom.xml                                         |   2 +-
 src/changes/changes.xml                         |  11 +-
 9 files changed, 446 insertions(+), 363 deletions(-)
----------------------------------------------------------------------



[5/9] logging-log4j2 git commit: LOG4J2-1623 Update documentation

Posted by mi...@apache.org.
LOG4J2-1623  Update documentation


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/c92c327c
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/c92c327c
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/c92c327c

Branch: refs/heads/master
Commit: c92c327c3db50ff18d01234c0a427d3ad9869588
Parents: 5564556
Author: Mikael St�ldal <mi...@magine.com>
Authored: Wed Oct 5 15:07:55 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Wed Oct 5 15:07:55 2016 +0200

----------------------------------------------------------------------
 .../logging/log4j/core/LoggerContext.java       | 21 +++++++++++++-------
 .../logging/log4j/core/config/Configurator.java | 13 +++++++-----
 src/site/xdoc/manual/configuration.xml.vm       | 10 +++++-----
 3 files changed, 27 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c92c327c/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
----------------------------------------------------------------------
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 2681485..4c759c0 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
@@ -303,15 +303,22 @@ public class LoggerContext extends AbstractLifeCycle
     }
 
     /**
-     * How many milliseconds appenders and other plugins will get to shutdown.
-     *
-     * Not all plugins will honor this, it is a hint and not an absolute guarantee that the this method not block longer.
+     * Blocks until all Log4j tasks have completed execution after a shutdown request and all appenders have shut down,
+     * or the timeout occurs, or the current thread is interrupted, whichever happens first.
+     * <p>
+     * Not all appenders will honor this, it is a hint and not an absolute guarantee that the this method not block longer.
      * Setting timeout too low increase the risk of losing outstanding log events not yet written to the final
      * destination.
-     *
-     * @param timeout the maximum time to wait, or 0 which mean that each plugin uses its default timeout
-     * @param timeUnit the time unit of the timeout argument
-     * @return true if the context was stopped cleanly and normally, false otherwise.
+     * <p>
+     * Log4j can start threads to perform certain actions like file rollovers, calling this method with a positive timeout will
+     * block until the rollover thread is done.
+     *
+     * @param timeout the maximum time to wait, or 0 which mean that each apppender uses its default timeout, and don't wait for background
+    tasks
+     * @param timeUnit
+     *            the time unit of the timeout argument
+     * @return {@code true} if the logger context terminated and {@code false} if the timeout elapsed before
+     *         termination.
      * @since 2.7
      */
     @Override

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c92c327c/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
index 3da469d..28dd85f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
@@ -346,13 +346,12 @@ public final class Configurator {
     }
 
     /**
-     * Blocks until all Log4j tasks have completed execution after a shutdown request, or the timeout occurs, or the
-     * current thread is interrupted, whichever happens first.
+     * Shuts down the given logger context.
      * <p>
-     * Log4j can start threads to perform certain actions like file rollovers, calling this method with a timeout will
-     * block until the rollover thread is done.
+     * Log4j can start threads to perform certain actions like file rollovers; calling this method with a positive
+     * timeout will block until the rollover thread is done.
      * </p>
-     * 
+     *
      * @param ctx
      *            the logger context to shut down, may be null.
      * @param timeout
@@ -361,6 +360,10 @@ public final class Configurator {
      *            the time unit of the timeout argument
      * @return {@code true} if the logger context terminated and {@code false} if the timeout elapsed before
      *         termination.
+     *
+     * @see LoggerContext#stop(long, TimeUnit)
+     *
+     * @since 2.7
      */
     public static boolean shutdown(final LoggerContext ctx, final long timeout, final TimeUnit timeUnit) {
         if (ctx != null) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c92c327c/src/site/xdoc/manual/configuration.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm
index 2b59e8d..2117dd2 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -409,11 +409,11 @@ public class Bar {
               </tr>
               <tr>
                  <td>shutdownTimeout</td>
-                 <td>Specifies how many milliseconds appenders and other plugins will get to shutdown when the JVM shuts
-                 down. Default is zero which mean that each plugin uses its default timeout. Not all plugins will honor
-                 this, it is a hint and not an absolute guarantee that the shutdown procedure will not take longer.
-                 Setting this too low increase the risk of losing outstanding log events not yet written to the final
-                 destination. See <a class="javadoc"
+                 <td>Specifies how many milliseconds appenders and background tasks will get to shutdown when the JVM shuts
+                 down. Default is zero which mean that each appender uses its default timeout, and don't wait for background
+                 tasks. Not all appenders will honor this, it is a hint and not an absolute guarantee that the shutdown
+                 procedure will not take longer. Setting this too low increase the risk of losing outstanding log events
+                 not yet written to the final destination. See <a class="javadoc"
                  href="../log4j-core/target/site/apidocs/org/apache/logging/log4j/core/LoggerContext.html#stop(long, java.util.concurrent.TimeUnit)">LoggerContext.stop(long, java.util.concurrent.TimeUnit)</a>.
                   (Not used if <tt>shutdownHook</tt> is set to "disable".)</td>
               <tr>


[8/9] logging-log4j2 git commit: Merge branch 'master' into LOG4J2-1623

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/19418b37/src/changes/changes.xml
----------------------------------------------------------------------
diff --cc src/changes/changes.xml
index 6bd144c,d935048..2922511
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@@ -1,3090 -1,3096 +1,3099 @@@
 -<?xml version="1.0" encoding="UTF-8"?>
 -<!-- vi: set sw=2: -->
 -<!--
 -   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.
 --->
 -<document xmlns="http://maven.apache.org/changes/1.0.0"
 -          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 -          xsi:schemaLocation="http://maven.apache.org/changes/1.0.0 http://maven.apache.org/xsd/changes-1.0.0.xsd">
 -  <properties>
 -    <title>Changes</title>
 -  </properties>
 -  <body>
 -    <release version="2.7.1" date="2016-MM-DD" description="GA Release 2.7.1">
 -      <action issue="LOG4J2-1636" dev="ggregory" type="fix" due-to="Eldar Gabdullin">
 -        Console Appender does not pick up Oracle Java 8's sun.stdout.encoding and sun.stderr.encoding.
 -      </action>
 -      <action issue="LOG4J2-1639" dev="ggregory" type="fix" due-to="Sridhar Gopinath">
 -        Fix MemoryMappedFileAppender.createAppender() Javadoc for immediateFlush.
 -      </action>
 -      <action issue="LOG4J2-1641" dev="ggregory" type="update">
 -        Update JeroMQ from 0.3.5 to 0.3.6.
 -      </action>
 -    </release>
 -    <release version="2.7" date="2016-10-02" description="GA Release 2.7">
 -      <action issue="LOG4J2-1618" dev="rpopma" type="fix" due-to="Raman Gupta">
 -        Fixed ClassCastException when using JUL logging during shutdown.
 -      </action>
 -      <action issue="LOG4J2-1620" dev="ggregory" type="fix" due-to="Sascha Scholz">
 -        2.7-rc1: RollingFileAppender immediateFlush default value should be true, not false.
 -      </action>
 -      <action issue="LOG4J2-1611" dev="rpopma" type="fix">
 -        Improved performance of context data injector for web applications to be on par with standalone applications.
 -      </action>
 -      <action issue="LOG4J2-1591" dev="rpopma" type="fix">
 -        Introduced new interface LifeCycle2 with stop(long,TimeUnit) method to avoid breaking backwards compatibility with new Configurator.shutdown(LoggerContext, long, TimeUnit) API.
 -      </action>
 -      <action issue="LOG4J2-1590" dev="rpopma" type="fix">
 -        Fixed issue with filters extending AbstractFilter that did not override methods with unrolled varargs.
 -      </action>
 -      <action issue="LOG4J2-1583" dev="rpopma" type="fix" due-to="Larry West">
 -        Fixed scrambled log messages triggered by nested logging from toString() method of a logging parameter object.
 -      </action>
 -      <action issue="LOG4J2-1259" dev="ggregory" type="fix" due-to="Misagh Moayyed, Steffen Offermann">
 -        Log4j threads are no longer leaking on Tomcat shutdown.
 -      </action>
 -      <action issue="LOG4J2-1051" dev="rpopma" type="fix" due-to="Lukasz Lenart">
 -        When starting on Google App Engine, Interpolator now suppresses the NoClassDefFoundError stack trace  for the jvmrunargs lookup.
 -      </action>
 -      <action issue="LOG4J2-1582" dev="rpopma" type="fix">
 -        When initializing on platforms where JMX is not available, Interpolator component no longer prints stack trace for warning messages.
 -      </action>
 -      <action issue="LOG4J2-1581" dev="rpopma" type="fix">
 -        Unregistering JMX components no longer prints a stack trace when the MBean has already been unregistered.
 -      </action>
 -      <action issue="LOG4J2-1313" dev="rpopma" type="fix" due-to="Philipp Knobel, Leon Finker">
 -        Support Property values to be specified in configuration as a value attribute as well as an element.
 -      </action>
 -      <action issue="LOG4J2-1575" dev="rpopma" type="fix">
 -        (GC) LoggerConfig now stores configuration properties in a List, not a Map to prevent creating temporary Iterator objects. Added method LoggerConfig#getPropertyList(), deprecated method #getProperties().
 -      </action>
 -      <action issue="LOG4J2-1457" dev="mattsicker" type="fix" due-to="Leon Finker">
 -        Fixed class loader deadlock when using async logging and extended stack trace pattern.
 -      </action>
 -      <action issue="LOG4J2-1563" dev="ggregory" type="fix" due-to="Jason Tedor">
 -        Fix to prevent Log4j 2.6.2 and higher from losing exceptions when a security manager is present.
 -      </action>
 -      <action issue="LOG4J2-1530" dev="mikes" type="fix">
 -        Fixed issue where LogEvent.getContextStack() returned null.
 -      </action>
 -      <action issue="LOG4J2-1518" dev="rpopma" type="fix" due-to="Leon Finker">
 -        Prevent deadlock in Async Loggers when queue is full and logged Object's toString() logs another message.
 -      </action>
 -      <action issue="LOG4J2-1542" dev="rpopma" type="fix" due-to="Rog�rio Lecari�o Leite">
 -        Prevent ArrayIndexOutOfBoundsException in ParameterizedMessage.formatTo for single-char or empty messages.
 -      </action>
 -      <action issue="LOG4J2-1549" dev="mikes" type="fix" due-to="Jason Bedard">
 -        Fixed issue where AsyncLoggerContextSelector+PropertiesConfigurationBuilder defaulted to includeLocation=true.
 -      </action>
 -      <action issue="LOG4J2-1562" dev="ggregory" type="fix">
 -        Prevent SocketAppender memory usage from growing unbounded if it cannot connect to a server.
 -      </action>
 -      <action issue="LOG4J2-1559" dev="ggregory" type="fix" due-to="Andrey Plotkin">
 -        Prevent NPE in Level.isInRange.
 -      </action>
 -      <action issue="LOG4J2-1511" dev="ggregory" type="fix" due-to="Srikanth Surukuntu">
 -        DynamicThresholdFilter filtered incorrectly when params were passed as individual arguments instead of varargs.
 -      </action>
 -      <action issue="LOG4J2-1548" dev="ggregory" type="fix">
 -        [CronTriggeringPolicy] ConfigurationScheduler scheduled the task infinitely after first fire.
 -      </action>
 -      <action issue="LOG4J2-1506" dev="ggregory" type="fix" due-to="Johannes Schleger">
 -        Log4j should not unregister JMX MBeans when log4j2.disable.jmx property is true.
 -      </action>
 -      <action issue="LOG4J2-1490" dev="ggregory" type="fix" due-to="Krzysztof Taborski">
 -        Log4j2 should postpone creating log file until the appender actually receives an event.
 -      </action>
 -      <action issue="LOG4J2-1320" dev="ggregory" type="fix" due-to="Paresh Varke, Pierrick Hymbert">
 -        Support loading custom plugins from jar files and directories whose classpath entries use the "vfs" URL protocol.
 -      </action>
 -      <action issue="LOG4J2-1541" dev="ggregory" type="fix">
 -        Fix file handle resource leak in XmlConfiguration.XmlConfiguration(ConfigurationSource).
 -      </action>
 -      <action issue="LOG4J2-1538" dev="ggregory" type="fix" due-to="Igor Karpov">
 -        Prevent NPE when dynamically removing filters.
 -      </action>
 -      <action issue="LOG4J2-1532" dev="ggregory" type="fix">
 -        Attributes were not merged properly in composite configurations.
 -      </action>
 -      <action issue="LOG4J2-1529" dev="mattsicker" type="fix" due-to="Sridevi Narra">
 -        Attributes were not merged properly in composite configurations.
 -      </action>
 -      <action issue="LOG4J2-1527" dev="rpopma" type="fix" due-to="Jose Leon">
 -        Prevent NPE in RingBufferLogEvent.getFormattedMessage() when used in web applications.
 -      </action>
 -      <action issue="LOG4J2-905" dev="ggregory" type="fix" due-to="Moritz L�ser">
 -        Added ability to disable (date) lookup completely for compatibility with other libraries like Camel.
 -      </action>
 -      <action issue="LOG4J2-1526" dev="mikes" type="fix">
 -        Added support for setting StatusLogger destination in ConfigurationBuilder.
 -      </action>
 -      <action issue="LOG4J2-1448" dev="rpopma" type="fix" due-to="Keith Laban">
 -        Allow comma separated agents, host list to be passed to FlumeAppender.
 -      </action>
 -      <action issue="LOG4J2-1500" dev="ggregory" type="fix" due-to="Jose Leon">
 -        Merging configurations failed with an NPE when comparing Nodes with different attributes.
 -      </action>
 -      <action issue="LOG4J2-1482" dev="ggregory" type="fix" due-to="Sumit Singhal">
 -        Fixed improper header in CsvParameterLayout.
 -      </action>
 -      <action issue="LOG4J2-1199" dev="rpopma" type="fix">
 -        Documented that JVM Input Arguments Lookup (JMX) is not available on Google App Engine.
 -      </action>
 -      <action issue="LOG4J2-1438" dev="rpopma" type="fix">
 -        (GC) Added method getParameter() to ObjectMessage (and ReusableObjectMessage).
 -      </action>
 -      <action issue="LOG4J2-1488" dev="rpopma" type="fix" due-to="Richard Zschech">
 -        (GC) Fixed ISO8601 %date conversion pattern with a period '.' separator for milliseconds is now garbage free.
 -      </action>
 -      <action issue="LOG4J2-1489" dev="rpopma" type="fix" due-to="Richard Zschech">
 -        (GC) Fixed %date conversion patterns with a timezone parameter are now garbage free.
 -      </action>
 -      <action issue="LOG4J2-1279" dev="rpopma" type="fix" due-to="Tony Baines">
 -        Prevent NullPointerException in FastDateParser$TimeZoneStrategy.
 -      </action>
 -      <action issue="LOG4J2-1341" dev="rpopma" type="fix" due-to="Richard Zschech">
 -        (GC) HighlightConverter and StyleConverter are now GC-free.
 -      </action>
 -      <action issue="LOG4J2-1467" dev="rpopma, ggregory" type="fix" due-to="Ralf, Gary Gregory">
 -        [OSGi] Fixed missing import package.
 -      </action>
 -      <action issue="LOG4J2-351" dev="rpopma, ggregory" type="fix" due-to="Roland Weiglhofer">
 -        [OSGi] Fixed wrong Fragment-Host in manifest files.
 -      </action>
 -      <action issue="LOG4J2-1313" dev="rpopma" type="fix" due-to="Philipp Knobel">
 -        Properties declared in configuration can now have their value either in the element body or in an attribute named "value".
 -      </action>
 -      <action issue="LOG4J2-1235" dev="ggregory" type="fix" due-to="Niranjan Rao, Sascha Scholz, Aleksey Zvolinsky">
 -        org.apache.logging.log4j.core.appender.routing.IdlePurgePolicy was not working correctly.
 -      </action>
 -      <action issue="LOG4J2-1502" dev="ggregory" type="fix" due-to="Sumit Singhal">
 -        Fixed issue where CsvParameterLayout and CsvLogEventLayout inserted NUL characters if data starts with {, (, [ or "
 -      </action>
 -      <action issue="LOG4J2-1573" dev="ggregory" type="fix" due-to="Steffen Offermann">
 -        Layout is no longer optional.
 -      </action>
 -      <action issue="LOG4J2-1608" dev="ggregory" type="fix">
 -        ServletAppender does not provide throwable object to ServletContext.
 -      </action>
 -      <action issue="LOG4J2-1599" dev="ggregory" type="fix">
 -        Prevent potential NPE in org.apache.logging.log4j.message.ParameterFormatter.formatMessage3(StringBuilder, char[], int, Object[], int, int[]).
 -      </action>
 -      <action issue="LOG4J2-1600" dev="ggregory" type="fix">
 -        Prevent potential NPE due to org.apache.logging.log4j.core.layout.MarkerPatternSelector.createSelector(PatternMatch[], String, boolean, boolean, Configuration).
 -      </action>
 -      <action issue="LOG4J2-1601" dev="ggregory" type="fix">
 -        Prevent potential NPE due to org.apache.logging.log4j.core.layout.ScriptPatternSelector.createSelector(AbstractScript, PatternMatch[], String, boolean, boolean, Configuration).
 -      </action>
 -      <action issue="LOG4J2-1602" dev="ggregory" type="fix">
 -        Prevent potential NPE in org.apache.logging.log4j.core.util.datetime.FormatCache.MultipartKey.equals(Object) when object is null.
 -      </action>
 -      <action issue="LOG4J2-1603" dev="ggregory" type="fix">
 -        Redo hashCode() and equals() methods in org.apache.logging.log4j.core.net.ssl classes.
 -      </action>
 -      <action issue="LOG4J2-1610" dev="ggregory" type="fix" due-to="Shubhankar">
 -        Add targetNamespace to log4j-config.xsd. GitHub #43.
 -      </action>
 -      <action issue="LOG4J2-1619" dev="ggregory" type="fix">
 -        new Log4jLogEvent().toString() throws an NPE.
 -      </action>
 -      <action issue="LOG4J2-1578" dev="ggregory" type="add">
 -        RoutingAppender can be configured with scripts. Add Script in a Routes element.
 -      </action>
 -      <action issue="LOG4J2-1597" dev="ggregory" type="add">
 -        Add a ScriptAppenderSelector to create an Appender specified by a Script.
 -      </action>
 -      <action issue="LOG4J2-1349" dev="rpopma" type="add">
 -        (GC) Added support for garbage-free ThreadContext map. Disabled by default, users need to enable this explicitly.
 -      </action>
 -      <action issue="LOG4J2-1447" dev="rpopma" type="add">
 -        (GC) Changed LogEvent's internal data structure for context data to be garbage-free. Added method LogEvent#getContextData(), deprecated method #getContextMap().
 -      </action>
 -      <action issue="LOG4J2-1010" dev="rpopma" type="add" due-to="Mikael St�ldal">
 -        Users can now inject context data from other sources than ThreadContext. Values can be any Object, not just Strings.
 -      </action>
 -      <action issue="LOG4J2-1568" dev="mattsicker" type="add">
 -        Added support for java.util.concurrent.LinkedTransferQueue to AsyncAppender.
 -      </action>
 -      <action issue="LOG4J2-1430" dev="mattsicker" type="add" due-to="John Cairns">
 -        Added optional support for Conversant DisruptorBlockingQueue in AsyncAppender.
 -      </action>
 -      <action issue="LOG4J2-1439" dev="mattsicker" type="add" due-to="Anthony Maire">
 -        Added optional support for JCTools MPSC bounded lock-free queue in AsyncAppender.
 -      </action>
 -      <action issue="LOG4J2-1558" dev="ggregory" type="add">
 -        SocketAppender now supports IO buffering.
 -      </action>
 -      <action issue="LOG4J2-1557" dev="ggregory" type="add">
 -        Add a Builder for the SocketAppender (deprecates factory method).
 -      </action>
 -      <action issue="LOG4J2-1609" dev="ggregory" type="add">
 -        Add a Builder to ServletAppender and deprecate factory method.
 -      </action>
 -      <action issue="LOG4J2-1553" dev="ggregory" type="add">
 -        AbstractManager now implements AutoCloseable.
 -      </action>
 -      <action issue="LOG4J2-1528" dev="mikes" type="add">
 -        Added ability to generate Log4j 2-style XML configuration file from ConfigurationBuilder.
 -      </action>
 -      <action issue="LOG4J2-1181" dev="mikes" type="add">
 -        Added Logging API for Scala 2.10 and 2.11.
 -      </action>
 -      <action issue="LOG4J2-1512" dev="mikes" type="add">
 -        Added options to exclude stack trace from JSON, XML and YAML layouts.
 -      </action>
 -      <action issue="LOG4J2-1539" dev="ggregory" type="add">
 -        Added Core API Configurator.shutdown(LoggerContext, long, TimeUnit).
 -      </action>
 -      <action issue="LOG4J2-1501" dev="ggregory" type="add">
 -        FileAppender is now able to create files on-demand.
 -      </action>
 -      <action issue="LOG4J2-1504" dev="ggregory" type="add">
 -        RollingFileAppender is now able to create files on-demand.
 -      </action>
 -      <action issue="LOG4J2-1471" dev="ggregory" type="add">
 -        [PatternLayout] Add an ANSI option to %xThrowable.
 -      </action>
 -      <action issue="LOG4J2-1472" dev="ggregory" type="add">
 -        org.apache.logging.log4j.core.LoggerContext now implements Closeable.
 -      </action>
 -      <action issue="LOG4J2-1458" dev="ggregory" type="add">
 -        [PatternLayout] Add an ANSI option to %message.
 -      </action>
 -      <action issue="LOG4J2-1505" dev="ggregory" type="add">
 -        Create a Builder for the FileAppender plugin to facilitate adding attributes in the future.
 -      </action>
 -      <action issue="LOG4J2-1507" dev="ggregory" type="add">
 -        Allow Builders to be completely generic.
 -      </action>
 -      <action issue="LOG4J2-1508" dev="ggregory" type="add">
 -        Allow a Builder to subclass another Builder.
 -      </action>
 -      <action issue="LOG4J2-1516" dev="rpopma" type="add" due-to="Gary Gregory">
 -        Add ThreadContextMap2 interface supporting method putAll(Map&lt;String, String&gt;).
 -      </action>
 -      <action issue="LOG4J2-1519" dev="ggregory" type="add">
 -        Add ThreadContext.putAll(Map&lt;String, String&gt;).
 -      </action>
 -      <action issue="LOG4J2-1520" dev="ggregory" type="add">
 -        Add JUnit Rule implementations to manage the thread context.
 -      </action>
 -      <action issue="LOG4J2-1547" dev="ggregory" type="add">
 -        The Core AbstractConfiguration now tracks its LoggerContext and add Configuration.getLoggerContext().
 -      </action>
 -      <action issue="LOG4J2-1540" dev="ggregory" type="add">
 -        The Core AbstractManager now tracks its LoggerContext.
 -      </action>
 -      <action issue="LOG4J2-1577" dev="ggregory" type="add">
 -        Add a Builder to the RoutingAppender and deprecate factory method.
 -      </action>
 -      <action issue="LOG4J2-1604" dev="ggregory" type="update" due-to="Colin Hillman">
 -        Log4j2 TcpSocketServer in background.
 -      </action>
 -      <action issue="LOG4J2-1574" dev="ggregory" type="update">
 -        Allow the RollingFileAppender to use default pattern layout.
 -      </action>
 -      <action issue="LOG4J2-1556" dev="ggregory" type="update">
 -        Custom Log4j threads now extend Log4jThread.
 -      </action>
 -      <action issue="LOG4J2-1605" dev="ggregory" type="update">
 -        Improve error messages for TcpSocketServer and UdpSocketServer.
 -      </action>
 -      <action issue="LOG4J2-1458" dev="ggregory" type="update">
 -        Updated Jackson from 2.7.5 to 2.8.0.
 -      </action>
 -      <action issue="LOG4J2-1494" dev="ggregory" type="update">
 -        Updated Jackson from 2.8.0 to 2.8.1.
 -      </action>
 -      <action issue="LOG4J2-1569" dev="ggregory" type="update">
 -        Updated Jackson from 2.8.1 to 2.8.2.
 -      </action>
 -      <action issue="LOG4J2-1598" dev="ggregory" type="update">
 -        Updated Jackson from 2.8.2 to 2.8.3.
 -      </action>
 -      <action issue="LOG4J2-1495" dev="ggregory" type="update">
 -        Updated LMAX Disruptor from 3.3.4 to 3.3.5.
 -      </action>
 -      <action issue="LOG4J2-1496" dev="ggregory" type="update">
 -        Updated Kafka client from 0.9.1.0 to 0.10.0.0.
 -      </action>
 -      <action issue="LOG4J2-1533" dev="ggregory" type="update">
 -        Updated Kafka client from 0.10.0.0 to 0.10.0.1.
 -      </action>
 -      <action issue="LOG4J2-1487" dev="ggregory" type="update">
 -        Updated JMS test from ActiveMQ 5.13.3 to 5.13.4.
 -      </action>
 -      <action issue="LOG4J2-1551" dev="ggregory" type="update">
 -        Updated JMS test from ActiveMQ 5.13.4 to 5.14.0.
 -      </action>
 -      <action issue="LOG4J2-1543" dev="ggregory" type="update">
 -        Removed deprecated Core API org.apache.logging.log4j.core.util.Constants.UTF_8.
 -      </action>
 -      <action issue="LOG4J2-1544" dev="ggregory" type="update">
 -        Removed deprecated Core API org.apache.logging.log4j.core.util.Assert.requireNonNull(T, String).
 -      </action>
 -      <action issue="LOG4J2-1545" dev="ggregory" type="update">
 -        Removed deprecated Web API org.apache.logging.log4j.web.WebLookup.getServletContext().
 -      </action>
 -    </release>
 -    <release version="2.6.2" date="2016-07-05" description="GA Release 2.6.2">
 -      <action issue="LOG4J2-904" dev="rgoers" type="fix" due-to="Bernhard M�hr">
 -        If copy and delete fails in rename action then resort to truncating the source file after copying it.
 -      </action>
 -      <action issue="LOG4J2-1250" dev="rgoers" type="fix">
 -        CronTriggeringPolicy was not properly setting the prevFileTime value for the PatternProcessor so
 -        file dates and times on rolled files were incorrect.
 -      </action>
 -      <action issue="LOG4J2-1452" dev="rpopma" type="fix" due-to="Mikael St�ldal">
 -        Fixed issue where reusable messages broke flow tracing logic.
 -      </action>
 -      <action issue="LOG4J2-1440" dev="rgoers" type="fix">
 -        Fix bug in OnStartupTriggeringPolicy that allowed it to roll over on every reconfiguration. Added
 -        minSize attribute.
 -      </action>
 -      <action issue="LOG4J2-1414" dev="rpopma" type="fix" due-to="Ralph Goers">
 -        Fixed minor issues with the 2.6.1 web site.
 -      </action>
 -      <action issue="LOG4J2-1434" dev="rpopma" type="fix" due-to="Luke Butters">
 -        Ensure that the thread-local StringBuilders used by Layouts to format log events to text will not
 -        retain excessive memory after a large message was logged.
 -      </action>
 -      <action issue="LOG4J2-1395" dev="mikes" type="add">
 -        Add "direct" option to ConsoleAppender for increased performance.
 -      </action>
 -      <action issue="LOG4J2-1418" dev="mikes" type="fix">
 -        Provide MessageFactory2 to custom Logger implementations.
 -      </action>
 -      <action issue="LOG4J2-1420" dev="rgoers" type="fix">
 -        RollingRandomAccessFileManager was not properly rolling over on startup and was getting a NullPointerException.
 -      </action>
 -      <action issue="LOG4J2-1417" dev="rpopma" type="fix">
 -        Fixed issue where Unbox utility ignored the value Constants.ENABLE_THREADLOCALS and always stored non-JDK classes in ThreadLocals.
 -      </action>
 -      <action issue="LOG4J2-1422" dev="rpopma" type="fix">
 -        Fixed issue where AsyncAppenderQueueFullPolicyTest sometimes hangs.
 -      </action>
 -      <action issue="LOG4J2-1445" dev="ggregory" type="fix" due-to="Ludovic HOCHET">
 -        OnStartupTriggeringPolicyTest fails on Windows saying the file is used by another process.
 -      </action>
 -      <action issue="LOG4J2-1437" dev="rpopma" type="add">
 -        (GC) ObjectMessage and ReusableObjectMessage now avoid calling toString() on auto-boxed primitive parameters.
 -      </action>
 -      <action issue="LOG4J2-1415" dev="rpopma" type="add">
 -        (GC) ParameterFormatter now avoids calling toString() on auto-boxed primitive message parameters.
 -      </action>
 -      <action issue="LOG4J2-1412" dev="rpopma" type="add">
 -        Unbox utility's ringbuffer of StringBuilders is now configurable.
 -      </action>
 -      <action issue="LOG4J2-1432" dev="ggregory" type="update">
 -        Update Jackson from 2.7.4 to 2.7.5.
 -      </action>
 -      <action issue="LOG4J2-1433" dev="ggregory" type="update">
 -        Update Jansi from 1.11 to 1.13.
 -      </action>
 -      <action issue="LOG4J2-1444" dev="ggregory" type="update">
 -        Update Apache Commons Compress from 1.11 to 1.12.
 -      </action>
 -    </release>
 -    <release version="2.6.1" date="2016-06-05" description="GA Release 2.6.1">
 -      <action issue="LOG4J2-1405" dev="rgoers" type="fix">
 -        OnStartupTriggeringPolicy was forcing a rollover of empty files at startup and would append a second footer that was added by the prior shutdown.
 -      </action>
 -      <action issue="LOG4J2-1406" dev="rpopma" type="fix" due-to="Trask Stalnaker">
 -        Fixed bug in ReusableParameterizedMessage where Throwable was never updated so first error was logged over and over again and subsequent errors were not logged.
 -      </action>
 -      <action issue="LOG4J2-1409" dev="rpopma" type="fix" due-to="Shahan">
 -        Fixed ArrayIndexOutOfBoundsException that may occur in ReusableParameterizedMessage.
 -      </action>
 -      <action issue="LOG4J2-997" dev="rgoers" type="fix" due-to="Maytee Chinavanichkit">
 -        Add filter and remove filter were not working properly in AbstractFilterable.
 -      </action>
 -      <action issue="LOG4J2-1032" dev="rgoers" type="fix">
 -        Changed RenameAction to use java.nio to better report rename failures.
 -      </action>
 -      <action issue="LOG4J2-1407" dev="ggregory" type="fix">
 -        Fixed misleading WARN log events from Log4j about message factories and unexpected formatting.
 -      </action>
 -      <action issue="LOG4J2-1408" dev="ggregory" type="fix">
 -        Added the module log4j-liquibase to BOM POM.
 -      </action>
 -      <action issue="LOG4J2-1180" dev="ggregory" type="fix">
 -        Logger cache now accounts for message factory.
 -      </action>
 -      <action issue="LOG4J2-1402" dev="rgoers" type="fix">
 -        Fix regression in properties configuration to support arbitrary component ids.
 -      </action>
 -      <action issue="LOG4J2-1385" dev="ggregory" type="update">
 -        (GC) CSV layouts should not create a new CSVPrinter for each log event. Requires Apache Commons CSV 1.4.
 -      </action>
 -      <action issue="LOG4J2-1398" dev="ggregory" type="update">
 -        Update liquibase-core from 3.4.2 to 3.5.1.
 -      </action>
 -      <action issue="LOG4J2-1399" dev="ggregory" type="update">
 -        Update Apache Commons CSV from 1.3 to 1.4.
 -      </action>
 -      <action issue="LOG4J2-1411" dev="mattsicker" type="add">
 -        Added documentation about plugin builders compared to factories.
 -      </action>
 -      <action issue="LOG4J2-1394" dev="mattsicker,mikes" type="fix">
 -        Fixed minor issues with the 2.6 web site.
 -      </action>
 -    </release>
 -    <release version="2.6" date="2016-05-25" description="GA Release 2.6">
 -      <action issue="LOG4J2-1270" dev="rpopma" type="add">
 -        (GC) Added support for garbage-free logging in steady state.
 -        This includes Async Loggers and logging synchronously to the console and to a file,
 -        but does not include the AsyncAppender. This release makes the GelfLayout and
 -        the main patterns in the PatternLayout garbage-free.
 -      </action>
 -      <action issue="LOG4J2-1297" dev="rpopma" type="add">
 -        (GC) Added manual page on garbage-free logging.
 -      </action>
 -      <action issue="LOG4J2-1373" dev="rpopma" type="add">
 -        (GC) Update Logger wrapper Generator tool to generate methods for the new Logger methods.
 -      </action>
 -      <action issue="LOG4J2-1356" dev="mikes" type="update">
 -        (GC) GelfLayout does now support garabage-free logging (with compressionType=OFF).
 -      </action>
 -      <action issue="LOG4J2-1326" dev="rpopma" type="add">
 -        (GC) Added methods to the Logger interface for logging CharSequence messages.
 -      </action>
 -      <action issue="LOG4J2-1344" dev="rpopma" type="add">
 -        (GC) FileAppender, RollingFileAppender and MemoryMappedFileAppender are now also garbage-free by default.
 -      </action>
 -      <action issue="LOG4J2-1343" dev="rpopma" type="update">
 -        (GC) ConsoleAppender is now garbage-free by default. This logic is reusable for all AbstractOutputStreamAppender subclasses.
 -      </action>
 -      <action issue="LOG4J2-1278" dev="rpopma" type="add">
 -        (GC) Added unrolled varargs methods to Logger API, added Unbox utility to avoid auto-boxing when logging primitive values.
 -      </action>
 -      <action issue="LOG4J2-1318" dev="rpopma" type="update">
 -        (GC) Avoid allocating unnecessary temporary objects in LoggerContext's getLogger methods.
 -      </action>
 -      <action issue="LOG4J2-1333" dev="rpopma" type="update">
 -        (GC) Avoid allocating unnecessary temporary objects in MarkerManager's getMarker methods.
 -      </action>
 -      <action issue="LOG4J2-1321" dev="rpopma" type="update">
 -        (GC) Avoid allocating unnecessary temporary objects in PatternLayout's NamePatternConverter and ClassNamePatternConverter.
 -      </action>
 -      <action issue="LOG4J2-1271" dev="rpopma" type="add">
 -        (GC) Add MessageFactory that avoid allocation by reusing a cached ParameterizedMessage instance.
 -      </action>
 -      <action issue="LOG4J2-1271" dev="rpopma" type="update">
 -        (GC) ParameterizedMessage optimizations to avoid or at least postpone allocating temporary objects.
 -      </action>
 -      <action issue="LOG4J2-1283" dev="rpopma" type="update">
 -        (GC) Provide ThreadLocal-based gc-free caching mechanism in DatePatternConverter for non-webapps.
 -      </action>
 -      <action issue="LOG4J2-1293" dev="rpopma" type="add">
 -        (GC) Add interface StringBuilderFormattable to enable converting Messages and parameters to text without allocating temporary objects.
 -        ParameterizedMessage, ObjectMessage, SimpleMessage and ThreadDumpMessage now implement StringBuilderFormattable.
 -      </action>
 -      <action issue="LOG4J2-1291" dev="rpopma" type="update">
 -        (GC) Update PatternLayout to utilize gc-free mechanism for LogEvent processing.
 -      </action>
 -      <action issue="LOG4J2-1292" dev="rpopma" type="update">
 -        (GC) Update RandomAccessFileAppender and RollingRandomAccessFileAppender to utilize gc-free Layout.encode() method.
 -      </action>
 -      <action issue="LOG4J2-1274" dev="rpopma" type="add">
 -        (GC) Add encode(LogEvent, ByteBufferDestination) method to Layout API to enable converting LogEvents to bytes without creating temporary objects.
 -      </action>
 -      <action issue="LOG4J2-1281" dev="rpopma" type="fix">
 -        (GC) LoggerConfig.getProperties() should not allocate on each call.
 -      </action>
 -      <action issue="LOG4J2-1272" dev="rpopma" type="update">
 -        (GC) Improve LoggerConfig's data structure for AppenderControl objects to avoid allocating temporary objects during
 -        traversal for each log event.
 -      </action>
 -      <action issue="LOG4J2-1269" dev="rpopma" type="fix">
 -        (GC) AsyncLogger should use thread-local translator by default.
 -      </action>
 -      <action issue="LOG4J2-623" dev="rpopma" type="fix">
 -        Generate MDC properties as a JSON map in JSONLayout, with option to output as list of map entries.
 -      </action>
 -      <action issue="LOG4J2-1362" dev="rpopma" type="add" due-to="Gary Gregory">
 -        Added a YAML layout.
 -      </action>
 -      <action issue="LOG4J2-1387" dev="rpopma" type="fix">
 -        Fixed memory leak related to shutdown hook.
 -      </action>
 -      <action issue="LOG4J2-1179" dev="rpopma" type="add">
 -        Documented benchmark results comparing Log4j 2 performance to other logging libraries.
 -      </action>
 -      <action issue="LOG4J2-1382" dev="rpopma" type="fix">
 -        Copying a MutableLogEvent using Log4jLogEvent.Builder should not unnecessarily obtain caller location information.
 -      </action>
 -      <action issue="LOG4J2-1011" dev="mikes" type="add">
 -        Document dependencies for layouts.
 -      </action>
 -      <action issue="LOG4J2-621" dev="ggregory" type="add" due-to="Lee Theobald, Kamal Mettananda, Gary Gregory">
 -        Pattern to drop first N package parts.
 -      </action>
 -      <action issue="LOG4J2-494" dev="rgoers" type="add" due-to="Philipp Knobel">
 -        Support merging configurations to for a composite configuration.
 -      </action>
 -      <action issue="LOG4J2-1357" dev="mikes" type="add">
 -        Option to not log stack traces for logged Throwables in GelfLayout.
 -      </action>
 -      <action issue="LOG4J2-1375" dev="rpopma" type="update">
 -        Update SLF4J from 1.7.13 to 1.7.21.
 -      </action>
 -      <action issue="LOG4J2-1374" dev="rpopma" type="update">
 -        Migrate tests from Logback 1.1.3 to 1.1.7.
 -      </action>
 -      <action issue="LOG4J2-1384" dev="ggregory" type="update">
 -        Update Apache Commons CSV from 1.2 to 1.3.
 -      </action>
 -      <action issue="LOG4J2-1372" dev="rgoers" type="fix" due-to="Kamal Mettananda, Gary Gregory">
 -        XMLLayout indents, but not the first child tag (Event).
 -      </action>
 -      <action issue="LOG4J2-1363" dev="rgoers" type="fix">
 -        Properties Configuration did not support includeLocation attribute on Loggers.
 -      </action>
 -      <action issue="LOG4J2-1263" dev="rgoers" type="fix">
 -        The ConfigurationSource was not saved for BuiltConfigurations so monitor interval had no effect.
 -      </action>
 -      <action issue="LOG4J2-1369" dev="ggregory" type="fix" due-to="Alex Birch, Gary Gregory">
 -        "xz" compression results in plaintext, uncompressed files.
 -      </action>
 -      <action issue="LOG4J2-1365" dev="mikes" type="update">
 -        (Log4j-internal) Provide message text as CharSequence for some message types to optimize some layouts.
 -      </action>
 -      <action issue="LOG4J2-1368" dev="rpopma" type="fix">
 -        (Log4j-internal) StatusLogger dropped exceptions when logging parameterized messages.
 -      </action>
 -      <action issue="LOG4J2-1348" dev="ggregory" type="add" due-to="Greg Thomas, Gary Gregory">
 -        Add an AutoCloseable ThreadContext class: CloseableThreadContext.
 -      </action>
 -      <action issue="LOG4J2-1345" dev="rpopma" type="update">
 -        (Doc) Clarify documentation for properties that control Log4j behaviour.
 -      </action>
 -      <action issue="LOG4J2-1336" dev="ggregory" type="fix" due-to="Zbynek Vyskovsky">
 -        LoggerFactory in 1.2 API module is not compatible with 1.2.
 -      </action>
 -      <action issue="LOG4J2-1354" dev="ggregory" type="fix" due-to="Arkadiusz Adolph">
 -        No configuration reload is triggered under Windows when replacing the configuration file with one that has older last modified date.
 -      </action>
 -      <action issue="LOG4J2-1346" type="fix">
 -        Exception from Log4jServletContextListener prevents jetty-maven-plugin run-forked.
 -      </action>
 -      <action issue="LOG4J2-1339" dev="rpopma" type="fix">
 -        (Perf) AsyncLogger performance optimization: avoid calling instanceof TimestampMessage in hot path.
 -      </action>
 -      <action issue="LOG4J2-1324" dev="rpopma" type="fix">
 -        Improve error handling in the Async Logger background thread: the new default exception handler no longer rethrows the error.
 -      </action>
 -      <action issue="LOG4J2-1309" dev="ggregory" type="fix">
 -        Configuration file error does not show cause exception.
 -      </action>
 -      <action issue="LOG4J2-1299" dev="ggregory" type="add">
 -        Add pattern converter for thread id and priority in PatternLayout.
 -      </action>
 -      <action issue="LOG4J2-1289" dev="ggregory" type="fix">
 -        Change flow logging text from "entry' to "Enter" and "exit" to "Exit".
 -      </action>
 -      <action issue="LOG4J2-1284" dev="rpopma" type="fix">
 -        Made default MessageFactory configurable.
 -      </action>
 -      <action issue="LOG4J2-1280" dev="ggregory" type="fix">
 -        Deprecate org.apache.logging.log4j.util.MessageSupplier.
 -      </action>
 -      <action issue="LOG4J2-1280" dev="rpopma" type="fix">
 -        Logger methods taking Supplier parameters now correctly handle cases where the supplied value is a Message.
 -      </action>
 -      <action issue="LOG4J2-1268" dev="rpopma" type="fix">
 -        FixedDateFormat was incorrect for formats having MMM with the French locale.
 -      </action>
 -      <action issue="LOG4J2-1255" dev="rgoers" type="update">
 -        Add enhanced entry and exit methods.
 -      </action>
 -      <action issue="LOG4J2-124" dev="rgoers" type="add">
 -        Add shutdown methods to LogManager.
 -      </action>
 -      <action issue="LOG4J2-1222" dev="rgoers" type="fix">
 -        Creation of a LoggerContext will fail if shutdown is in progress. LogManager will default to SimpleLogger instead.
 -      </action>
 -      <action issue="LOG4J2-1221" dev="rpopma" type="add" due-to="Michael Barker">
 -        Added async logger Timeout wait strategy and made this the default wait strategy for async loggers.
 -        This prevents a rare deadlock that may occur on Solaris.
 -      </action>
 -      <action issue="LOG4J2-1080" dev="rpopma" type="add">
 -        Added option to discard events below a certain log level if the async logger ring buffer
 -        or async appender queue is full.
 -      </action>
 -      <action issue="LOG4J2-1237" dev="ggregory" type="add" due-to="Mike Calmus, Gary Gregory">
 -        Make PatternLayout header and footer accept a pattern.
 -      </action>
 -      <action issue="LOG4J2-1244" dev="ggregory" type="add" due-to="Anshu Garg, Remko Popma, Gary Gregory">
 -        Make header and footer values customizable in JSONLayout.
 -      </action>
 -      <action issue="LOG4J2-1245" dev="ggregory" type="add">
 -        Make CSV Layout header and footers accept patterns.
 -      </action>
 -      <action issue="LOG4J2-1192" dev="ggregory" type="add" due-to="J�rg Bretschneider, Gary Gregory">
 -        Dynamic Subject for SMTP Appender.
 -      </action>
 -      <action issue="LOG4J2-1277" dev="ggregory" type="add" due-to="Gary Gregory, Ludovic Hochet">
 -        FormattedMessage, MessageFormatMessage and StringFormattedMessage should support passing in a Locale to ensure appropriate formatting.
 -      </action>
 -      <action issue="LOG4J2-1260" dev="ggregory" type="fix" due-to="Blake Day, Gary Gregory">
 -        TlsSyslogFrame calculates message length incorrectly.
 -      </action>
 -      <action issue="LOG4J2-1258" dev="ggregory" type="fix" due-to="Francis Lalonde">
 -        Async DynamicThresholdFilter does not use the log event's context map.
 -      </action>
 -      <action issue="LOG4J2-1232" dev="ggregory" type="fix" due-to="Nikolai">
 -        Incorrect log rotation in last week of year.
 -      </action>
 -      <action issue="LOG4J2-1248" dev="rpopma" type="fix">
 -        Fixed broken nanotime in pattern layout.
 -      </action>
 -      <action issue="LOG4J2-908" dev="ggregory" type="fix" due-to="Konstantinos Liakos, Patrick Flaherty, Robin Coe, Gary Gregory">
 -        JSONLayout doesn't add a comma between log events.
 -      </action>
 -      <action issue="LOG4J2-1230" dev="ggregory" type="fix" due-to="Vladimir Hudec, Ralph Goers, Gary Gregory">
 -        Don't concatenate SYSLOG Messages.
 -      </action>
 -      <action issue="LOG4J2-1238" dev="ggregory" type="fix">
 -        org.apache.logging.log4j.core.net.TcpSocketManager and other classes does not report internal exceptions to the status logger.
 -      </action>
 -      <action issue="LOG4J2-1212" dev="rpopma" type="fix">
 -        Fix documentation to specify the correct default wait strategy used by async loggers.
 -      </action>
 -      <action issue="LOG4J2-1215" dev="ggregory" type="fix" due-to="Erik Kemperman">
 -        Documentation/XSD inconsistencies.
 -      </action>
 -      <action issue="LOG4J2-1276" dev="ggregory" type="fix" due-to="Ludovic Hochet">
 -        LoggerMessageSupplierTest and LoggerSupplierTest are Locale sensitive.
 -      </action>
 -      <action issue="LOG4J2-1380" dev="ggregory" type="update">
 -        Update Jackson from 2.7.3 to 2.7.4.
 -      </action>
 -      <action issue="LOG4J2-1304" dev="ggregory" type="update">
 -        Update Jackson from 2.7.0 to 2.7.2.
 -      </action>
 -      <action issue="LOG4J2-1253" dev="ggregory" type="update">
 -        Update LMAX Disruptor from 3.3.2 to 3.3.4.
 -      </action>
 -      <action issue="LOG4J2-1219" dev="ggregory" type="update">
 -        Update SLF4J from 1.7.12 to 1.7.13.
 -      </action>
 -      <action issue="LOG4J2-1239" dev="ggregory" type="update">
 -        Update Jackson from 2.6.3 to 2.6.4.
 -      </action>
 -      <action issue="LOG4J2-1249" dev="ggregory" type="update">
 -        Update Jackson from 2.6.4 to 2.7.0.
 -      </action>
 -      <action issue="LOG4J2-1351" dev="ggregory" type="update">
 -        Update Jackson from 2.7.2 to 2.7.3.
 -      </action>
 -      <action issue="LOG4J2-1240" dev="ggregory" type="update">
 -        Update Liquibase from 3.3.5 to 3.4.2.
 -      </action>
 -      <action issue="LOG4J2-1294" dev="ggregory" type="update">
 -        Update Kafka client from 0.9.0.0 to 0.9.0.1.
 -      </action>
 -      <action issue="LOG4J2-1352" dev="ggregory" type="update">
 -        Update javax.mail from 1.5.4 to 1.5.5.
 -      </action>
 -      <action issue="LOG4J2-1358" dev="ggregory" type="update">
 -        Update Apache Commons Compress from 1.10 to 1.11.
 -      </action>
 -      <action issue="LOG4J2-1388" dev="rpopma" type="update">
 -        Update Google java-allocation-instrumenter from 3.0 to 3.0.1.
 -      </action>
 -      <action issue="LOG4J2-1233" dev="ggregory" type="update" due-to="Bahri Gencsoy">
 -        Misleading Value In Properties Example.
 -      </action>
 -      <action issue="LOG4J2-1251" dev="mattsicker" type="fix" due-to="Romain Manni-Bucau">
 -        Fix JUL bridge issue where LogRecord.getParameters() is used when null.
 -      </action>
 -      <action issue="LOG4J2-1254" dev="rpopma" type="fix" due-to="Josh Trow">
 -        Fix typo in Flow Tracing documentation.
 -      </action>
 -      <action issue="LOG4J2-920" dev="mattsicker" type="fix" due-to="Ludovic Hochet">
 -        ClassNotFoundException for BundleContextSelector when initialising in an OSGi environment.
 -      </action>
 -      <action issue="LOG4J2-1300" dev="mattsicker" type="update">
 -        Remove serializability from classes that don't need it.
 -      </action>
 -      <action issue="LOG4J2-1303" dev="mattsicker" type="add">
 -        Add documentation links to runtime dependencies in each component intro page.
 -      </action>
 -      <action issue="LOG4J2-1275" dev="mattsicker" type="fix" due-to="Ludovic Hochet">
 -        Fix RollingAppenderNoUnconditionalDeleteTest repeat test runs from failing.
 -      </action>
 -      <action issue="LOG4J2-1262" dev="mattsicker" type="fix">
 -        Stop throwing unnecessary exception in Log4jServletContextListener.contextDestroyed().
 -      </action>
 -      <action issue="LOG4J2-1252" dev="mattsicker" type="add">
 -        JeroMqAppender should support layouts.
 -      </action>
 -      <action issue="LOG4J2-1227" dev="mattsicker" type="fix" due-to="Olivier Lemasle">
 -        NullPointerException in MapLookup.lookup if the event is null.
 -      </action>
 -      <action issue="LOG4J2-1306" dev="mattsicker" type="update">
 -        JeroMqAppender should use ShutdownCallbackRegistry instead of runtime hooks.
 -      </action>
 -      <action issue="LOG4J2-1217" dev="mattsicker" type="add" due-to="Thies Wellpott">
 -        PatternLayout option to limit length of text.
 -      </action>
 -      <action issue="LOG4J2-1308" dev="mattsicker" type="update">
 -        Remove need to pre-specify appender et al. identifiers in property file config format.
 -      </action>
 -      <action issue="LOG4J2-1050" dev="mattsicker" type="fix" due-to="Adam Retter">
 -        Add a Log4jLookup class to help write log files relative to log4j2.xml.
 -      </action>
 -      <action issue="LOG4J2-1133" dev="mattsicker" type="add">
 -        Add JNDI lookup documentation.
 -      </action>
 -      <action issue="LOG4J2-1310" dev="mattsicker" type="fix">
 -        JndiLookup mindlessly casts to String and should use String.valueOf().
 -      </action>
 -      <action issue="LOG4J2-1206" dev="mattsicker" type="update">
 -        org.apache.logging.log4j.core.LoggerContext#updateLoggers should call firePropertyChangeEvent.
 -      </action>
 -      <action issue="LOG4J2-248" dev="mattsicker" type="fix">
 -        Log4jWebInitializerImpl: Use Thread instead of Class for fallback classloader.
 -      </action>
 -      <action issue="LOG4J2-1169" dev="mattsicker" type="add" due-to="Gerald Kritzinger">
 -        PatternLayout: Possible variable substitution in equals substitution parameter.
 -      </action>
 -      <action issue="LOG4J2-1322" dev="mattsicker" type="update">
 -        Update Log4j 1.x migration guide to include information about system property lookup syntax changes.
 -      </action>
 -      <action issue="LOG4J2-1330" dev="mattsicker" type="fix">
 -        Fix NoClassDefFoundError in ReflectionUtil on Google App Engine.
 -      </action>
 -    </release>
 -    <release version="2.5" date="2015-12-06" description="GA Release 2.5">
 -      <action issue="LOG4J2-324" dev="rpopma" type="fix">
 -        Reduced memory usage of status messages in bounded queue; support zero-length queue that stores no messages.
 -      </action>
 -      <action issue="LOG4J2-1173" dev="rpopma" type="fix">
 -        Fixed rollover error when copying to a directory mapped to a remote Linux host.
 -      </action>
 -      <action issue="LOG4J2-435" dev="rpopma" type="add" due-to="Robert Schaft">
 -        Added support for custom delete actions triggered by a rollover.
 -      </action>
 -      <action issue="LOG4J2-649" dev="rgoers" type="update" due-to="Aleksey Zvolinsky">
 -        Add PurgePolicy and IdlePurgePolicy to RoutingAppender.
 -      </action>
 -      <action issue="LOG4J2-1202" dev="rgoers" type="update">
 -        Remove ConfigurationMonitor. The WatchManager is now used to check for configuration changes.
 -      </action>
 -      <action issue="LOG4J2-1195" dev="mikes" type="fix" due-to="Melvin Du">
 -        Make KafkaAppender support SerializedLayout.
 -      </action>
 -      <action issue="LOG4J2-89" dev="rgoers" type="add">
 -        Allow rollover to occur at any time. Add CronTriggeringPolicy.
 -      </action>
 -      <action issue="LOG4J2-381" dev="rgoers" type="fix" due-to="Anthony Baldocchi">
 -        Allow triggering policy and rollover strategy to be modified during reconfiguration.
 -      </action>
 -      <action issue="LOG4J2-1136" dev="rgoers" type="add">
 -        Add support for JSR 223 scripts in filters and the PatternSelector.
 -      </action>
 -      <action issue="LOG4J2-1168" dev="ggregory" type="add" due-to="Steven Swor">
 -        Add getters for source and destination file in file rename action.
 -      </action>
 -      <action issue="LOG4J2-1175" dev="ggregory" type="add">
 -        Add getters for classes in org.apache.logging.log4j.core.appender.rolling.action.
 -      </action>
 -      <action issue="LOG4J2-898" dev="rpopma" type="add">
 -        Added system property to allow users to control whether messages should be formatted in the background.
 -      </action>
 -      <action issue="LOG4J2-1178" dev="ggregory" type="add">
 -        Support use-case for JDBC's CommonDataSource.setLogWriter(PrintWriter) and java.sql.DriverManager.setLogWriter(PrintWriter).
 -      </action>
 -      <action issue="LOG4J2-1187" dev="ggregory" type="add">
 -        Support use case for java.sql.DriverManager.setLogStream(PrintStream).
 -      </action>
 -      <action issue="LOG4J2-1029" dev="rpopma" type="fix" due-to="Stefan Leonhartsberger">
 -        Performance improvement when gathering location information.
 -      </action>
 -      <action issue="LOG4J2-1172" dev="rpopma" type="fix">
 -        Fixed ThreadLocal leak [AsyncLogger$Info] on Tomcat when using AsyncLoggerContextSelector.
 -      </action>
 -      <action issue="LOG4J2-1176" dev="rpopma" type="fix">
 -        Fixed memory leak when log4j jars are in Tomcat's lib folder.
 -      </action>
 -      <action issue="LOG4J2-1180" dev="ggregory" type="fix" due-to="Mikael St�ldal">
 -        Logger cache does not account for message factory.
 -      </action>
 -      <action issue="LOG4J2-879" dev="rpopma" type="fix">
 -        Documentation: fixed minor issues with the site and manual pages.
 -      </action>
 -      <action issue="LOG4J2-999" dev="rpopma" type="fix" due-to="Joan Balaguer�">
 -        RollingFileAppender should also roll over when log event time is equal to rollover time, not only when later.
 -      </action>
 -      <action issue="LOG4J2-873" dev="rpopma" type="fix" due-to="Martin Dickins, LC, Luke Woodward">
 -        Fixed bug where omitting the &lt;display-name&gt; element in web.xml caused incorrect log4j initialization,
 -        resulting in memory leaks when the web application was stopped or reloaded.
 -      </action>
 -      <action issue="LOG4J2-323" dev="rpopma" type="fix">
 -        Better web app support for async loggers: Fixed a memory leak that occurred when the logging jars are placed
 -        in the container's classpath and the configuration file uses AsyncRoot/AsyncLogger.
 -        The problem was that the first web application started the Disruptor background thread [AsyncLoggerConfig-1] but did not stop it until all web apps are stopped.
 -        Each web application now has its own Disruptor which is stopped/started together with the web app.
 -      </action>
 -      <action issue="LOG4J2-493" dev="rpopma" type="fix">
 -        Better web app support for async loggers: it is now possible to place the logging jars in the container's
 -        classpath when making all loggers asynchronous by using AsyncLoggerContextSelector. This fixes a problem where
 -        logging would stop working after stopping and restarting a web application.
 -      </action>
 -      <action issue="LOG4J2-1171" dev="rpopma" type="fix">
 -        Use servlet context name for logger context name when available.
 -      </action>
 -      <action issue="LOG4J2-1159" dev="rpopma" type="fix">
 -        Fixed a ThreadLocal memory leak in Tomcat8 that mentions AsyncLoggers when Async Loggers are not used.
 -      </action>
 -      <action issue="LOG4J2-1166" dev="rpopma" type="fix">
 -        AbstractConfiguration executor should use a DaemonThreadFactory.
 -      </action>
 -      <action issue="LOG4J2-1165" dev="rpopma" type="fix">
 -        Improve Log4j initialization status messages.
 -      </action>
 -      <action issue="LOG4J2-1156" dev="rpopma" type="fix">
 -        Web site corrections and updates.
 -      </action>
 -      <action issue="LOG4J2-1158" dev="ggregory" type="fix" due-to="Michael Fortin, Gary Gregory">
 -        Log4J JUL adapter is using MessageFormat on String passed by java.util.function.Supplier&lt;String>.
 -      </action>
 -      <action issue="LOG4J2-801" dev="mattsicker" type="fix">
 -        org.apache.logging.log4j.core.Logger should be serializable.
 -      </action>
 -      <action issue="LOG4J2-1157" dev="mattsicker" type="fix" due-to="Norbert Bartels">
 -        Fix compilation error for classes annotated with @Plugin.
 -      </action>
 -      <action issue="LOG4J2-948" dev="mattsicker" type="fix" due-to="Andrew Flower">
 -        Fix plugin documentation error about Converters.
 -      </action>
 -      <action issue="LOG4J2-1193" dev="ggregory" type="fix">
 -        Prefix all thread names Log4j creates with "Log4j2-".
 -      </action>
 -      <action issue="LOG4J2-1194" dev="ggregory" type="fix" due-to="Adam Brin">
 -        Documentation does not match parameters for LoggerNameLevelRewritePolicy.
 -      </action>
 -      <action issue="LOG4J2-1196" dev="mattsicker" type="fix" due-to="Ren� Zanner">
 -        MongoDbConnection does not close MongoClient.
 -      </action>
 -      <action issue="LOG4J2-1174" dev="ggregory" type="update">
 -        Update Jackson from 2.6.2 to 2.6.3.
 -      </action>
 -      <action issue="LOG4J2-1207" dev="ggregory" type="update">
 -        Update kafka-clients from 0.8.2.2 to 0.9.0.0.
 -      </action>
 -    </release>
 -    <release version="2.4.1" date="2015-10-08" description="GA Release 2.4.1">
 -      <action issue="LOG4J2-1129" dev="rgoers" type="add">
 -        Allow PatternLayout to select a pattern to use based on some selection criteria.
 -      </action>
 -      <action issue="LOG4J2-1145" dev="ggregory" type="add">
 -        Add %equals to PatternLayout to test and replace patterns with strings.
 -      </action>
 -      <action issue="LOG4J2-1147" dev="ggregory" type="add">
 -        Add %equalsIgnoreCase to PatternLayout to test and replace patterns with strings.
 -      </action>
 -      <action issue="LOG4J2-1146" dev="ggregory" type="add">
 -        Add %notEmpty to PatternLayout to avoid output of patterns where all variables are empty.
 -      </action>
 -      <action issue="LOG4J2-1020" dev="mikes" type="add">
 -        Add possibility to set shutdown timeout on AsyncAppender.
 -      </action>
 -      <action issue="LOG4J2-1153" dev="rpopma" type="fix">
 -        Fixed NullPointerException when only root logger is defined (and no named loggers) in configuration properties file.
 -      </action>
 -      <action issue="LOG4J2-1140" dev="rpopma" type="fix">
 -        Fixed bug where headers were not being written to first file with RollingFileAppender.
 -      </action>
 -      <action issue="LOG4J2-1149" dev="rpopma" type="fix">
 -        Fixed bug where PatternLayout predefined date pattern with time zone always renders default date format.
 -      </action>
 -      <action issue="LOG4J2-1050" dev="rpopma" type="fix">
 -        Fixed Log4jLookup.
 -      </action>
 -      <action issue="LOG4J2-1142" dev="rpopma" type="fix">
 -        Fix potential memory leak in web applications by using a straight ThreadLocal field instead of subclassing ThreadLocal.
 -      </action>
 -      <action issue="LOG4J2-1135" dev="rpopma" type="fix">
 -        Compression on rollover was broken: log file was renamed to .zip but not compressed.
 -      </action>
 -      <action issue="LOG4J2-1127" dev="ggregory" type="fix">
 -        log4j2.xml cannot be parsed on Oracle Weblogic 12c.
 -      </action>
 -      <action issue="LOG4J2-1132" dev="ggregory" type="fix">
 -        Do not use MongoDB driver 2.13.3 deprecated methods.
 -      </action>
 -      <action issue="LOG4J2-1144" dev="ggregory" type="fix">
 -        Add %markerSimpleName in pattern layout should evaluate to marker name (not toString()).
 -      </action>
 -      <action issue="LOG4J2-1126" dev="ggregory" type="fix">
 -        Web site corrections and updates.
 -      </action>
 -      <action issue="LOG4J2-1151" dev="rpopma" type="update">
 -        Performance improvement: backport Java 8 fast ISO-8859-1 String to byte[] encoder to AbstractStringLayout.
 -      </action>
 -      <action issue="LOG4J2-935" dev="rpopma" type="update">
 -        Performance improvement when converting Strings to byte[] arrays.
 -      </action>
 -      <action issue="LOG4J2-1040" dev="ggregory" type="update">
 -        Update MongoDB driver from 2.13.3 to 3.0.4.
 -      </action>
 -      <action issue="LOG4J2-1128" dev="ggregory" type="update">
 -        Reuse StringBuilder to improve performance for String-based layouts: CSV, GELF, HTML, RFC524, Syslog.
 -      </action>
 -      <action issue="LOG4J2-1131" dev="ggregory" type="update">
 -        Update mongo-java-driver from 2.13.2 to 2.13.3.
 -      </action>
 -      <action issue="LOG4J2-1138" dev="ggregory" type="update">
 -        Do not use Jackson deprecated methods.
 -      </action>
 -      <action issue="LOG4J2-1139" dev="ggregory" type="update">
 -        Update Jackson from 2.6.1 to 2.6.2.
 -      </action>
 -      <action issue="LOG4J2-1150" dev="ggregory" type="update">
 -        Update kafka-clients from 0.8.2.1 to 0.8.2.2.
 -      </action>
 -    </release>
 -    <release version="2.4" date="2015-09-20" description="GA Release 2.4">
 -      <action issue="LOG4J2-635" dev="rgoers" type="add">
 -        Add support for configuration via Properties.
 -      </action>
 -      <action issue="LOG4J2-952" dev="rgoers" type="add">
 -        Add ConfigurationBuilder for programmatic configuration.
 -      </action>
 -      <action issue="LOG4J2-1017" dev="ggregory" type="update">
 -        Update Java platform from Java 6 to 7. From this version onwards, log4j 2 requires Java 7.
 -      </action>
 -      <action issue="LOG4J2-599" dev="rpopma" type="add">
 -        Added support for Java 8 lambda expressions to lazily construct a log message only if
 -              the requested log level is enabled.
 -      </action>
 -      <action issue="LOG4J2-1118" dev="rpopma" type="add">
 -        Updated Logger wrapper generator tool to add Java 8 lambda support for custom log levels.
 -      </action>
 -      <action issue="LOG4J2-1107" dev="ggregory" type="add" due-to="Mikael St�ldal">
 -        New Appender for Apache Kafka.
 -      </action>
 -      <action issue="LOG4J2-1113" dev="ggregory" type="add" due-to="Gary Gregory">
 -        New publisher Appender for ZeroMQ (using JeroMQ).
 -      </action>
 -      <action issue="LOG4J2-1088" dev="ggregory" type="add" due-to="Gary Gregory">
 -        Add Comma Separated Value (CSV) layouts for parameter and event logging.
 -      </action>
 -      <action issue="LOG4J2-812" dev="rgoers" type="update">
 -        PatternLayout timestamp formatting performance improvement: replaced synchronized SimpleDateFormat with
 -        Apache Commons FastDateFormat. This and better caching resulted in a ~3-30X faster timestamp formatting.
 -      </action>
 -      <action issue="LOG4J2-1097" dev="rpopma" type="update">
 -        PatternLayout timestamp formatting performance improvement: predefined date formats (and variants using
 -        a period '.' millisecond separator instead of ',') are now formatted ~2-10X faster than other date formats.
 -      </action>
 -      <action issue="LOG4J2-1096" dev="rpopma" type="update">
 -        Improved performance of ParameterizedMessage::getFormattedMessage by ~2X.
 -      </action>
 -      <action issue="LOG4J2-1120" dev="rpopma" type="update">
 -        LoggerConfig performance improvements: avoid unnecessary lock acquisition, use more efficient data structure.
 -      </action>
 -      <action issue="LOG4J2-1125" dev="rpopma" type="update">
 -        PatternLayout performance improvement by caching and reusing a ThreadLocal StringBuilder.
 -      </action>
 -      <action issue="LOG4J2-1121" dev="rpopma" type="fix">
 -        Fixed potential race condition on reconfiguration. Introduced ReliabilityStrategy to facilitate
 -        switching between different mechanisms for preventing log events from being dropped on reconfiguration.
 -      </action>
 -      <action issue="LOG4J2-1114" dev="ggregory" type="update">
 -        Add thread name to status logger layout.
 -      </action>
 -      <action issue="LOG4J2-1123" dev="ggregory" type="fix">
 -        Core Configurator.initialize(String, ClassLoader, String) fails to work when config location is a file path.
 -      </action>
 -      <action issue="LOG4J2-1117" dev="ggregory" type="fix" due-to="Marcus Thiesen">
 -        OutputStreamManager in ConsoleAppender leaking managers.
 -      </action>
 -      <action issue="LOG4J2-1044" dev="rgoers" type="fix">
 -        Write pending events to Flume when the appender is stopped.
 -      </action>
 -      <action issue="LOG4J2-1108" dev="ggregory" type="fix" due-to="Mikael St�ldal">
 -        NullPointerException when passing null to java.util.logging.Logger.setLevel().
 -      </action>
 -      <action issue="LOG4J2-1110" dev="ggregory" type="fix">
 -        org.apache.logging.log4j.jul.CoreLogger.setLevel() checks for security permission too late.
 -      </action>
 -      <action dev="rpopma" type="remove">
 -        Removed experimental interface LevelLogger which got committed to master by mistake.
 -      </action>
 -      <action issue="LOG4J2-1010" dev="rgoers" type="update">
 -        Pass log event when interpolating logger properties.
 -      </action>
 -      <action issue="LOG4J2-1090" dev="ggregory" type="add">
 -        Add Core Configurator APIs to change a logger's level.
 -      </action>
 -      <action issue="LOG4J2-1105" dev="ggregory" type="add" due-to="Gary Gregory">
 -        Add API org.apache.logging.log4j.Level.isInRange(Level, Level).
 -      </action>
 -      <action issue="LOG4J2-1106" dev="ggregory" type="add" due-to="Gary Gregory">
 -        Add a LevelRangeFilter class.
 -      </action>
 -      <action issue="LOG4J2-1074" dev="rpopma" type="add">
 -        Added support for system nanosecond time in pattern layout.
 -      </action>
 -      <action issue="LOG4J2-1075" dev="rpopma" type="add">
 -        Added support for compressing to bzip2 format on file rollover.
 -      </action>
 -      <action issue="LOG4J2-1077" dev="ggregory" type="add">
 -        Support additional Apache Commons Compress compression formats on rollover: Deflate, Pack200, XY.
 -      </action>
 -      <action issue="LOG4J2-767" dev="ggregory" type="add" due-to="Mikael St�ldal">
 -        New module for Liquibase integration.
 -      </action>
 -      <action issue="LOG4J2-1023" dev="ggregory" type="add" due-to="Mikael St�ldal">
 -        New RewritePolicy for changing level of a log event.
 -      </action>
 -      <action issue="LOG4J2-1015" dev="ggregory" type="add" due-to="Daniel Marcotte">
 -        Add a way to route messages based on the %marker in Layout for RoutingAppender.
 -      </action>
 -      <action issue="LOG4J2-1050" dev="ggregory" type="add" due-to="Adam Retter">
 -        Add a Log4jLookup class to help write log files relative to log4j2.xml.
 -      </action>
 -      <action issue="LOG4J2-1057" dev="ggregory" type="add">
 -        Add API org.apache.logging.log4j.LogManager.getFormatterLogger().
 -      </action>
 -      <action issue="LOG4J2-1066" dev="ggregory" type="add" due-to="Charles Allen">
 -        Expose Log4jContextFactory's ShutdownCallbackRegistry.
 -      </action>
 -      <action issue="LOG4J2-1084" dev="ggregory" type="fix" due-to="Philipp Schneider">
 -        Misleading StatusLogger WARN event in LogManager with java.util.Map.
 -      </action>
 -      <action issue="LOG4J2-1051" dev="ggregory" type="fix" due-to="Lukasz Lenart">
 -        NoClassDefFoundError when starting app on Google App Engine.
 -      </action>
 -      <action issue="LOG4J2-684" dev="ggregory" type="fix" due-to="Joern Huxhorn, Mauro Molinari">
 -        ExtendedThrowablePatternConverter does not print suppressed exceptions.
 -      </action>
 -      <action issue="LOG4J2-1069" dev="ggregory" type="fix" due-to="Sam Braam">
 -        Improper handling of JSON escape chars when deserializing JSON log events.
 -      </action>
 -      <action issue="LOG4J2-1068" dev="ggregory" type="fix" due-to="Andy McMullan">
 -        Exceptions not logged when using TcpSocketServer + SerializedLayout.
 -      </action>
 -      <action issue="LOG4J2-1067" dev="ggregory" type="fix" due-to="Sam Braam">
 -        ThrowableProxy getExtendedStackTraceAsString throws NPE on deserialized nested exceptions.
 -      </action>
 -      <action issue="LOG4J2-1049" dev="rpopma" type="fix" due-to="Robert Schaft">
 -        AsyncAppender now resets the thread interrupted flag after catching InterruptedException.
 -      </action>
 -      <action issue="LOG4J2-1048" dev="rpopma" type="fix" due-to="Nikhil">
 -        FileConfigurationMonitor unnecessarily calls System.currentTimeMillis() causing high CPU usage.
 -      </action>
 -      <action issue="LOG4J2-1037" dev="ggregory" type="fix" due-to="Marc Dergacz">
 -        Backward compatibility issue in log4j-1.2-api NDC pop() and peek().
 -      </action>
 -      <action issue="LOG4J2-1025" dev="ggregory" type="fix" due-to="Mikael St�ldal">
 -        Custom java.util.logging.Level gives null Log4j Level and causes NPE.
 -      </action>
 -      <action issue="LOG4J2-1033" dev="ggregory" type="fix" due-to="Mikael St�ldal">
 -        SimpleLogger creates unnecessary Map objects by calling ThreadContext.getContext() instead of getImmutableContext().
 -      </action>
 -      <action issue="LOG4J2-1026" dev="ggregory" type="fix">
 -        HighlightConverter does not obey noConsoleNoAnsi.
 -      </action>
 -      <action issue="LOG4J2-1019" dev="ggregory" type="fix">
 -        ZipCompressAction leaves files open until GC when an IO error takes place.
 -      </action>
 -      <action issue="LOG4J2-1020" dev="ggregory" type="fix">
 -        GzCompressAction leaves files open until GC when an IO error takes place.
 -      </action>
 -      <action issue="LOG4J2-1038" dev="ggregory" type="fix" due-to="Gili">
 -        Incorrect documentation for layout default charset.
 -      </action>
 -      <action issue="LOG4J2-1042" dev="ggregory" type="fix" due-to="Guillaume Turri">
 -        Socket and Syslog appenders don't take timeout into account at startup.
 -      </action>
 -      <action issue="LOG4J2-934" dev="ggregory" type="fix" due-to="Kenneth Gendron">
 -        Circular suppressed Exception throws StackOverflowError.
 -      </action>
 -      <action issue="LOG4J2-1046" dev="ggregory" type="fix" due-to="Kenneth Gendron">
 -        Circular Exception cause throws StackOverflowError.
 -      </action>
 -      <action issue="LOG4J2-982" dev="ggregory" type="fix" due-to="Mikhail Mazurskiy">
 -        Use System.nanoTime() to measure time intervals.
 -      </action>
 -      <action issue="LOG4J2-1045" dev="ggregory" type="fix" due-to="G�nter Albrecht">
 -        Externalize log4j2.xml via URL resource.
 -      </action>
 -      <action issue="LOG4J2-1058" dev="ggregory" type="fix" due-to="Daniel Branzea">
 -        Log4jMarker#contains(String) does not respect org.slf4j.Marker contract.
 -      </action>
 -      <action issue="LOG4J2-1060" dev="ggregory" type="fix">
 -        Log4jMarker#contains(Marker) does not respect org.slf4j.Marker contract.
 -      </action>
 -      <action issue="LOG4J2-1061" dev="ggregory" type="fix">
 -        Log4jMarker#remove(Marker) does not respect org.slf4j.Marker contract.
 -      </action>
 -      <action issue="LOG4J2-1062" dev="ggregory" type="fix">
 -        Log4jMarker#add(Marker) does not respect org.slf4j.Marker contract.
 -      </action>
 -      <action issue="LOG4J2-1064" dev="ggregory" type="fix">
 -        org.apache.logging.slf4j.Log4jMarker does not implement org.slf4j.Marker.equals(Object) org.slf4j.Marker.hashCode().
 -      </action>
 -      <action issue="LOG4J2-889" dev="rpopma" type="fix" due-to="Maciej Kara\u015b, Kenneth Leider">
 -        Header in layout should not be written on application startup if appending to an existing file. Fixes LOG4J2-1030.
 -      </action>
 -      <action issue="LOG4J2-918" dev="rpopma" type="fix">
 -        Clarify documentation for combining async with sync loggers.
 -      </action>
 -      <action issue="LOG4J2-1078" dev="ggregory" type="fix" due-to="Mikael St�ldal">
 -        GelfLayout throws exception if some log event fields are null.
 -      </action>
 -      <action issue="LOG4J2-1044" dev="rgoers" type="update">
 -        Support batchSize in FlumeAvroManager.
 -      </action>
 -      <action issue="LOG4J2-1065" dev="ggregory" type="update">
 -        Define org.apache.logging.log4j.Marker.equals(Object) and org.apache.logging.log4j.Marker.hashCode().
 -      </action>
 -      <action issue="LOG4J2-1063" dev="ggregory" type="update">
 -        Avoid creating temporary array object in org.apache.logging.slf4j.Log4jMarker.iterator().
 -      </action>
 -      <action issue="LOG4J2-890" dev="ggregory" type="update" due-to="Hassan Kalaldeh, Robert Andersson, Remko Popma">
 -        log4j-web-2.1 should workaround a bug in JBOSS EAP 6.2.
 -      </action>
 -      <action issue="LOG4J2-403" dev="ggregory" type="update" due-to="Poorna Subhash P, Jeremy Lautman">
 -        MongoDB appender, username and password should be optional.
 -      </action>
 -      <action issue="LOG4J2-1035" dev="ggregory" type="update">
 -        Log4j2 tries to SystemClassLoader when running on Google AppEngine.
 -      </action>
 -      <action issue="LOG4J2-1022" dev="rgoers" type="update">
 -        Allow a list of keys to be specified in the MDC pattern converter.
 -      </action>
 -      <action issue="LOG4J2-959" dev="ggregory" type="update">
 -        Fix FindBugs DM_DEFAULT_ENCODING bug in SimpleLogger.logMessage() and simplify code.
 -      </action>
 -      <action issue="LOG4J2-1036" dev="ggregory" type="update">
 -        Update Apache Flume from 1.5.2 to 1.6.0.
 -      </action>
 -      <action issue="LOG4J2-1041" dev="ggregory" type="update">
 -        Update MongoDB driver from 2.11.2 to 2.13.2.
 -      </action>
 -      <action issue="LOG4J2-1018" dev="ggregory" type="update">
 -        Update database tests from H2 1.3.175 to 1.3.176.
 -      </action>
 -      <action issue="LOG4J2-1070" dev="ggregory" type="update">
 -        Update Java Mail from 1.5.2 to 1.5.4.
 -      </action>
 -      <action issue="LOG4J2-1079" dev="ggregory" type="update">
 -        Update Jackson from 2.5.3 to 2.5.4.
 -      </action>
 -      <action issue="LOG4J2-1879" dev="ggregory" type="update">
 -        Update Jackson from 2.5.4 to 2.6.0.
 -      </action>
 -      <action issue="LOG4J2-1092" dev="ggregory" type="update">
 -        Update Jackson from 2.6.0 to 2.6.1.
 -      </action>
 -      <action issue="LOG4J2-1104" dev="ggregory" type="update">
 -        Update Apache Commons Compress from 1.9 to 1.10.
 -      </action>
 -    </release>
 -    <release version="2.3" date="2015-05-09" description="GA Release 2.3">
 -      <action issue="LOG4J2-1009" dev="ggregory" type="fix" due-to="Mikael St�ldal">
 -        Incorrectly defined compressionType parameter to GelfLayout.
 -      </action>
 -      <action issue="LOG4J2-1008" dev="ggregory" type="fix" due-to="Ralph Goers, Gary Gregory">
 -        org.apache.logging.log4j.core.config.plugins.util.ResolverUtil.extractPath(URL) incorrectly converts '+' characters to spaces.
 -      </action>
 -      <action issue="LOG4J2-1007" dev="ggregory" type="fix" due-to="Ralph Goers, Gary Gregory">
 -        org.apache.logging.log4j.core.util#fileFromUri(URI uri) incorrectly converts '+' characters to spaces.
 -      </action>
 -      <action issue="LOG4J2-1003" dev="ggregory" type="fix" due-to="Dan Armbrust">
 -        JUL Logger.throwing is mis-mapped to ERROR when it should be TRACE.
 -      </action>
 -      <action issue="LOG4J2-965" dev="ggregory" type="fix" due-to="Khotyn Huang">
 -        System.out no longer works after the Console appender and JANSI are initialized.
 -      </action>
 -      <action issue="LOG4J2-998" dev="ggregory" type="update" due-to="Mariano Gonzalez">
 -        Make org.apache.logging.log4j.core.Logger#updateConfiguration protected.
 -      </action>
 -      <action issue="LOG4J2-995" dev="rgoers" type="update">
 -        Move UTF-8 constant from Charsets to Constants class. Remove Charsets class.
 -      </action>
 -      <action issue="LOG4J2-993" dev="rgoers" type="fix">
 -        Deadlock would occur if appender thread creates a new Logger during reconfiguration.
 -      </action>
 -      <action issue="LOG4J2-991" dev="rpopma" type="fix" due-to="Ryan Rupp">
 -        Async root logger config should default includeLocation to false.
 -      </action>
 -      <action issue="LOG4J2-985" dev="rpopma" type="fix" due-to="Sean Dawson">
 -        AbstractFilter should not implement equals() and hashCode().
 -      </action>
 -      <action issue="LOG4J2-984" dev="ggregory" type="add" due-to="Jonas H�pfner">
 -        PatternLayout %highlight to support noConsoleNoAnsi like %style.
 -      </action>
 -      <action issue="LOG4J2-926" dev="ggregory" type="add" due-to="David Ohana">
 -        Truncate from the end of text format modifier.
 -      </action>
 -      <action issue="LOG4J2-980" dev="ggregory" type="fix" due-to="Mikhail Mazurskiy">
 -        Numerical overflow in BurstFilter not handled correctly.
 -      </action>
 -      <action issue="LOG4J2-981" dev="ggregory" type="fix" due-to="Mikhail Mazurskiy">
 -        Incorrect unlock in ProviderUtil.
 -      </action>
 -      <action issue="LOG4J2-966" dev="ggregory" type="fix">
 -        KeyStoreConfiguration.createKeyStoreConfiguration() ignores keyManagerFactoryAlgorithm.
 -      </action>
 -      <action issue="LOG4J2-976" dev="ggregory" type="fix" due-to="Matt Quinn">
 -        Using monitorInterval with YAML config file format causes JSONParseException.
 -      </action>
 -      <action issue="LOG4J2-964" dev="ggregory" type="fix" due-to="Jonne Jyryl�">
 -        StringFormattedMessage serialization is incorrect.
 -      </action>
 -      <action issue="LOG4J2-947" dev="ggregory" type="fix" due-to="Stefan Wehner">
 -        A new StatusLoggerAdmin listener is added to StatusLogger every time the log is reconfigured.
 -      </action>
 -      <action issue="LOG4J2-968" dev="ggregory" type="fix" due-to="Paul D Johe">
 -        SyslogLayout contains extra space.
 -      </action>
 -      <action issue="LOG4J2-967" dev="ggregory" type="fix" due-to="Stefan Wehner">
 -        log4j2.component.properties not read for all properties.
 -      </action>
 -      <action issue="LOG4J2-971" dev="ggregory" type="fix" due-to="Paul D Johe">
 -        Another bad priority in Syslog messages.
 -      </action>
 -      <action issue="LOG4J2-972" dev="ggregory" type="fix">
 -        org.apache.logging.log4j.core.net.ssl.TlsSyslogInputStreamReader does not need to create temp Integer objects.
 -      </action>
 -      <action issue="LOG4J2-974" dev="ggregory" type="fix" due-to="Daniel Gal�n y Martins">
 -        Typo in EventLogger documentation.
 -      </action>
 -      <action issue="LOG4J2-988" dev="ggregory" type="update">
 -        Update LMAX Disruptor from 3.3.0 to 3.3.2.
 -      </action>
 -      <action issue="LOG4J2-987" dev="ggregory" type="update">
 -        Migrate tests from Logback 1.1.2 to 1.1.3.
 -      </action>
 -      <action issue="LOG4J2-988" dev="ggregory" type="update">
 -        Update tests to use ActiveMQ from 5.10 to 5.11.1.
 -      </action>
 -      <action issue="LOG4J2-1004" dev="ggregory" type="update">
 -        Update Jackson from 2.5.1 to 2.5.3.
 -      </action>
 -      <action issue="LOG4J2-1005" dev="ggregory" type="update">
 -        Update Slf4j from 1.7.7 to 1.7.12.
 -      </action>
 -    </release>
 -    <release version="2.2" date="2015-02-22" description="GA Release 2.2">
 -      <action issue="LOG4J2-938" dev="rpopma" type="fix" due-to="Mauro Molinari">
 -        (JMX) To avoid memory leaks when web applications are restarted, JMX notifications are sent from
 -        the caller thread in web applications. For non-web applications notifications are sent from a background thread
 -        as before.
 -      </action>
 -      <action issue="LOG4J2-957" dev="ggregory" type="fix" due-to="fatih guleryuz">
 -        Missing toUpperCase(Locale.ENGLISH).
 -      </action>
 -      <action issue="LOG4J2-956" dev="ggregory" type="fix" due-to="David Kellerman">
 -        Manual refers to Route "AppenderRef" attribute, should be "ref".
 -      </action>
 -      <action issue="LOG4J2-955" dev="rpopma" type="update">
 -        Documentation: clarify system properties to control status logger, improve troubleshooting FAQ entry.
 -      </action>
 -      <action issue="LOG4J2-950" dev="ggregory" type="update" due-to="Joel Edwards">
 -        Incorrect attribute name in PropertiesRewritePolicy example.
 -      </action>
 -      <action issue="LOG4J2-944" dev="ggregory" type="fix" due-to="Vinayaka Ramachandra">
 -        Log4j Flume appender is not adding millisecond to the event headers when the event is logged at 000 milliseconds.
 -      </action>
 -      <action issue="LOG4J2-941" dev="ggregory" type="add" due-to="Konstantinos Liakos">
 -        Allow JSON layout to create one compact log record per line.
 -      </action>
 -      <action issue="LOG4J2-933" dev="ggregory" type="add" due-to="ppiman at gmail.com">
 -        HTML layout should not use attribute minimalization for hr noshade.
 -      </action>
 -      <action issue="LOG4J2-895" dev="ggregory" type="add">
 -        Specify the SyslogAppender connect timeout value as part of the configuration.
 -        The SyslogAppender takes a new parameter connectTimeoutMillis.
 -      </action>
 -      <action issue="LOG4J2-899" dev="ggregory" type="add">
 -        Specify the SocketAppender connect timeout value as part of the configuration.
 -        The SyslogAppender takes a new parameter connectTimeoutMillis.
 -      </action>
 -      <action issue="LOG4J2-924" dev="ggregory" type="fix" due-to="Ryan Rupp">
 -        Log4j 1.2 Bridge doesn't map level ALL correctly in Category.getEffectiveLevel().
 -      </action>
 -      <action issue="LOG4J2-931" dev="ggregory" type="fix" due-to="Robert Gacki">
 -        ConsoleAppender is missing @PluginFactory annotation at createAppender method.
 -      </action>
 -      <action issue="LOG4J2-919" dev="ggregory" type="fix" due-to="David Johle">
 -        Logging system fails to initialize if XInclude API is not available.
 -      </action>
 -      <action issue="LOG4J2-914" dev="ggregory" type="fix" due-to="Kaj Bjurman">
 -        ThrowableProxy.getExtendedStackTraceAsString causes NullPointerException.
 -      </action>
 -      <action issue="LOG4J2-912" dev="ggregory" type="fix">
 -        XML configuration does not report full error message for XInclude parser configuration problems.
 -      </action>
 -      <action issue="LOG4J2-903" dev="ggregory" type="fix" due-to="Mauro Molinari">
 -        ClassLoaderContextSelector uses ClassLoader.toString() as a key
 -      </action>
 -      <action issue="LOG4J2-834" dev="ggregory" type="fix" due-to="Nikita Koval, Leonard Broman, Thiago Kronig">
 -        ThrowableProxy throws NoClassDefFoundError.
 -      </action>
 -      <action issue="LOG4J2-893" dev="ggregory" type="fix">
 -        NullPointerException on filter when mapping JUL to Log4j2.
 -      </action>
 -      <action issue="LOG4J2-892" dev="ggregory" type="fix">
 -        JUL adapter does not map Log4j'2 FATAL level to a JUL level.
 -      </action>
 -      <action issue="LOG4J2-881" dev="ggregory" type="fix" due-to="Mariano Gonzalez">
 -        AbstractLifecycle should not implement equals() and hashCode().
 -      </action>
 -      <action issue="LOG4J2-897" dev="ggregory" type="fix">
 -        Javadoc for org.apache.log4j.BasicConfigurator.configure() is incorrect.
 -      </action>
 -      <action issue="LOG4J2-891" dev="ggregory" type="fix">
 -        AbstractLifecycle should not implement equals() and hashCode().
 -      </action>
 -      <action issue="LOG4J2-946" dev="ggregory" type="fix" due-to="artemonster">
 -        [docs] Using Log4j 2 in Web Applications: Update example (Log4jWebLifeCycle is not visible).
 -      </action>
 -      <action issue="LOG4J2-901" dev="ggregory" type="update" due-to="Tihomir Me\u0161\u010di\u0107, Siegfried Greisinger">
 -        Update docs for SyslogAppender: "No structured id name was supplied"
 -      </action>
 -      <action issue="LOG4J2-958" dev="ggregory" type="update">
 -        Update from Jackson 2.5.0 to 2.5.1.
 -      </action>
 -      <action issue="LOG4J2-925" dev="ggregory" type="update">
 -        Update from Jackson 2.4.4 to 2.5.0.
 -      </action>
 -      <action issue="LOG4J2-910" dev="ggregory" type="update">
 -        Update Jackson from 2.4.3 to 2.4.4.
 -      </action>
 -      <action issue="LOG4J2-881" dev="ggregory" type="update">
 -        Update Jackson from 2.4.2 to 2.4.3.
 -      </action>
 -      <action issue="LOG4J2-882" dev="ggregory" type="update">
 -        Update maven-core from 3.1.0 to 3.2.3.
 -      </action>
 -      <action issue="LOG4J2-883" dev="ggregory" type="update">
 -        Update tests from org.apache.felix.framework 4.2.1 to 4.4.1.
 -      </action>
 -      <action issue="LOG4J2-884" dev="ggregory" type="update">
 -        Update org.eclipse.osgi from 3.6.0 to 3.7.1.
 -      </action>
 -      <action issue="LOG4J2-900" dev="ggregory" type="update">
 -        Update Apache Flume from 1.5.0.1 to 1.5.2.
 -      </action>
 -    </release>
 -    <release version="2.1" date="2014-10-19" description="GA Release 2.1">
 -      <action issue="LOG4J2-676" dev="rgoers" type="fix" due-to="Stefan Bodewig">
 -        Some typo fixes and enhancements for the site.
 -      </action>
 -      <action issue="LOG4J2-868" dev="mattsicker" type="add">
 -        Add ShutdownCallbackRegistry interface for customizable shutdown callback handling. This is particularly
 -        useful for application servers that wish to integrate with Log4j 2.
 -      </action>
 -      <action issue="LOG4J2-866" dev="rpopma" type="fix" due-to="Gerard Weatherby">
 -        Documentation: fixed missing closing parenthesis in code example.
 -      </action>
 -      <action issue="LOG4J2-862" dev="mattsicker" type="fix" due-to="Michael Sutherland">
 -        Fixed classloader issue that prevented Log4j from finding the implementation when used in a custom Ant task.
 -      </action>
 -      <action issue="LOG4J2-589" dev="rpopma" type="add">
 -        Supported filtering on custom log levels in configuration.
 -      </action>
 -      <action issue="LOG4J2-861" dev="rpopma" type="fix">
 -        Documentation: fix broken links on left navigation Extending Log4j Configuration sub-menu.
 -      </action>
 -      <action issue="LOG4J2-856" dev="rpopma" type="add">
 -        Documentation: add sections on the JUL Adapter, IO Streams and NoSQL Appenders to the Maven and Ivy page.
 -      </action>
 -      <action issue="LOG4J2-797" dev="rpopma" type="fix" due-to="Andreas Rytina">
 -        Documentation: clarified why log4j-core is a compile time dependency in Maven and Ivy page.
 -      </action>
 -      <action issue="LOG4J2-855" dev="rpopma" type="fix">
 -        Documentation: fix broken links on Appenders manual page.
 -      </action>
 -      <action issue="LOG4J2-807" dev="rpopma" type="fix">
 -        Prevent NPE when configuration with AsyncLogger/AsyncRoot is reloaded.
 -      </action>
 -      <action issue="LOG4J2-848" dev="ggregory" type="add">
 -        Add a Java lookup to provide nicely formatted runtime version information.
 -      </action>
 -      <action issue="LOG4J2-809" dev="mattsicker" type="add">
 -        Move reflection utility class to API's private utility classes.
 -      </action>
 -      <action issue="LOG4J2-845" dev="mattsicker" type="update">
 -        Add 2.1.0 to compatible versions in Log4j API ProviderUtil and update Log4jAPIVersion to 2.1.0 in
 -        core META-INF/log4j-provider.properties.
 -      </action>
 -      <action issue="LOG4J2-833" dev="rpopma" type="add">
 -        Documentation: added Runtime Dependencies link to left nav-bar on site.
 -      </action>
 -      <action issue="LOG4J2-816" dev="rpopma" type="add">
 -        Documentation: added section on XInclude to user manual Configuration page.
 -      </action>
 -      <action issue="LOG4J2-678" dev="rpopma" type="fix" due-to="Matt Sicker">
 -        Documentation: fixed minor issues with Log4j2 web site/documentation.
 -      </action>
 -      <action issue="LOG4J2-844" dev="rpopma" type="update">
 -        Update JMH to 1.1 from 0.7.2.
 -      </action>
 -      <action issue="LOG4J2-843" dev="rpopma" type="fix">
 -        Migrate JpaHyperSqlAppenderTest JUnit performance test to log4j-perf.
 -      </action>
 -      <action issue="LOG4J2-842" dev="rpopma" type="fix">
 -        Migrate JpaH2AppenderTest JUnit performance test to log4j-perf.
 -      </action>
 -      <action issue="LOG4J2-841" dev="rpopma" type="fix">
 -        Migrate JdbcHyperSqlAppenderTest JUnit performance test to log4j-perf.
 -      </action>
 -      <action issue="LOG4J2-840" dev="rpopma" type="fix">
 -        Migrate JdbcH2AppenderTest JUnit performance test to log4j-perf.
 -      </action>
 -      <action issue="LOG4J2-830" dev="rpopma" type="fix">
 -        Respect external interrupt signal to allow application shutdown after joining AsyncAppender thread.
 -      </action>
 -      <action issue="LOG4J2-813" dev="ggregory" type="fix" due-to="David Erichsen, Brandon Barry">
 -        MarkerManager Log4jMarker.hasParents() returns opposite of correct result.
 -      </action>
 -      <action issue="LOG4J2-785" dev="rpopma" type="fix">
 -        Documentation: fixed capitalization inconsistency in user manual example config.
 -      </action>
 -      <action issue="LOG4J2-829" dev="rpopma" type="fix">
 -        Fixed issue in RollingFile filePattern: backslashes are path separators, not escape characters.
 -      </action>
 -      <action issue="LOG4J2-547" dev="mattsicker" type="add">
 -        Add the Log4j IOStreams component.
 -      </action>
 -      <action issue="LOG4J2-431" dev="rpopma" type="add" due-to="Claude Mamo">
 -        Added Memory-Mapped File Appender.
 -      </action>
 -      <action issue="LOG4J2-832" dev="ggregory" type="fix" due-to="Seth Leger">
 -        ThrowableProxy fails if a class in logged stack trace throws java.lang.Error from initializer
 -      </action>
 -      <action issue="LOG4J2-831" dev="rpopma" type="update">
 -        Documentation: updated FAQ "which jars" diagrams for JUL bridge and 2.1 version.
 -      </action>
 -      <action issue="LOG4J2-827" dev="mattsicker" type="add">
 -        Support use of TypeConverter classes through the standard Plugin system.
 -      </action>
 -      <action issue="LOG4J2-745" dev="mattsicker" type="fix" due-to="Scott Harrington">
 -        Avoid ConverterKey plugin clashes by using a more predictable plugin loading infrastructure.
 -        Plugins have been segmented into three parts: class path, user-specified packages, and OSGi bundles.
 -      </action>
 -      <action issue="LOG4J2-798" dev="mattsicker" type="fix" due-to="Scott Harrington">
 -        Fixed plugin scanning redundancy causing massive slowdowns in certain environments.
 -      </action>
 -      <action issue="LOG4J2-753" dev="rpopma" type="fix">
 -        Reduced CachedClock thread contention.
 -      </action>
 -      <action issue="LOG4J2-819" dev="mattsicker" type="fix" due-to="Gary Gregory">
 -        Fixed memory leak in Tomcat 6 caused by clock background threads unintentionally
 -        started by Tomcat after web application stop.
 -      </action>
 -      <action issue="LOG4J2-825" dev="mattsicker" type="add">
 -        Add simple validation constraint annotations for the Plugin system.
 -      </action>
 -      <action issue="LOG4J2-428" dev="ggregory" type="add" due-to="Mark Paluch, Mikael St�ldal">
 -        Implement a GELF layout.
 -      </action>
 -      <action issue="LOG4J2-391" dev="rgoers" type="fix" due-to="Kamal Bahadur">
 -        FlumePersistentManager now handles LockConflictExceptions in Berkeley Db when sending a batch.
 -      </action>
 -      <action issue="LOG4J2-782" dev="mattsicker" type="fix">
 -        Remove invalid Oracle Maven repository.
 -      </action>
 -      <action issue="LOG4J2-780" dev="mattsicker" type="update">
 -        Update Spring Framework to 3.2.11.RELEASE from 3.2.8.RELEASE.
 -      </action>
 -      <action issue="LOG4J2-815" dev="mattsicker" type="update">
 -        Unify the two JMS appenders into a single appender. Configurations 

<TRUNCATED>

[3/9] logging-log4j2 git commit: Merge branch 'master' into LOG4J2-1623

Posted by mi...@apache.org.
Merge branch 'master' into LOG4J2-1623


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/94465257
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/94465257
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/94465257

Branch: refs/heads/master
Commit: 94465257cc0e2c3645ce08a72c1dbb64b63ae282
Parents: 2153a26 ce86130
Author: Mikael St�ldal <mi...@magine.com>
Authored: Wed Oct 5 13:01:28 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Wed Oct 5 13:01:28 2016 +0200

----------------------------------------------------------------------
 BUILDING.txt | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------



[2/9] logging-log4j2 git commit: LOG4J2-1623 Fix XML schema for configuration file

Posted by mi...@apache.org.
LOG4J2-1623  Fix XML schema for configuration file


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2153a262
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2153a262
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2153a262

Branch: refs/heads/master
Commit: 2153a2621a7ccfa8e9eb006ae8482e8d8dfbc6bc
Parents: 705e272
Author: Mikael St�ldal <mi...@magine.com>
Authored: Tue Oct 4 12:04:15 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Tue Oct 4 12:04:15 2016 +0200

----------------------------------------------------------------------
 log4j-core/src/main/resources/Log4j-config.xsd | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/2153a262/log4j-core/src/main/resources/Log4j-config.xsd
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/resources/Log4j-config.xsd b/log4j-core/src/main/resources/Log4j-config.xsd
index af13d71..e75cb9e 100644
--- a/log4j-core/src/main/resources/Log4j-config.xsd
+++ b/log4j-core/src/main/resources/Log4j-config.xsd
@@ -38,6 +38,7 @@
         <xs:attribute name="strict" type="xs:string"/>
         <xs:attribute name="name" type="xs:string"/>
         <xs:attribute name="advertiser" type="xs:string"/>
+        <xs:attribute name="shutdownTimeout" type="xs:string" use="optional"/>
         <xs:attribute name="schema" type="xs:string"/>
     </xs:complexType>
     <xs:complexType name="PropertiesType">


[4/9] logging-log4j2 git commit: LOG4J2-1623 Update documentation

Posted by mi...@apache.org.
LOG4J2-1623  Update documentation


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/5564556c
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/5564556c
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/5564556c

Branch: refs/heads/master
Commit: 5564556cd81be70926d6f35a2ff323f623728f5a
Parents: 9446525
Author: Mikael St�ldal <mi...@magine.com>
Authored: Wed Oct 5 13:35:41 2016 +0200
Committer: Mikael St�ldal <mi...@magine.com>
Committed: Wed Oct 5 13:35:41 2016 +0200

----------------------------------------------------------------------
 .../org/apache/logging/log4j/core/LoggerContext.java    | 12 ++++++++++++
 src/site/xdoc/manual/configuration.xml.vm               |  9 +++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5564556c/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
----------------------------------------------------------------------
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 c964965..2681485 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
@@ -302,6 +302,18 @@ public class LoggerContext extends AbstractLifeCycle
         stop();
     }
 
+    /**
+     * How many milliseconds appenders and other plugins will get to shutdown.
+     *
+     * Not all plugins will honor this, it is a hint and not an absolute guarantee that the this method not block longer.
+     * Setting timeout too low increase the risk of losing outstanding log events not yet written to the final
+     * destination.
+     *
+     * @param timeout the maximum time to wait, or 0 which mean that each plugin uses its default timeout
+     * @param timeUnit the time unit of the timeout argument
+     * @return true if the context was stopped cleanly and normally, false otherwise.
+     * @since 2.7
+     */
     @Override
     public boolean stop(final long timeout, final TimeUnit timeUnit) {
         LOGGER.debug("Stopping LoggerContext[name={}, {}]...", getName(), this);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/5564556c/src/site/xdoc/manual/configuration.xml.vm
----------------------------------------------------------------------
diff --git a/src/site/xdoc/manual/configuration.xml.vm b/src/site/xdoc/manual/configuration.xml.vm
index acd41fd..2b59e8d 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -409,8 +409,13 @@ public class Bar {
               </tr>
               <tr>
                  <td>shutdownTimeout</td>
-                 <td>Specifies how many milliseconds appenders and other plugins will get to shutdown when the JVM shuts down.
-                 Default is zero. (Not used if <tt>shutdownHook</tt> is set to "disable".)</td>
+                 <td>Specifies how many milliseconds appenders and other plugins will get to shutdown when the JVM shuts
+                 down. Default is zero which mean that each plugin uses its default timeout. Not all plugins will honor
+                 this, it is a hint and not an absolute guarantee that the shutdown procedure will not take longer.
+                 Setting this too low increase the risk of losing outstanding log events not yet written to the final
+                 destination. See <a class="javadoc"
+                 href="../log4j-core/target/site/apidocs/org/apache/logging/log4j/core/LoggerContext.html#stop(long, java.util.concurrent.TimeUnit)">LoggerContext.stop(long, java.util.concurrent.TimeUnit)</a>.
+                  (Not used if <tt>shutdownHook</tt> is set to "disable".)</td>
               <tr>
                 <td>status</td>
                 <td>The level of internal Log4j events that should be logged to the console.