That might make sense, but I propose we do that separately since it's not
related to what I am working on.

On Mon, Oct 3, 2016 at 11:28 PM, Gary Gregory <garydgreg...@gmail.com>
wrote:

> WRT:
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/config/composite/CompositeConfiguration.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/con
> fig/composite/CompositeConfiguration.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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(va
> lue);
> +            } else if ("shutdownTimeout".equalsIgnoreCase(key)) {
> +                shutdownTimeoutMillis = Long.parseLong(value);
>              } else if ("verbose".equalsIgnoreCase(key)) {
>                  statusConfig.withVerbosity(value);
>              } else if ("packages".equalsIgnoreCase(key)) {
>
> How about a switch on String instead of an old-school cascading if-else?
>
> Gary
>
> ---------- Forwarded message ----------
> From: <mi...@apache.org>
> Date: Mon, Oct 3, 2016 at 9:54 AM
> Subject: logging-log4j2 git commit: LOG4J2-1623 Configurable JVM shutdown
> hook timeout
> To: comm...@logging.apache.org
>
>
> Repository: logging-log4j2
> Updated Branches:
>   refs/heads/LOG4J2-1623 [created] 705e27253
>
>
> 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/LOG4J2-1623
> Commit: 705e27253ca14cdf0e50039cada041065e308aee
> Parents: 3176c96
> Author: Mikael Ståldal <mikael.stal...@magine.com>
> Authored: Mon Oct 3 18:54:27 2016 +0200
> Committer: Mikael Ståldal <mikael.stal...@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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/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/Log
> gerContext.java
> index 7e13963..c964965 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Log
> gerContext.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Log
> gerContext.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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/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/con
> fig/AbstractConfiguration.java
> index c740b8c..3a6a58e 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/AbstractConfiguration.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/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/con
> fig/Configuration.java
> index 1a55b48..95e6edc 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/Configuration.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/config/builder/api/ConfigurationBuilder.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/con
> fig/builder/api/ConfigurationBuilder.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/config/builder/impl/BuiltConfiguration.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/con
> fig/builder/impl/BuiltConfiguration.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/config/builder/impl/DefaultConfigurationBuilder.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/builder/impl/DefaultConfigurationBuilder.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/builder/impl/DefaultConfigurationBuilder.java
> index d8531d6..183094d 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/builder/impl/DefaultConfigurationBuilder.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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.setShutdownTimeo
> utMillis(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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/config/composite/CompositeConfiguration.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/con
> fig/composite/CompositeConfiguration.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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(va
> lue);
> +            } 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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/config/json/JsonConfiguration.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/con
> fig/json/JsonConfiguration.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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(va
> lue);
> +                } 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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/config/properties/PropertiesConfigurationBuilder.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/properties/PropertiesConfigurationBuilder.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/properties/PropertiesConfigurationBuilder.java
> index a4362b7..3d24a9b 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/properties/PropertiesConfigurationBuilder.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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/7
> 05e2725/log4j-core/src/main/java/org/apache/logging/log4j/co
> re/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/con
> fig/xml/XmlConfiguration.java
> index 2608552..51f31d4 100644
> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/xml/XmlConfiguration.java
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/con
> fig/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(va
> lue);
> +                } 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/7
> 05e2725/log4j-core/src/test/java/org/apache/logging/log4j/co
> re/ShutdownTimeoutConfigurationTest.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/Shu
> tdownTimeoutConfigurationTest.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/Shu
> tdownTimeoutConfigurationTest.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.xm
> l";
> +
> +    @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/7
> 05e2725/log4j-core/src/test/java/org/apache/logging/log4j/co
> re/config/builder/ConfigurationBuilderTest.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/con
> fig/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/con
> fig/builder/ConfigurationBuilderTest.java
> +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/con
> fig/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/7
> 05e2725/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/7
> 05e2725/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/7
> 05e2725/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
>
>
>
>
> --
> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
[image: MagineTV]

*Mikael Ståldal*
Senior software developer

*Magine TV*
mikael.stal...@magine.com
Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com

Privileged and/or Confidential Information may be contained in this
message. If you are not the addressee indicated in this message
(or responsible for delivery of the message to such a person), you may not
copy or deliver this message to anyone. In such case,
you should destroy this message and kindly notify the sender by reply
email.

Reply via email to