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>

Reply via email to