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/02/25 11:51:07 UTC

svn commit: r1449656 - in /sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src: main/java/org/apache/sling/commons/log/internal/ main/java/org/apache/sling/commons/log/internal/slf4j/ main/resources/OSGI-INF/metatype/ test/java/org/apache...

Author: bdelacretaz
Date: Mon Feb 25 10:51:06 2013
New Revision: 1449656

URL: http://svn.apache.org/r1449656
Log:
slf4j marker support added, see testMarkers in SlingLoggerTest.java

Modified:
    sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/LogManager.java
    sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/LogConfigManager.java
    sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLogger.java
    sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerConfig.java
    sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.properties
    sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.xml
    sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/test/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerTest.java

Modified: sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/LogManager.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/LogManager.java?rev=1449656&r1=1449655&r2=1449656&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/LogManager.java (original)
+++ sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/LogManager.java Mon Feb 25 10:51:06 2013
@@ -49,6 +49,8 @@ public class LogManager {
 
     public static final String LOG_PATTERN_DEFAULT = "{0,date,dd.MM.yyyy HH:mm:ss.SSS} *{4}* [{2}] {3} {5}";
 
+    public static final String LOG_MARKERS = "org.apache.sling.commons.log.markers";
+   
     public static final String LOG_LOGGERS = "org.apache.sling.commons.log.names";
 
     public static final String LOG_LEVEL_DEFAULT = "INFO";

Modified: sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/LogConfigManager.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/LogConfigManager.java?rev=1449656&r1=1449655&r2=1449656&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/LogConfigManager.java (original)
+++ sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/LogConfigManager.java Mon Feb 25 10:51:06 2013
@@ -119,7 +119,7 @@ public class LogConfigManager implements
         Set<String> defaultCategories = new HashSet<String>();
         defaultCategories.add(ROOT);
         defaultLoggerConfig = new SlingLoggerConfig(LogManager.PID,
-            LogManager.LOG_PATTERN_DEFAULT, defaultCategories,
+            LogManager.LOG_PATTERN_DEFAULT, defaultCategories, null,
             SlingLoggerLevel.INFO, defaultWriter);
         configByPid.put(LogManager.PID, defaultLoggerConfig);
         configByCategory.put(ROOT, defaultLoggerConfig);
@@ -439,6 +439,7 @@ public class LogConfigManager implements
             String level = (String) configuration.get(LogManager.LOG_LEVEL);
             String file = (String) configuration.get(LogManager.LOG_FILE);
             Set<String> categories = toCategoryList(configuration.get(LogManager.LOG_LOGGERS));
+            Set<String> markers = toStringSet(configuration.get(LogManager.LOG_MARKERS));
 
             // verify categories
             if (categories == null) {
@@ -447,6 +448,7 @@ public class LogConfigManager implements
             }
 
             // verify no other configuration has any of the categories
+            /* TODO - removing, to support markers
             for (String cat : categories) {
                 SlingLoggerConfig cfg = configByCategory.get(cat);
                 if (cfg != null && !pid.equals(cfg.getConfigPid())) {
@@ -455,6 +457,7 @@ public class LogConfigManager implements
                             + " already defined by configuration " + pid);
                 }
             }
+            */
 
             // verify writer
             SlingLoggerWriter writer;
@@ -495,7 +498,7 @@ public class LogConfigManager implements
             if (config == null) {
 
                 // create and store new configuration
-                config = new SlingLoggerConfig(pid, pattern, categories,
+                config = new SlingLoggerConfig(pid, pattern, categories, markers,
                     logLevel, writer);
                 configByPid.put(pid, config);
 
@@ -508,7 +511,7 @@ public class LogConfigManager implements
                 final SlingLoggerWriter oldWriter = config.getLogWriter();
 
                 // reconfigure the configuration
-                config.configure(pattern, categories, logLevel, writer);
+                config.configure(pattern, categories, markers, logLevel, writer);
 
                 if (categories.equals(oldCategories)) {
 
@@ -648,49 +651,56 @@ public class LogConfigManager implements
      *         object or <code>null</code> if the <code>loggers</code>
      *         object itself is <code>null</code>.
      */
-    private Set<String> toCategoryList(Object loggers) {
+    static private Set<String> toCategoryList(Object loggers) {
 
         // quick exit if there is no configuration
         if (loggers == null) {
             return null;
         }
 
-        // prepare set of names (used already in case loggers == ROOT)
-        Set<String> loggerNames = new HashSet<String>();
-
         // in case of the special setting ROOT, return a set of just the
         // root logger name (SLING-529)
         if (loggers == ROOT) {
+            final Set<String> loggerNames = new HashSet<String>();
             loggerNames.add(ROOT);
             return loggerNames;
         }
+        
+        return toStringSet(loggers);
+    }
+    
+    static private Set<String> toStringSet(Object o) {
 
+        final Set<String> result = new HashSet<String>();
+        if(o == null) {
+            return result;
+        }
+        
         // convert the loggers object to an array
-        Object[] loggersArray;
-        if (loggers.getClass().isArray()) {
-            loggersArray = (Object[]) loggers;
-        } else if (loggers instanceof Collection<?>) {
-            loggersArray = ((Collection<?>) loggers).toArray();
+        Object[] array;
+        if (o.getClass().isArray()) {
+            array = (Object[]) o;
+        } else if (o instanceof Collection<?>) {
+            array = ((Collection<?>) o).toArray();
         } else {
-            loggersArray = new Object[] { loggers };
+            array = new Object[] { o };
         }
 
         // conver the array of potentially comma-separated logger names
         // into the set of logger names
-        for (Object loggerObject : loggersArray) {
-            if (loggerObject != null) {
-                String[] splitLoggers = loggerObject.toString().split(",");
-                for (String logger : splitLoggers) {
-                    logger = logger.trim();
-                    if (logger.length() > 0) {
-                        loggerNames.add(logger);
+        for (Object obj : array) {
+            if (obj != null) {
+                String[] split = obj.toString().split(",");
+                for (String s : split) {
+                    s = s.trim();
+                    if (s.length() > 0) {
+                        result.add(s);
                     }
                 }
             }
         }
-
-        // return those names
-        return loggerNames;
+        
+        return result;
     }
 
     /**

Modified: sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLogger.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLogger.java?rev=1449656&r1=1449655&r2=1449656&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLogger.java (original)
+++ sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLogger.java Mon Feb 25 10:51:06 2013
@@ -58,7 +58,10 @@ class SlingLogger implements LocationAwa
 
     private void log(Marker marker, String fqcn, SlingLoggerLevel level,
             String msg, Throwable t) {
-        StringWriter writer = new StringWriter();
+        if(!config.markerPasses(marker)) {
+            return;
+        }
+        final StringWriter writer = new StringWriter();
 
         // create the formatted log line; use a local copy because the field
         // may be exchanged while we are trying to use it
@@ -468,9 +471,9 @@ class SlingLogger implements LocationAwa
     public void log(Marker marker, String fqcn, int level, String message,
             Object[] argArray, Throwable t) {
         SlingLoggerLevel slingLevel = SlingLoggerLevel.fromSlf4jLevel(level);
-        if (config.isLevel(slingLevel)) {
+        if (config.isLevel(slingLevel) && config.markerPasses(marker)) {
             log(marker, fqcn, slingLevel,
                 MessageFormatter.format(message, argArray, t));
         }
     }
-}
+}
\ No newline at end of file

Modified: sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerConfig.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerConfig.java?rev=1449656&r1=1449655&r2=1449656&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerConfig.java (original)
+++ sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerConfig.java Mon Feb 25 10:51:06 2013
@@ -38,22 +38,28 @@ class SlingLoggerConfig {
 
     private Set<String> categories;
 
+    private Set<String> markers;
+
     private SlingLoggerLevel level;
 
     private MessageFormat format;
 
     private SlingLoggerWriter writer;
 
-    SlingLoggerConfig(String pid, String pattern, Set<String> categories,
+    SlingLoggerConfig(String pid, String pattern, Set<String> categories, Set<String> markers,
             SlingLoggerLevel level, SlingLoggerWriter writer) {
         this.configPid = pid;
-        configure(pattern, categories, level, writer);
+        configure(pattern, categories, markers, level, writer);
     }
 
-    void configure(String pattern, Set<String> categories,
+    void configure(String pattern, Set<String> categories, Set<String> markers,
             SlingLoggerLevel level, SlingLoggerWriter writer) {
         this.format = new MessageFormat(pattern);
         this.categories = new HashSet<String>(categories);
+        this.markers = new HashSet<String>();
+        if(markers != null) {
+            this.markers.addAll(markers);
+        }
         this.level = level;
         this.writer = writer;
     }
@@ -70,6 +76,10 @@ class SlingLoggerConfig {
         return categories;
     }
 
+    Set<String> getMarkers() {
+        return markers;
+    }
+
     SlingLoggerWriter getLogWriter() {
         return writer;
     }
@@ -85,6 +95,26 @@ class SlingLoggerConfig {
     boolean isLevel(SlingLoggerLevel reference) {
         return level.compareTo(reference) <= 0;
     }
+    
+    /** Find out if message having specified marker
+     *  must be logged
+     * @param marker can be null
+     * @return true if a message with supplied marker
+     *  must be logged according to this config.
+     */
+    boolean markerPasses(Marker marker) {
+        if(markers == null || markers.isEmpty()) {
+            // no markers -> everything goes through
+            return true;
+        }
+        
+        if(marker == null) {
+            // markers -> only marked messages pass through
+            return false;
+        } else {
+            return markers.contains(marker.getName());
+        }
+    }
 
     void setLogLevel(SlingLoggerLevel level) {
         this.level = level;

Modified: sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.properties
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.properties?rev=1449656&r1=1449655&r2=1449656&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.properties (original)
+++ sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.properties Mon Feb 25 10:51:06 2013
@@ -67,3 +67,8 @@ log.loggers.description = The logger nam
  otherwise. E.g. a logger name of org.apache.sling applies to logger \
  org.apache.sling.commons unless there is a different configuration for \
  org.apache.sling.commons. 
+
+log.markers.name = Markers
+log.markers.description = If not empty, the logger only logs messages \
+  having a marker with a name that matches one of the specified markers. 
+ 
\ No newline at end of file

Modified: sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.xml
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.xml?rev=1449656&r1=1449655&r2=1449656&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.xml (original)
+++ sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/main/resources/OSGI-INF/metatype/metatype.xml Mon Feb 25 10:51:06 2013
@@ -101,6 +101,10 @@
             type="String" name="%log.loggers.name"
             description="%log.loggers.description"
             cardinality="2147483647" />
+        <metatype:AD id="org.apache.sling.commons.log.markers"
+            type="String" name="%log.markers.name"
+            description="%log.markers.description"
+            cardinality="2147483647" />
     </metatype:OCD>
     <metatype:Designate
         pid="org.apache.sling.commons.log.LogManager.factory.config"

Modified: sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/test/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/test/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerTest.java?rev=1449656&r1=1449655&r2=1449656&view=diff
==============================================================================
--- sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/test/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerTest.java (original)
+++ sling/whiteboard/bdelacretaz/bundles-commons-log-with-markers/src/test/java/org/apache/sling/commons/log/internal/slf4j/SlingLoggerTest.java Mon Feb 25 10:51:06 2013
@@ -23,11 +23,58 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.lang.reflect.Method;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
 
 import junit.framework.TestCase;
 
+import org.slf4j.Marker;
+
 public class SlingLoggerTest extends TestCase {
+    
+    private static final Set<String> EMPTY_SET = new HashSet<String>();
+
+    @SuppressWarnings("serial")
+    static class TestMarker implements Marker {
+        private final String name;
+        
+        TestMarker(String name) {
+            this.name = name;
+        }
+
+        public void add(Marker arg0) {
+        }
+
+        public boolean contains(Marker arg0) {
+            return false;
+        }
+
+        public boolean contains(String arg0) {
+            return false;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public boolean hasChildren() {
+            return false;
+        }
 
+        public boolean hasReferences() {
+            return false;
+        }
+
+        public Iterator<?> iterator() {
+            return null;
+        }
+
+        public boolean remove(Marker arg0) {
+            return false;
+        }
+        
+    }
+    
     private SlingLoggerWriter output = new SlingLoggerWriter(null) {
         {
             try {
@@ -54,7 +101,7 @@ public class SlingLoggerTest extends Tes
         super.setUp();
 
         config = new SlingLoggerConfig(getClass().getName(), "",
-            new HashSet<String>(), SlingLoggerLevel.DEBUG, output);
+            EMPTY_SET, EMPTY_SET, SlingLoggerLevel.DEBUG, output);
 
         logger = new SlingLogger("sample");
         logger.setLoggerConfig(config);
@@ -147,7 +194,7 @@ public class SlingLoggerTest extends Tes
         setDelagateeOn(output, w);
 
         // a single message
-        config.configure(messageOnly, new HashSet<String>(),
+        config.configure(messageOnly, EMPTY_SET, EMPTY_SET, 
             SlingLoggerLevel.DEBUG, output);
 
         String message = "This is a message";
@@ -155,8 +202,8 @@ public class SlingLoggerTest extends Tes
         assertEquals(message, w.toString());
 
         // reset output buffer and format with logger name and message
-        w.getBuffer().delete(0, w.getBuffer().length());
-        config.configure("{3}|{5}", new HashSet<String>(),
+        clear(w);
+        config.configure("{3}|{5}", EMPTY_SET, EMPTY_SET, 
             SlingLoggerLevel.DEBUG, output);
 
         logger.warn(message);
@@ -164,14 +211,60 @@ public class SlingLoggerTest extends Tes
 
         // reset output buffer and format with logger name, level, thread and
         // message
-        w.getBuffer().delete(0, w.getBuffer().length());
-        config.configure("{2}|{3}|{4}|{5}", new HashSet<String>(),
+        clear(w);
+        config.configure("{2}|{3}|{4}|{5}", EMPTY_SET, EMPTY_SET, 
             SlingLoggerLevel.DEBUG, output);
         logger.warn(message);
         assertEquals(Thread.currentThread().getName() + "|" + logger.getName()
             + "|" + SlingLoggerLevel.WARN + "|" + message, w.toString());
     }
-
+    
+    public void testMarkers() {
+        final StringWriter w = new StringWriter();
+        setDelagateeOn(output, w);
+        final Set<String> markers = new HashSet<String>();
+        
+        config.configure(messageOnly, EMPTY_SET, 
+                markers, SlingLoggerLevel.INFO, output);
+        
+        clear(w);
+        logger.info("something");
+        assertFalse("No markers -> info writes to log", w.toString().isEmpty());
+        
+        markers.add("foo");
+        markers.add("bar");
+        config.configure(messageOnly, EMPTY_SET, 
+                markers, SlingLoggerLevel.INFO, output);
+        
+        clear(w);
+        logger.debug("More");
+        assertTrue("Markers + debug without marker -> no message", w.toString().isEmpty());
+        
+        clear(w);
+        logger.info("More");
+        assertTrue("Markers + info without marker -> no message", w.toString().isEmpty());
+        
+        clear(w);
+        logger.info(new TestMarker("foo"), "yes");
+        assertFalse("Markers + log with foo marker -> message", w.toString().isEmpty());
+        
+        clear(w);
+        logger.info(new TestMarker("bar"), "again");
+        assertFalse("Markers + log with bar marker -> message", w.toString().isEmpty());
+
+        clear(w);
+        logger.debug(new TestMarker("bar"), "again");
+        assertTrue("Markers + log with bar marker at debug level -> no message", w.toString().isEmpty());
+
+        clear(w);
+        logger.info(new TestMarker("other"), "not");
+        assertTrue("Markers + log with other marker -> no message", w.toString().isEmpty());
+    }
+    
+    private static void clear(StringWriter w) {
+        w.getBuffer().delete(0, w.getBuffer().length());
+    }
+    
     private static void setDelagateeOn(SlingLoggerWriter output, Writer w) {
         try {
             Method delegateeSetter = SlingLoggerWriter.class.getDeclaredMethod(