You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2016/08/21 22:32:57 UTC
[03/23] logging-log4j2 git commit: Refactor thread factories.
Refactor thread factories.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/9afe7ea8
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/9afe7ea8
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/9afe7ea8
Branch: refs/heads/LOG4J2-1010&LOG4J2-1447-injectable-contextdata&better-datastructure
Commit: 9afe7ea8544942a6ddea68fbdce4428473d07a06
Parents: 932824a
Author: Gary Gregory <gg...@apache.org>
Authored: Sat Aug 20 11:47:08 2016 -0700
Committer: Gary Gregory <gg...@apache.org>
Committed: Sat Aug 20 11:47:08 2016 -0700
----------------------------------------------------------------------
.../core/async/AsyncLoggerConfigDisruptor.java | 3 +-
.../log4j/core/async/AsyncLoggerDisruptor.java | 3 +-
.../log4j/core/async/DaemonThreadFactory.java | 51 -------
.../core/config/ConfigurationScheduler.java | 15 +-
.../apache/logging/log4j/core/jmx/Server.java | 7 +-
.../logging/log4j/core/util/Log4jThread.java | 138 +++++++++----------
.../log4j/core/util/Log4jThreadFactory.java | 90 ++++++++++++
.../flume/appender/FlumePersistentManager.java | 30 +---
8 files changed, 177 insertions(+), 160 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
index d0c9eea..f3565a1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.core.impl.LogEventFactory;
import org.apache.logging.log4j.core.impl.MutableLogEvent;
import org.apache.logging.log4j.core.impl.ReusableLogEventFactory;
import org.apache.logging.log4j.core.jmx.RingBufferAdmin;
+import org.apache.logging.log4j.core.util.Log4jThreadFactory;
import org.apache.logging.log4j.message.ReusableMessage;
import org.apache.logging.log4j.status.StatusLogger;
@@ -176,7 +177,7 @@ public class AsyncLoggerConfigDisruptor implements AsyncLoggerConfigDelegate {
}
};
- private static final ThreadFactory THREAD_FACTORY = new DaemonThreadFactory("AsyncLoggerConfig-");
+ private static final ThreadFactory THREAD_FACTORY = Log4jThreadFactory.createDaemonThreadFactory("AsyncLoggerConfig");
private int ringBufferSize;
private AsyncQueueFullPolicy asyncQueueFullPolicy;
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
index 1875ad2..259e22d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
@@ -22,6 +22,7 @@ import java.util.concurrent.Executors;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.jmx.RingBufferAdmin;
+import org.apache.logging.log4j.core.util.Log4jThreadFactory;
import org.apache.logging.log4j.status.StatusLogger;
import com.lmax.disruptor.ExceptionHandler;
@@ -81,7 +82,7 @@ class AsyncLoggerDisruptor {
LOGGER.trace("[{}] AsyncLoggerDisruptor creating new disruptor for this context.", contextName);
ringBufferSize = DisruptorUtil.calculateRingBufferSize("AsyncLogger.RingBufferSize");
final WaitStrategy waitStrategy = DisruptorUtil.createWaitStrategy("AsyncLogger.WaitStrategy");
- executor = Executors.newSingleThreadExecutor(new DaemonThreadFactory("AsyncLogger[" + contextName + "]-"));
+ executor = Executors.newSingleThreadExecutor(Log4jThreadFactory.createDaemonThreadFactory("AsyncLogger[" + contextName + "]"));
backgroundThreadId = DisruptorUtil.getExecutorThreadId(executor);
asyncQueueFullPolicy = AsyncQueueFullPolicyFactory.create();
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DaemonThreadFactory.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DaemonThreadFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DaemonThreadFactory.java
deleted file mode 100644
index 3267c61..0000000
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DaemonThreadFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.async;
-
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.logging.log4j.core.util.Log4jThread;
-
-/**
- * ThreadFactory that creates daemon threads for the async loggers.
- */
-public class DaemonThreadFactory implements ThreadFactory {
-
- private static final AtomicInteger THREAD_NUMBER = new AtomicInteger(1);
- private final ThreadGroup group;
- private final String threadNamePrefix;
-
- public DaemonThreadFactory(final String threadNamePrefix) {
- this.threadNamePrefix = threadNamePrefix;
- final SecurityManager securityManager = System.getSecurityManager();
- group = securityManager != null ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup();
- }
-
- @Override
- public Thread newThread(final Runnable runnable) {
- final Thread thread = new Log4jThread(group, runnable, threadNamePrefix + THREAD_NUMBER.getAndIncrement(), 0);
- if (!thread.isDaemon()) {
- thread.setDaemon(true);
- }
- if (thread.getPriority() != Thread.NORM_PRIORITY) {
- thread.setPriority(Thread.NORM_PRIORITY);
- }
- return thread;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
index 6a3c1ec..744ed24 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
@@ -16,12 +16,6 @@
*/
package org.apache.logging.log4j.core.config;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.AbstractLifeCycle;
-import org.apache.logging.log4j.core.async.DaemonThreadFactory;
-import org.apache.logging.log4j.core.util.CronExpression;
-import org.apache.logging.log4j.status.StatusLogger;
-
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ScheduledExecutorService;
@@ -29,6 +23,12 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.AbstractLifeCycle;
+import org.apache.logging.log4j.core.util.CronExpression;
+import org.apache.logging.log4j.core.util.Log4jThreadFactory;
+import org.apache.logging.log4j.status.StatusLogger;
+
/**
*
*/
@@ -48,7 +48,8 @@ public class ConfigurationScheduler extends AbstractLifeCycle {
if (scheduledItems > 5) {
scheduledItems = 5;
}
- executorService = new ScheduledThreadPoolExecutor(scheduledItems, new DaemonThreadFactory("Log4j2Scheduled-"));
+ executorService = new ScheduledThreadPoolExecutor(scheduledItems,
+ Log4jThreadFactory.createDaemonThreadFactory("Log4j2Scheduled"));
} else {
LOGGER.debug("No scheduled items");
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java
index fd14e11..10f343a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java
@@ -36,11 +36,11 @@ import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.AsyncAppender;
import org.apache.logging.log4j.core.async.AsyncLoggerConfig;
import org.apache.logging.log4j.core.async.AsyncLoggerContext;
-import org.apache.logging.log4j.core.async.DaemonThreadFactory;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.core.impl.Log4jContextFactory;
import org.apache.logging.log4j.core.selector.ContextSelector;
import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.core.util.Log4jThreadFactory;
import org.apache.logging.log4j.spi.LoggerContextFactory;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
@@ -59,7 +59,7 @@ public final class Server {
public static final String DOMAIN = "org.apache.logging.log4j2";
private static final String PROPERTY_DISABLE_JMX = "log4j2.disable.jmx";
private static final String PROPERTY_ASYNC_NOTIF = "log4j2.jmx.notify.async";
- private static final String THREAD_NAME_PREFIX = "log4j2.jmx.notif-";
+ private static final String THREAD_NAME_PREFIX = "log4j2.jmx.notif";
private static final StatusLogger LOGGER = StatusLogger.getLogger();
static final Executor executor = isJmxDisabled() ? null : createExecutor();
@@ -76,7 +76,8 @@ public final class Server {
private static ExecutorService createExecutor() {
final boolean defaultAsync = !Constants.IS_WEB_APP;
final boolean async = PropertiesUtil.getProperties().getBooleanProperty(PROPERTY_ASYNC_NOTIF, defaultAsync);
- return async ? Executors.newFixedThreadPool(1, new DaemonThreadFactory(THREAD_NAME_PREFIX)) : null;
+ return async ? Executors.newFixedThreadPool(1, Log4jThreadFactory.createDaemonThreadFactory(THREAD_NAME_PREFIX))
+ : null;
}
/**
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThread.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThread.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThread.java
index 1467a54..b92f181 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThread.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThread.java
@@ -1,69 +1,69 @@
-/*
- * 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.util;
-
-/**
- * Prefixes thread names with {@code "Log4j2-"}.
- */
-public class Log4jThread extends Thread {
-
- private static final String PREFIX = "Log4j2-";
-
- private static int threadInitNumber;
-
- private static synchronized int nextThreadNum() {
- return threadInitNumber++;
- }
-
- private static String toThreadName(final Object name) {
- return PREFIX + name;
- }
-
- public Log4jThread() {
- super(toThreadName(nextThreadNum()));
- }
-
- public Log4jThread(final Runnable target) {
- super(target, toThreadName(nextThreadNum()));
- }
-
- public Log4jThread(final Runnable target, final String name) {
- super(target, toThreadName(name));
- }
-
- public Log4jThread(final String name) {
- super(toThreadName(name));
- }
-
- public Log4jThread(final ThreadGroup group, final Runnable target) {
- super(group, target, toThreadName(nextThreadNum()));
- }
-
- public Log4jThread(final ThreadGroup group, final Runnable target, final String name) {
- super(group, target, toThreadName(name));
- }
-
- public Log4jThread(final ThreadGroup group, final Runnable target, final String name, final long stackSize) {
- super(group, target, toThreadName(name), stackSize);
- }
-
- public Log4jThread(final ThreadGroup group, final String name) {
- super(group, toThreadName(name));
- }
-
-}
+/*
+ * 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.util;
+
+/**
+ * Prefixes thread names with {@code "Log4j2-"}.
+ */
+public class Log4jThread extends Thread {
+
+ static final String PREFIX = "Log4j2-";
+
+ private static int threadInitNumber;
+
+ private static synchronized int nextThreadNum() {
+ return threadInitNumber++;
+ }
+
+ private static String toThreadName(final Object name) {
+ return PREFIX + name;
+ }
+
+ public Log4jThread() {
+ super(toThreadName(nextThreadNum()));
+ }
+
+ public Log4jThread(final Runnable target) {
+ super(target, toThreadName(nextThreadNum()));
+ }
+
+ public Log4jThread(final Runnable target, final String name) {
+ super(target, toThreadName(name));
+ }
+
+ public Log4jThread(final String name) {
+ super(toThreadName(name));
+ }
+
+ public Log4jThread(final ThreadGroup group, final Runnable target) {
+ super(group, target, toThreadName(nextThreadNum()));
+ }
+
+ public Log4jThread(final ThreadGroup group, final Runnable target, final String name) {
+ super(group, target, toThreadName(name));
+ }
+
+ public Log4jThread(final ThreadGroup group, final Runnable target, final String name, final long stackSize) {
+ super(group, target, toThreadName(name), stackSize);
+ }
+
+ public Log4jThread(final ThreadGroup group, final String name) {
+ super(group, toThreadName(name));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThreadFactory.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThreadFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThreadFactory.java
new file mode 100644
index 0000000..ed07056
--- /dev/null
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Log4jThreadFactory.java
@@ -0,0 +1,90 @@
+/*
+ * 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.util;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.logging.log4j.util.Strings;
+
+/**
+ * Creates {@link Log4jThreads}.
+ *
+ * @since 2.7
+ */
+public class Log4jThreadFactory implements ThreadFactory {
+
+ private static final String PREFIX = Log4jThread.PREFIX + "TF-";
+
+ /**
+ * Creates a new daemon thread factory.
+ *
+ * @param threadNamePrefix
+ * The thread name prefix.
+ * @return a new daemon thread factory.
+ */
+ public static Log4jThreadFactory createDaemonThreadFactory(final String threadNamePrefix) {
+ return new Log4jThreadFactory(threadNamePrefix, true, Thread.NORM_PRIORITY);
+ }
+
+ private static final AtomicInteger FACTORY_NUMBER = new AtomicInteger(1);
+ private static final AtomicInteger THREAD_NUMBER = new AtomicInteger(1);
+ private final boolean daemon;
+ private final ThreadGroup group;
+ private final int priority;
+ private final String threadNamePrefix;
+
+ /**
+ * Constructs a thread factory with default settings.
+ */
+ public Log4jThreadFactory() {
+ this("thread", false, Thread.NORM_PRIORITY);
+ }
+
+ /**
+ * Constructs an initialized thread factory.
+ *
+ * @param threadNamePrefix
+ * The thread name prefix.
+ * @param daemon
+ * Whether to create daemon threads.
+ * @param priority
+ * The thread priority.
+ */
+ public Log4jThreadFactory(final String threadNamePrefix, final boolean daemon, final int priority) {
+ this.threadNamePrefix = PREFIX + FACTORY_NUMBER.getAndIncrement() + "-" + threadNamePrefix + "-";
+ this.daemon = daemon;
+ this.priority = priority;
+ final SecurityManager securityManager = System.getSecurityManager();
+ this.group = securityManager != null ? securityManager.getThreadGroup()
+ : Thread.currentThread().getThreadGroup();
+ }
+
+ @Override
+ public Thread newThread(final Runnable runnable) {
+ final Thread thread = new Log4jThread(group, runnable, threadNamePrefix + THREAD_NUMBER.getAndIncrement(), 0);
+ if (thread.isDaemon() != daemon) {
+ thread.setDaemon(daemon);
+ }
+ if (thread.getPriority() != priority) {
+ thread.setPriority(priority);
+ }
+ return thread;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9afe7ea8/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
----------------------------------------------------------------------
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
index daf6fdd..a76065a 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumePersistentManager.java
@@ -46,6 +46,7 @@ import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
import org.apache.logging.log4j.core.config.plugins.util.PluginType;
import org.apache.logging.log4j.core.util.FileUtils;
import org.apache.logging.log4j.core.util.Log4jThread;
+import org.apache.logging.log4j.core.util.Log4jThreadFactory;
import org.apache.logging.log4j.core.util.SecretKeyProvider;
import org.apache.logging.log4j.util.Strings;
@@ -124,7 +125,7 @@ public class FlumePersistentManager extends FlumeAvroManager {
lockTimeoutRetryCount);
this.worker.start();
this.secretKey = secretKey;
- this.threadPool = Executors.newCachedThreadPool(new DaemonThreadFactory());
+ this.threadPool = Executors.newCachedThreadPool(Log4jThreadFactory.createDaemonThreadFactory("Flume"));
this.lockTimeoutRetryCount = lockTimeoutRetryCount;
}
@@ -824,33 +825,6 @@ public class FlumePersistentManager extends FlumeAvroManager {
}
/**
- * Factory that creates Daemon threads that can be properly shut down.
- */
- private static class DaemonThreadFactory implements ThreadFactory {
- private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
- private final ThreadGroup group;
- private final AtomicInteger threadNumber = new AtomicInteger(1);
- private final String namePrefix;
-
- public DaemonThreadFactory() {
- final SecurityManager securityManager = System.getSecurityManager();
- group = securityManager != null ? securityManager.getThreadGroup() :
- Thread.currentThread().getThreadGroup();
- namePrefix = "DaemonPool-" + POOL_NUMBER.getAndIncrement() + "-thread-";
- }
-
- @Override
- public Thread newThread(final Runnable r) {
- final Thread thread = new Log4jThread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
- thread.setDaemon(true);
- if (thread.getPriority() != Thread.NORM_PRIORITY) {
- thread.setPriority(Thread.NORM_PRIORITY);
- }
- return thread;
- }
- }
-
- /**
* An internal class.
*/
private static class Gate {