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
+ }
+
+}