Repository: logging-log4j2 Updated Branches: refs/heads/master 6cfedcf7a -> c705ffdc1
LOG4J2-493 Wrap-up: better web app support for async loggers. It is now possible to place the logging jars in the container's classpath when making all loggers asynchronous by using AsyncLoggerContextSelector. Web apps can be started and stopped. - handle the case where the log4j jars are in container's classpath, but the log4j2.xml config file is in a web app's classpath. In this scenario, the Disruptor should only be started that web app. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/c705ffdc Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/c705ffdc Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/c705ffdc Branch: refs/heads/master Commit: c705ffdc105172a0ebbaea94caab07ad42de734e Parents: 6cfedcf Author: rpopma <rpo...@apache.org> Authored: Sat Oct 24 00:07:45 2015 +0900 Committer: rpopma <rpo...@apache.org> Committed: Sat Oct 24 00:07:45 2015 +0900 ---------------------------------------------------------------------- .../log4j/core/async/AsyncLoggerContext.java | 19 ++++++++++++++++--- .../logging/log4j/core/jmx/RingBufferAdmin.java | 8 +++----- .../apache/logging/log4j/core/jmx/Server.java | 5 ++++- src/changes/changes.xml | 5 +++++ 4 files changed, 28 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c705ffdc/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContext.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContext.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContext.java index d5bddb5..f539fc5 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContext.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContext.java @@ -21,8 +21,10 @@ import java.net.URI; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.DefaultConfiguration; import org.apache.logging.log4j.core.jmx.RingBufferAdmin; import org.apache.logging.log4j.message.MessageFactory; +import org.apache.logging.log4j.status.StatusLogger; /** * {@code LoggerContext} that creates {@code AsyncLogger} objects. @@ -60,8 +62,8 @@ public class AsyncLoggerContext extends LoggerContext { @Override public void setName(final String name) { - super.setName("AsyncContext[" + name + "]"); - helper.setContextName(name); + super.setName("AsyncContext[" + name + "]"); + helper.setContextName(name); } /* @@ -82,10 +84,21 @@ public class AsyncLoggerContext extends LoggerContext { */ @Override public void start(Configuration config) { - helper.start(); + maybeStartHelper(config); super.start(config); } + private void maybeStartHelper(Configuration config) { + // If no log4j configuration was found, there are no loggers + // and there is no point in starting the disruptor (which takes up + // significant memory and starts a thread). + if (config instanceof DefaultConfiguration) { + StatusLogger.getLogger().debug("[{}] Not starting Disruptor for DefaultConfiguration.", getName()); + } else { + helper.start(); + } + } + @Override public void stop() { helper.stop(); // first stop Disruptor http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c705ffdc/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/RingBufferAdmin.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/RingBufferAdmin.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/RingBufferAdmin.java index 71c14f7..15a9e56 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/RingBufferAdmin.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/RingBufferAdmin.java @@ -16,8 +16,6 @@ */ package org.apache.logging.log4j.core.jmx; -import java.util.Objects; - import javax.management.ObjectName; import com.lmax.disruptor.RingBuffer; @@ -45,7 +43,7 @@ public class RingBufferAdmin implements RingBufferAdminMBean { } protected RingBufferAdmin(final RingBuffer<?> ringBuffer, final String mbeanName) { - this.ringBuffer = Objects.requireNonNull(ringBuffer, "ringbuffer"); + this.ringBuffer = ringBuffer; try { objectName = new ObjectName(mbeanName); } catch (final Exception e) { @@ -55,12 +53,12 @@ public class RingBufferAdmin implements RingBufferAdminMBean { @Override public long getBufferSize() { - return ringBuffer.getBufferSize(); + return ringBuffer == null ? 0 : ringBuffer.getBufferSize(); } @Override public long getRemainingCapacity() { - return ringBuffer.remainingCapacity(); + return ringBuffer == null ? 0 : ringBuffer.remainingCapacity(); } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c705ffdc/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 c4f596d..5baef72 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 @@ -174,7 +174,10 @@ public final class Server { if (ctx instanceof AsyncLoggerContext) { final RingBufferAdmin rbmbean = ((AsyncLoggerContext) ctx).createRingBufferAdmin(); - register(mbs, rbmbean, rbmbean.getObjectName()); + if (rbmbean.getBufferSize() > 0) { + // don't register if Disruptor not started (DefaultConfiguration: config not found) + register(mbs, rbmbean, rbmbean.getObjectName()); + } } // register the status logger and the context selector http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/c705ffdc/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 20725df..44a5c77 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -24,6 +24,11 @@ </properties> <body> <release version="2.5" date="2015-MM-DD" description="GA Release 2.5"> + <action issue="LOG4J2-493" dev="rpopma" type="fix"> + Better web app support for async loggers: it is now possible to place the logging jars in the container's + classpath when making all loggers asynchronous by using AsyncLoggerContextSelector. This fixes a problem where + logging would stop working after stopping and restarting a web application. + </action> <action issue="LOG4J2-1171" dev="rpopma" type="fix"> Use servlet context name for logger context name when available. </action>