You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2015/09/20 06:45:29 UTC

logging-log4j2 git commit: LOG4J2-1121 - Add LockingReliabilityStrategy

Repository: logging-log4j2
Updated Branches:
  refs/heads/LOG4J2-1121B-ReliabilityStrategy 5f95edfe7 -> d524ef3e1


LOG4J2-1121 - Add LockingReliabilityStrategy


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

Branch: refs/heads/LOG4J2-1121B-ReliabilityStrategy
Commit: d524ef3e1fae639732a2cc713f68cc2e6e508b8a
Parents: 5f95edf
Author: Ralph Goers <rg...@nextiva.com>
Authored: Sat Sep 19 21:45:18 2015 -0700
Committer: Ralph Goers <rg...@nextiva.com>
Committed: Sat Sep 19 21:45:18 2015 -0700

----------------------------------------------------------------------
 .../core/config/LockingReliabilityStrategy.java | 124 +++++++++++++++++++
 1 file changed, 124 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d524ef3e/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LockingReliabilityStrategy.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LockingReliabilityStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LockingReliabilityStrategy.java
new file mode 100644
index 0000000..9ba74e0
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LockingReliabilityStrategy.java
@@ -0,0 +1,124 @@
+/*
+ * 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.config;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.util.Supplier;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.*;
+
+/**
+ * ReliabilityStrategy that counts the number of threads that have started to log an event but have not completed yet,
+ * and waits for these threads to finish before allowing the appenders to be stopped.
+ */
+public class LockingReliabilityStrategy implements ReliabilityStrategy {
+    private static final int MAX_RETRIES = 3;
+    private final AtomicInteger counter = new AtomicInteger();
+    private final AtomicBoolean shutdown = new AtomicBoolean(false);
+    private final Lock shutdownLock = new ReentrantLock();
+    private final Condition noLogEvents = shutdownLock.newCondition(); // should only be used when shutdown == true
+    private final LoggerConfig loggerConfig;
+    private final ReadWriteLock reconfigureLock = new ReentrantReadWriteLock();
+    private volatile boolean isStopping = false;
+
+    public LockingReliabilityStrategy(final LoggerConfig loggerConfig) {
+        this.loggerConfig = loggerConfig;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#log(org.apache.logging.log4j.util.Supplier, java.lang.String, java.lang.String, org.apache.logging.log4j.Marker, org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable)
+     */
+    @Override
+    public void log(final Supplier<LoggerConfig> reconfigured, final String loggerName, final String fqcn,
+            final Marker marker, final Level level, final Message data, final Throwable t) {
+
+        final LoggerConfig config = getActiveLoggerConfig(reconfigured);
+        try {
+            config.log(loggerName, fqcn, marker, level, data, t);
+        } finally {
+            config.getReliabilityStrategy().afterLogEvent();
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#log(org.apache.logging.log4j.util.Supplier, org.apache.logging.log4j.core.LogEvent)
+     */
+    @Override
+    public void log(final Supplier<LoggerConfig> reconfigured, final LogEvent event) {
+        final LoggerConfig config = getActiveLoggerConfig(reconfigured);
+        try {
+            config.log(event);
+        } finally {
+            config.getReliabilityStrategy().afterLogEvent();
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#beforeLogEvent(org.apache.logging.log4j.core.config.LoggerConfig, org.apache.logging.log4j.util.Supplier)
+     */
+    @Override
+    public LoggerConfig getActiveLoggerConfig(final Supplier<LoggerConfig> next) {
+        LoggerConfig result = this.loggerConfig;
+        if (!beforeLogEvent()) {
+            result = next.get();
+            return result.getReliabilityStrategy().getActiveLoggerConfig(next);
+        }
+        return result;
+    }
+
+    private boolean beforeLogEvent() {
+        reconfigureLock.readLock().lock();
+        if (isStopping) {
+            reconfigureLock.readLock().unlock();
+            return false;
+        }
+        return true;
+    }
+
+    public void afterLogEvent() {
+        reconfigureLock.readLock().unlock();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#beforeStopAppenders()
+     */
+    @Override
+    public void beforeStopAppenders() {
+        reconfigureLock.writeLock().lock();
+        try {
+            isStopping = true;
+        } finally {
+            reconfigureLock.writeLock().unlock();
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#beforeStopConfiguration(org.apache.logging.log4j.core.config.Configuration)
+     */
+    @Override
+    public void beforeStopConfiguration(Configuration configuration) {
+        // no action
+    }
+
+}