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>