You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2015/03/12 11:50:25 UTC

[2/2] karaf-decanter git commit: [KARAF-3606] Avoid recursion and improve handling of Dispatcher service

[KARAF-3606] Avoid recursion and improve handling of Dispatcher service


Project: http://git-wip-us.apache.org/repos/asf/karaf-decanter/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-decanter/commit/e3954c26
Tree: http://git-wip-us.apache.org/repos/asf/karaf-decanter/tree/e3954c26
Diff: http://git-wip-us.apache.org/repos/asf/karaf-decanter/diff/e3954c26

Branch: refs/heads/master
Commit: e3954c26bec49d449bba90e34f33325dd4b47e4f
Parents: 25477ba
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Thu Mar 12 11:50:05 2015 +0100
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Thu Mar 12 11:50:05 2015 +0100

----------------------------------------------------------------------
 collector/log/pom.xml                           |  5 ++
 .../karaf/decanter/collector/log/Activator.java | 44 +++++++++----
 .../decanter/collector/log/LogAppender.java     | 68 +++++++++++---------
 pom.xml                                         |  5 ++
 4 files changed, 77 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/e3954c26/collector/log/pom.xml
----------------------------------------------------------------------
diff --git a/collector/log/pom.xml b/collector/log/pom.xml
index 537807e..ee6fc59 100644
--- a/collector/log/pom.xml
+++ b/collector/log/pom.xml
@@ -53,6 +53,10 @@
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
 
         <!-- SLF4J -->
         <dependency>
@@ -73,6 +77,7 @@
                     <instructions>
                         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                         <Bundle-Version>${project.version}</Bundle-Version>
+                        <Bundle-Activator>org.apache.karaf.decanter.collector.log.Activator</Bundle-Activator>
                         <Import-Package>
                             org.apache.karaf.decanter.api;version=${project.version},
                             org.slf4j;version="[1.7,2)";resolution:=optional,

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/e3954c26/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/Activator.java
----------------------------------------------------------------------
diff --git a/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/Activator.java b/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/Activator.java
index 6838d55..c358b4d 100644
--- a/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/Activator.java
+++ b/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/Activator.java
@@ -16,31 +16,49 @@
  */
 package org.apache.karaf.decanter.collector.log;
 
+import java.util.Dictionary;
+import java.util.Properties;
+
 import org.apache.karaf.decanter.api.Collector;
+import org.apache.karaf.decanter.api.Dispatcher;
 import org.ops4j.pax.logging.spi.PaxAppender;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
 
