Author: chetanm Date: Mon Jul 27 07:10:42 2015 New Revision: 1692823 URL: http://svn.apache.org/r1692823 Log: SLING-4907 - Provide support for registering Filter with all configured appenders
Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/FilterTracker.java sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/integration/ITFilterSupport.java Modified: sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/FilterTracker.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/FilterTracker.java?rev=1692823&r1=1692822&r2=1692823&view=diff ============================================================================== --- sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/FilterTracker.java (original) +++ sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/FilterTracker.java Mon Jul 27 07:10:42 2015 @@ -23,6 +23,7 @@ import ch.qos.logback.classic.LoggerCont import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.Appender; import ch.qos.logback.core.filter.Filter; +import ch.qos.logback.core.util.ContextUtil; import org.apache.sling.commons.log.logback.internal.util.Util; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; @@ -38,9 +39,11 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class FilterTracker extends ServiceTracker implements LogbackResetListener{ + private static final String ALL_APPENDERS = "*"; private static final String PROP_APPENDER = "appenders"; private final LoggerContext loggerContext; + private final ContextUtil contextUtil; private final LogbackManager logbackManager; private Map<ServiceReference, FilterInfo> filters = new ConcurrentHashMap<ServiceReference, FilterInfo>(); @@ -48,6 +51,7 @@ public class FilterTracker extends Servi super(context, createFilter(), null); this.logbackManager = logbackManager; this.loggerContext = logbackManager.getLoggerContext(); + this.contextUtil = new ContextUtil(loggerContext); super.open(); } @@ -61,7 +65,7 @@ public class FilterTracker extends Servi FilterInfo fi = new FilterInfo(reference, f); filters.put(reference, fi); attachFilter(fi, getAppenderMap()); - return fi; + return f; } @SuppressWarnings("unchecked") @@ -106,25 +110,36 @@ public class FilterTracker extends Servi //~-----------------------------------Internal Methods - private void attachFilter(FilterInfo fi, Map<String,Appender<ILoggingEvent>> appenderMap) { - //TODO Support attaching a filter to all appender if the appenerName list contains '*' - for(String appenderName : fi.appenderNames){ + private void attachFilter(FilterInfo fi, Map<String, Appender<ILoggingEvent>> appenderMap) { + if (fi.registerAgainstAllAppenders){ + for (Appender<ILoggingEvent> appender : appenderMap.values()){ + attachFilter(appender, fi); + } + return; + } + for (String appenderName : fi.appenderNames) { Appender<ILoggingEvent> appender = appenderMap.get(appenderName); - if(appender != null){ - attachFilter(appender,fi); - }else{ - //TODO Log warning + if (appender != null) { + attachFilter(appender, fi); + } else { + contextUtil.addWarn("No appender with name [" + appenderName + "] found " + + "to which " + fi.filter + " can be attached"); } } } - private void detachFilter(FilterInfo fi,Map<String,Appender<ILoggingEvent>> appenderMap) { - for(String appenderName : fi.appenderNames){ + private void detachFilter(FilterInfo fi, Map<String, Appender<ILoggingEvent>> appenderMap) { + if (fi.registerAgainstAllAppenders){ + for (Appender<ILoggingEvent> appender : appenderMap.values()){ + detachFilter(appender, fi); + } + return; + } + + for (String appenderName : fi.appenderNames) { Appender<ILoggingEvent> appender = appenderMap.get(appenderName); - if(appender != null){ + if (appender != null) { detachFilter(appender, fi); - }else{ - //TODO Log warning } } } @@ -168,6 +183,7 @@ public class FilterTracker extends Servi final ServiceReference reference; final Filter<ILoggingEvent> filter; final Set<String> appenderNames; + final boolean registerAgainstAllAppenders; FilterInfo(ServiceReference reference, Filter<ILoggingEvent> filter) { this.reference = reference; @@ -175,6 +191,7 @@ public class FilterTracker extends Servi this.appenderNames = Collections.unmodifiableSet( new HashSet<String>(Util.toList(reference.getProperty(PROP_APPENDER)))); + this.registerAgainstAllAppenders = appenderNames.contains(ALL_APPENDERS); } public void stop(){ Modified: sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/integration/ITFilterSupport.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/integration/ITFilterSupport.java?rev=1692823&r1=1692822&r2=1692823&view=diff ============================================================================== --- sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/integration/ITFilterSupport.java (original) +++ sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/integration/ITFilterSupport.java Mon Jul 27 07:10:42 2015 @@ -59,7 +59,7 @@ public class ITFilterSupport extends Log @Test public void testTurboFilter() throws Exception { - TestAppender ta = registerAppender("turbofilter"); + TestAppender ta = registerAppender("turbofilter", "TestAppender"); org.slf4j.Logger bar = LoggerFactory.getLogger("turbofilter.foo.bar"); assertTrue(bar.isDebugEnabled()); @@ -98,7 +98,7 @@ public class ITFilterSupport extends Log @Test public void testNormalFilter() { - TestAppender ta = registerAppender("filter"); + TestAppender ta = registerAppender("filter", "TestAppender"); org.slf4j.Logger bar = LoggerFactory.getLogger("filter.foo.bar"); assertTrue(bar.isDebugEnabled()); @@ -135,11 +135,43 @@ public class ITFilterSupport extends Log bar.debug("Test"); assertEquals(1, ta.events.size()); + } + @Test + public void filterUsingWildcard() throws Exception{ + TestAppender ta1 = registerAppender("filterUsingWildcard1", "app1"); + TestAppender ta2 = registerAppender("filterUsingWildcard2", "app2"); + + //Set additivity to false to prevent other appender like CONSOLE from + //interfering + org.slf4j.Logger baz1 = LoggerFactory.getLogger("filterUsingWildcard1.foo.baz"); + ((ch.qos.logback.classic.Logger)baz1).setAdditive(false); + org.slf4j.Logger baz2 = LoggerFactory.getLogger("filterUsingWildcard2.foo.baz"); + ((ch.qos.logback.classic.Logger)baz2).setAdditive(false); + + final List<String> msgs = new ArrayList<String>(); + Filter stf = new Filter<ILoggingEvent>(){ + @Override + public FilterReply decide(ILoggingEvent event) { + msgs.add(event.getMessage()); + return FilterReply.NEUTRAL; + } + }; + + Dictionary<String, Object> props = new Hashtable<String, Object>(); + props.put("appenders", "*"); + ServiceRegistration sr = bundleContext.registerService(Filter.class.getName(), stf, props); + + delay(); + + baz1.info("baz1-1"); + baz2.info("baz2-1"); + + assertEquals(2, msgs.size()); } - private TestAppender registerAppender(String prefix) { - TestAppender ta = new TestAppender(); + private TestAppender registerAppender(String prefix, String appenderName) { + TestAppender ta = new TestAppender(appenderName); Dictionary<String, Object> props = new Hashtable<String, Object>(); String[] loggers = { @@ -181,6 +213,11 @@ public class ITFilterSupport extends Log private static class TestAppender extends AppenderBase<ILoggingEvent> { final List<ILoggingEvent> events = new ArrayList<ILoggingEvent>(); + final String name; + + public TestAppender(String name) { + this.name = name; + } @Override protected void append(ILoggingEvent eventObject) { @@ -189,7 +226,7 @@ public class ITFilterSupport extends Log @Override public String getName() { - return "TestAppender"; + return name; } } }