You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2013/10/22 14:42:21 UTC

svn commit: r1534615 - in /sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal: Activator.java LogbackManager.java

Author: bdelacretaz
Date: Tue Oct 22 12:42:20 2013
New Revision: 1534615

URL: http://svn.apache.org/r1534615
Log:
SLING-3189 - slightly modified version of Chetan's patch which if needed waits for SLF4J in a separate thread

Modified:
    sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Activator.java
    sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogbackManager.java

Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Activator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Activator.java?rev=1534615&r1=1534614&r2=1534615&view=diff
==============================================================================
--- sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Activator.java (original)
+++ sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/Activator.java Tue Oct 22 12:42:20 2013
@@ -19,29 +19,80 @@
 
 package org.apache.sling.commons.log.logback.internal;
 
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.atomic.AtomicInteger;
+
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.slf4j.bridge.SLF4JBridgeHandler;
 
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.core.status.ErrorStatus;
+import ch.qos.logback.core.util.StatusPrinter;
+
 public class Activator implements BundleActivator {
     private static final String JUL_SUPPORT = "org.apache.sling.commons.log.julenabled";
 
     private LogbackManager logManager;
 
+    private BundleContext context;
+
+    private Timer timer;
+    private boolean bridgeHandlerInstalled;
+    private long startTime;
+    private static final AtomicInteger counter = new AtomicInteger();
+    public static final long INIT_TASK_PERIOD_MSEC = 1;
+
     public void start(BundleContext context) throws Exception {
+        this.context = context;
+        this.startTime = System.currentTimeMillis();
+        this.timer = new Timer(getClass().getSimpleName() + "#" + counter.incrementAndGet());
+
+        // SLING-3189 - Check if SLF4J is currently initialized then start
+        // LogbackManager straightaway otherwise initialize
+        // it in a separate thread
+        if(isSlf4jInitialized()){
+            initializeLogbackManager(true);
+        } else {
+            System.out.println("Slf4j is not initialized yet. Delaying Logback support initialization");
+            timer.schedule(new LogbackInitializerTask(),0,INIT_TASK_PERIOD_MSEC);
+        }
+    }
+
+    public void stop(BundleContext context) throws Exception {
+        if(bridgeHandlerInstalled){
+            SLF4JBridgeHandler.uninstall();
+        }
+
+        if(timer != null){
+            timer.cancel();
+            timer = null;
+        }
+
+        if (logManager != null) {
+            logManager.shutdown();
+            logManager = null;
+        }
+    }
+
+    private void initializeLogbackManager(boolean immediateInit) throws InvalidSyntaxException {
         // SLING-2373
         if (Boolean.parseBoolean(context.getProperty(JUL_SUPPORT))) {
             // In config one must enable the LevelChangePropagator
             // http://logback.qos.ch/manual/configuration.html#LevelChangePropagator
             // make sure configuration is empty unless explicitly set
             if (System.getProperty("java.util.logging.config.file") == null
-                && System.getProperty("java.util.logging.config.class") == null) {
+                    && System.getProperty("java.util.logging.config.class") == null) {
                 final Thread ct = Thread.currentThread();
                 final ClassLoader old = ct.getContextClassLoader();
                 try {
                     ct.setContextClassLoader(getClass().getClassLoader());
                     System.setProperty("java.util.logging.config.class",
-                        "org.apache.sling.commons.log.internal.Activator.DummyLogManagerConfiguration");
+                            "org.apache.sling.commons.log.internal.Activator.DummyLogManagerConfiguration");
                     java.util.logging.LogManager.getLogManager().reset();
                 } finally {
                     ct.setContextClassLoader(old);
@@ -50,20 +101,46 @@ public class Activator implements Bundle
             }
 
             SLF4JBridgeHandler.install();
+            bridgeHandlerInstalled = true;
         }
 
         logManager = new LogbackManager(context);
+        
+        final Logger log = LoggerFactory.getLogger(getClass());
+        if(immediateInit) {
+            log.info("LogbackManager initialized at bundle startup");
+        } else {
+            log.info("LogbackManager initialized after waiting for Slf4j, {} msec after startup", System.currentTimeMillis() - startTime);
+        }
     }
 
-    public void stop(BundleContext context) throws Exception {
-        SLF4JBridgeHandler.uninstall();
+    private class LogbackInitializerTask extends TimerTask{
+        public LogbackInitializerTask() {
+        }
 
-        if (logManager != null) {
-            logManager.shutdown();
-            logManager = null;
+        @Override
+        public void run() {
+            if(!isSlf4jInitialized()){
+                return;
+            }
+            try {
+                initializeLogbackManager(false);
+            } catch (Exception e) {
+                StringBuilder sb = new StringBuilder();
+                StatusPrinter.buildStr(sb, "", new ErrorStatus("Error occurred " +
+                        "while starting Logback integration",this,e));
+                System.err.print(sb.toString());
+            }
+            cancel();
+            timer.cancel();
         }
     }
 
+    private static boolean isSlf4jInitialized(){
+        return LoggerFactory.getILoggerFactory() instanceof LoggerContext;
+    }
+
+
     /**
      * The <code>DummyLogManagerConfiguration</code> class is used as JUL
      * LogginManager configurator to preven reading platform default

Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogbackManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogbackManager.java?rev=1534615&r1=1534614&r2=1534615&view=diff
==============================================================================
--- sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogbackManager.java (original)
+++ sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogbackManager.java Tue Oct 22 12:42:20 2013
@@ -100,7 +100,6 @@ public class LogbackManager extends Logg
 
     public LogbackManager(BundleContext bundleContext) throws InvalidSyntaxException {
         final long startTime = System.currentTimeMillis();
-        ensureSlf4jIsInitialized();
         setLoggerContext((LoggerContext) LoggerFactory.getILoggerFactory());
         this.log = LoggerFactory.getLogger(getClass());
         this.rootDir = getRootDir(bundleContext);
@@ -137,17 +136,6 @@ public class LogbackManager extends Logg
         started = true;
     }
 
-    private void ensureSlf4jIsInitialized() {
-        ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
-        //SLING-3185 Check if instance of LoggerContext as
-        //in case SLF4J has not completely initialized it would return a temp LoggerFactory
-        //SubstituteLoggerFactory
-        if(!(loggerFactory instanceof LoggerContext)){
-            //This ensures that Logger implementation is binded by the time call returns
-            StaticLoggerBinder.getSingleton();
-        }
-    }
-
     public void shutdown() {
         logConfigManager.close();