-import java.util.Dictionary;
-import java.util.Properties;
-
+@SuppressWarnings("rawtypes")
 public class Activator implements BundleActivator {
+    private ServiceTracker<Dispatcher, ServiceRegistration> tracker;
+
+    public void start(final BundleContext bundleContext) {
+        tracker = new ServiceTracker<Dispatcher, ServiceRegistration>(bundleContext, Dispatcher.class, null) {
 
-    private ServiceRegistration service;
+            @SuppressWarnings("unchecked")
+            @Override
+            public ServiceRegistration<?> addingService(ServiceReference<Dispatcher> reference) {
+                Properties properties = new Properties();
+                properties.put("org.ops4j.pax.logging.appender.name", "DecanterLogCollectorAppender");
+                properties.put("name", "log");
+                String[] ifAr = new String[] { PaxAppender.class.getName(), Collector.class.getName() };
+                Dispatcher dispatcher = bundleContext.getService(reference);
+                LogAppender appender = new LogAppender(dispatcher);
+                return bundleContext.registerService(ifAr , appender, (Dictionary) properties);
+            }
 
-    public void start(BundleContext bundleContext) {
-        LogAppender appender = new LogAppender(bundleContext);
-        Properties properties = new Properties();
-        properties.put("org.ops4j.pax.logging.appender.name", "DecanterLogCollectorAppender");
-        properties.put("name", "log");
-        service = bundleContext.registerService(new String[] { PaxAppender.class.getName(), Collector.class.getName() } , appender, (Dictionary) properties);
+            @Override
+            public void removedService(ServiceReference<Dispatcher> reference, ServiceRegistration reg) {
+                reg.unregister();
+                super.removedService(reference, reg);
+            }
+            
+        };
+        tracker.open();
     }
 
     public void stop(BundleContext bundleContext) {
-        if (service != null) {
-            service.unregister();
-        }
+        tracker.close();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/e3954c26/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
----------------------------------------------------------------------
diff --git a/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java b/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
index c83dd52..64ea039 100644
--- a/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
+++ b/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
@@ -16,32 +16,45 @@
  */
 package org.apache.karaf.decanter.collector.log;
 
-import org.apache.karaf.decanter.api.Dispatcher;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.apache.karaf.decanter.api.Collector;
+import org.apache.karaf.decanter.api.Dispatcher;
+import org.apache.log4j.MDC;
 import org.ops4j.pax.logging.spi.PaxAppender;
 import org.ops4j.pax.logging.spi.PaxLoggingEvent;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashMap;
-import java.util.Map;
-
 /**
  * Decanter log collector, event driven implementing a PaxAppender
  */
 public class LogAppender implements PaxAppender, Collector {
-
+    private static final String MDC_IN_LOG_APPENDER = "inLogAppender";
+    private final static String[] ignoredCategories = {"org.apache.karaf.decanter"};
     private final static Logger LOGGER = LoggerFactory.getLogger(LogAppender.class);
-
-    private BundleContext bundleContext;
-
-    public LogAppender(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
+    private Dispatcher dispatcher;
+    
+    public LogAppender(Dispatcher dispatcher) {
+        this.dispatcher = dispatcher;
     }
 
     public void doAppend(PaxLoggingEvent event) {
+        try {
+            if (MDC.get(MDC_IN_LOG_APPENDER) != null) {
+                // Avoid recursion
+                return;
+            }
+            MDC.put(MDC_IN_LOG_APPENDER, "true");
+            appendInternal(event);
+        } catch (Exception e) {
+            LOGGER.warn("Error while appending event", e);
+            MDC.remove(MDC_IN_LOG_APPENDER);
+        }
+    }
+
+    private void appendInternal(PaxLoggingEvent event) throws Exception {
         LOGGER.debug("Karaf Decanter Log Collector hooked ...");
 
         Map<Long, Map<String, Object>> collected = new HashMap<>();
@@ -52,31 +65,22 @@ public class LogAppender implements PaxAppender, Collector {
         data.put("message", event.getMessage());
         data.put("level", event.getLevel().toString());
         data.put("renderedMessage", event.getRenderedMessage());
-
+        data.put("MDC", event.getProperties());
         collected.put(event.getTimeStamp(), data);
 
-        // it's an event driven collector, calling the appender controller
-        LOGGER.debug("Calling the Karaf Decanter Appender Controller ...");
-        ServiceReference reference = bundleContext.getServiceReference(Dispatcher.class);
-        if (reference != null) {
-            Dispatcher controller = (Dispatcher) bundleContext.getService(reference);
-            if (controller != null) {
-                try {
-                    controller.dispatch(collected);
-                } catch (Exception e) {
-                    LOGGER.warn("Can't dispatch collected data", e);
-                }
-            }
-            bundleContext.ungetService(reference);
+        if (!isIgnored(event.getLoggerName())) {
+            LOGGER.debug("Calling the Karaf Decanter Appender Controller ...");
+            this.dispatcher.dispatch(collected);
         }
     }
 
-    public BundleContext getBundleContext() {
-        return bundleContext;
-    }
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
+    private boolean isIgnored(String loggerName) {
+        for (String cat : ignoredCategories) {
+            if (loggerName.startsWith(cat)) {
+                return true;
+            }
+        }
+        return false;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/e3954c26/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 9dc6b47..e3dc334 100644
--- a/pom.xml
+++ b/pom.xml
@@ -220,6 +220,11 @@
                 <artifactId>org.osgi.core</artifactId>
                 <version>4.3.1</version>
             </dependency>
+            <dependency>
+                <groupId>org.osgi</groupId>
+                <artifactId>org.osgi.compendium</artifactId>
+                <version>4.3.1</version>
+            </dependency>
 
             <!-- SLF4J -->
             <dependency>