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 2015/02/22 15:02:56 UTC
logging-log4j2 git commit: LOG4J2-938 To avoid memory leaks when web
applications are restarted,
JMX notifications are sent from the caller thread in web applications. For
non-web applications notifications are sent from a background thread as
before.
Repository: logging-log4j2
Updated Branches:
refs/heads/master e27c5b5ba -> d329cf38a
LOG4J2-938 To avoid memory leaks when web applications are restarted,
JMX notifications are sent from the caller thread in web applications.
For non-web applications notifications are sent from a background thread
as before.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/d329cf38
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d329cf38
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d329cf38
Branch: refs/heads/master
Commit: d329cf38aa7ccffde137ed53443d909dd18efd49
Parents: e27c5b5
Author: rpopma <rp...@apache.org>
Authored: Sun Feb 22 23:02:59 2015 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sun Feb 22 23:02:59 2015 +0900
----------------------------------------------------------------------
.../apache/logging/log4j/core/jmx/Server.java | 27 +++++++++++++++++++-
src/changes/changes.xml | 5 ++++
src/site/xdoc/manual/configuration.xml.vm | 10 ++++++++
3 files changed, 41 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d329cf38/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 92a19a3..54eb214 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
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.management.InstanceAlreadyExistsException;
@@ -40,6 +41,7 @@ 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.Loader;
import org.apache.logging.log4j.spi.LoggerContextFactory;
import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.PropertiesUtil;
@@ -57,13 +59,36 @@ 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 StatusLogger LOGGER = StatusLogger.getLogger();
- static final Executor executor = Executors.newFixedThreadPool(1, new DaemonThreadFactory("log4j2.jmx.notif"));
+ static final Executor executor = createExecutor();
private Server() {
}
/**
+ * Returns either a {@code null} Executor (causing JMX notifications to be sent from the caller thread) or a daemon
+ * background thread Executor, depending on the value of system property "log4j2.jmx.notify.async". If this
+ * property is not set, use a {@code null} Executor for web apps to avoid memory leaks and other issues when the
+ * web app is restarted.
+ * @see LOG4J2-938
+ */
+ private static ExecutorService createExecutor() {
+ boolean defaultAsync = !isWebApp();
+ boolean async = PropertiesUtil.getProperties().getBooleanProperty(PROPERTY_ASYNC_NOTIF, defaultAsync);
+ return async ? Executors.newFixedThreadPool(1, new DaemonThreadFactory(THREAD_NAME_PREFIX)) : null;
+ }
+
+ /**
+ * Returns {@code true} if we think we are running in a web container, based on the presence of the
+ * {@code javax.servlet.Servlet} class in the classpath.
+ */
+ private static boolean isWebApp() {
+ return Loader.isClassAvailable("javax.servlet.Servlet");
+ }
+
+ /**
* Either returns the specified name as is, or returns a quoted value containing the specified name with the special
* characters (comma, equals, colon, quote, asterisk, or question mark) preceded with a backslash.
*
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d329cf38/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ab11c0c..2bd8b73 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -24,6 +24,11 @@
</properties>
<body>
<release version="2.2" date="2015-??-??" description="GA Release 2.2">
+ <action issue="LOG4J2-938" dev="rpopma" type="fix" due-to="Mauro Molinari">
+ (JMX) To avoid memory leaks when web applications are restarted, JMX notifications are sent from
+ the caller thread in web applications. For non-web applications notifications are sent from a background thread
+ as before.
+ </action>
<action issue="LOG4J2-957" dev="ggregory" type="fix" due-to="fatih guleryuz">
Missing toUpperCase("Locale.ENGLISH").
</action>
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d329cf38/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 feeab2f..7165900 100644
--- a/src/site/xdoc/manual/configuration.xml.vm
+++ b/src/site/xdoc/manual/configuration.xml.vm
@@ -1424,6 +1424,16 @@ public class AwesomeTest {
</td>
</tr>
<tr>
+ <td>log4j2.jmx.notify.async</td>
+ <td>false for web apps, true otherwise</td>
+ <td>
+ If <tt>true</tt>, log4j's JMX notifications are sent from a separate background thread,
+ otherwise they are sent from the caller thread.
+ If the <tt>javax.servlet.Servlet</tt> class is on the classpath, the default behaviour
+ is to use the caller thread to send JMX notifications.
+ </td>
+ </tr>
+ <tr>
<td>log4j.skipJansi</td>
<td>false</td>
<td>