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();