LOG4J2-1121 change factory - users can select strategy by name - Locking reliability strategy is now one of the options
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a536638a Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a536638a Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a536638a Branch: refs/heads/master Commit: a536638af36b73aeab21d0cda58e9645925c8efe Parents: ef5c4a9 Author: rpopma <[email protected]> Authored: Sun Sep 20 07:40:00 2015 +0200 Committer: rpopma <[email protected]> Committed: Sun Sep 20 07:40:00 2015 +0200 ---------------------------------------------------------------------- .../core/config/ReliabilityStrategyFactory.java | 37 ++++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a536638a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java index cdbb312..8fd9458 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java @@ -17,6 +17,7 @@ package org.apache.logging.log4j.core.config; +import org.apache.logging.log4j.status.StatusLogger; import org.apache.logging.log4j.util.PropertiesUtil; /** @@ -27,20 +28,42 @@ public class ReliabilityStrategyFactory { } /** - * Returns a new {@code AwaitUnconditionallyReliabilityStrategy} if system property - * {@code log4j.alwaysWaitBeforeStopOldConfig} was set to {@code true}, otherwise (by default return) a new - * {@code AwaitCompletionReliabilityStrategy} instance. + * Returns a new {@code ReliabilityStrategy} instance based on the value of system property + * {@code log4j.ReliabilityStrategy}. If not value was specified this method returns a new + * {@code AwaitUnconditionallyReliabilityStrategy}. + * <p> + * Valid values for this system property are {@code "AwaitUnconditionally"} (use + * {@code AwaitUnconditionallyReliabilityStrategy}), {@code "Locking"} (use {@code LockingReliabilityStrategy}) and + * {@code "AwaitCompletion"} (use the default {@code AwaitCompletionReliabilityStrategy}). + * <p> + * Users may also use this system property to specify the fully qualified class name of a class that implements the + * {@code ReliabilityStrategy} and has a constructor that accepts a single {@code LoggerConfig} argument. * * @param loggerConfig the LoggerConfig the resulting {@code ReliabilityStrategy} is associated with * @return a ReliabilityStrategy that helps the specified LoggerConfig to log events reliably during or after a * configuration change */ public static ReliabilityStrategy getReliabilityStrategy(final LoggerConfig loggerConfig) { - boolean waitUnconditionally = PropertiesUtil.getProperties().getBooleanProperty( - "log4j.alwaysWaitBeforeStopOldConfig", false); - if (waitUnconditionally) { + + String strategy = PropertiesUtil.getProperties().getStringProperty("log4j.ReliabilityStrategy", + "AwaitCompletion"); + if ("AwaitCompletion".equals(strategy)) { + return new AwaitCompletionReliabilityStrategy(loggerConfig); + } + if ("AwaitUnconditionally".equals(strategy)) { return new AwaitUnconditionallyReliabilityStrategy(loggerConfig); } - return new AwaitCompletionReliabilityStrategy(loggerConfig); + if ("Locking".equals(strategy)) { + return new LockingReliabilityStrategy(loggerConfig); + } + try { + @SuppressWarnings("unchecked") + Class<? extends ReliabilityStrategy> cls = (Class<? extends ReliabilityStrategy>) Class.forName(strategy); + return cls.getConstructor(LoggerConfig.class).newInstance(loggerConfig); + } catch (Exception dynamicFailed) { + StatusLogger.getLogger().warn( + "Could not create ReliabilityStrategy for '{}', using default AwaitCompletionReliabilityStrategy"); + return new AwaitCompletionReliabilityStrategy(loggerConfig); + } } }
