[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 <[email protected]> Authored: Thu Mar 12 11:50:05 2015 +0100 Committer: Christian Schneider <[email protected]> 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>
