Author: cziegeler
Date: Fri Sep 27 12:58:02 2013
New Revision: 1526886

URL: http://svn.apache.org/r1526886
Log:
SLING-2024 : Make additivity configurable for a logger

Modified:
    
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfig.java
    
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfigManager.java
    
sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/internal/TestLogConfig.java

Modified: 
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfig.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfig.java?rev=1526886&r1=1526885&r2=1526886&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfig.java
 (original)
+++ 
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfig.java
 Fri Sep 27 12:58:02 2013
@@ -46,8 +46,10 @@ public class LogConfig {
 
     private final LoggerContext loggerContext;
 
+    private final boolean isAdditiv;
+
     LogConfig(LogWriterProvider logWriterProvider, final String pattern, 
Set<String> categories, Level logLevel,
-            String logWriterName, String configPid, LoggerContext 
loggerContext) {
+            String logWriterName, final boolean isAdditiv, String configPid, 
LoggerContext loggerContext) {
         this.logWriterProvider = logWriterProvider;
         this.configPid = configPid;
         this.pattern = pattern;
@@ -55,6 +57,7 @@ public class LogConfig {
         this.logLevel = logLevel;
         this.logWriterName = logWriterName;
         this.loggerContext = loggerContext;
+        this.isAdditiv = isAdditiv;
     }
 
     public String getConfigPid() {
@@ -77,6 +80,10 @@ public class LogConfig {
         return logWriterName != null;
     }
 
+    public boolean isAdditive() {
+        return this.isAdditiv;
+    }
+
     public LogWriter getLogWriter() {
         return logWriterProvider.getLogWriter(getLogWriterName());
     }

Modified: 
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfigManager.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfigManager.java?rev=1526886&r1=1526885&r2=1526886&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfigManager.java
 (original)
+++ 
sling/trunk/bundles/commons/log/src/main/java/org/apache/sling/commons/log/logback/internal/LogConfigManager.java
 Fri Sep 27 12:58:02 2013
@@ -29,6 +29,14 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.sling.commons.log.logback.internal.config.ConfigAdminSupport;
+import 
org.apache.sling.commons.log.logback.internal.config.ConfigurationException;
+import 
org.apache.sling.commons.log.logback.internal.util.LoggerSpecificEncoder;
+import org.apache.sling.commons.log.logback.internal.util.Util;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.LoggerContext;
 import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
@@ -40,14 +48,6 @@ import ch.qos.logback.core.OutputStreamA
 import ch.qos.logback.core.joran.action.ActionConst;
 import ch.qos.logback.core.util.ContextUtil;
 
-import org.apache.sling.commons.log.logback.internal.config.ConfigAdminSupport;
-import 
org.apache.sling.commons.log.logback.internal.config.ConfigurationException;
-import 
org.apache.sling.commons.log.logback.internal.util.LoggerSpecificEncoder;
-import org.apache.sling.commons.log.logback.internal.util.Util;
-import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 public class LogConfigManager implements LogbackResetListener, 
LogConfig.LogWriterProvider {
 
     public static final String LOG_LEVEL = 
"org.apache.sling.commons.log.level";
@@ -66,6 +66,8 @@ public class LogConfigManager implements
 
     public static final String LOG_LOGGERS = 
"org.apache.sling.commons.log.names";
 
+    public static final String LOG_ADDITIV = 
"org.apache.sling.commons.log.additiv";
+
     public static final String LOG_LEVEL_DEFAULT = "INFO";
 
     public static final int LOG_FILE_NUMBER_DEFAULT = 5;
@@ -189,6 +191,7 @@ public class LogConfigManager implements
 
     // ---------- SlingLogPanel support
 
+    @Override
     public LogWriter getLogWriter(String logWriterName) {
         LogWriter lw = writerByFileName.get(logWriterName);
         if (lw == null) {
@@ -274,9 +277,7 @@ public class LogConfigManager implements
                 ch.qos.logback.classic.Logger logger = 
loggerContext.getLogger(category);
                 logger.setLevel(config.getLogLevel());
                 if (appender != null) {
-                    //If an appender is explicitly defined then set additive 
to false
-                    //to be compatible with earlier Sling Logging behaviour
-                    logger.setAdditive(false);
+                    logger.setAdditive(config.isAdditive());
                     logger.addAppender(appender);
                 }
             }
@@ -342,7 +343,7 @@ public class LogConfigManager implements
      * {@link LogConfigManager#LOG_FILE_NUMBER_DEFAULT} is assumed.
      * If the writer writes standard output this property is ignored.</dd>
      * </dl>
-     * 
+     *
      * @param pid The identifier of the log writer to update or remove
      * @param configuration New configuration setting for the log writer or
      *            <code>null</code> to indicate to remove the log writer.
@@ -457,21 +458,29 @@ public class LogConfigManager implements
      * configured for any log writer or it may be the configuration PID of such
      * a writer. If this property is missing or empty or does not refer to an
      * existing log writer configuration, the default log writer is used.</dd>
-     * 
+     *
      * @param pid The name of the configuration to update or remove.
      * @param configuration The configuration object.
      * @throws ConfigurationException If the log level and logger names
      *             properties are not configured for the given configuration.
      */
-    public void updateLoggerConfiguration(String pid, Dictionary<?, ?> 
configuration, boolean performRefresh)
-            throws ConfigurationException {
+    public void updateLoggerConfiguration(final String pid, final 
Dictionary<?, ?> configuration, final boolean performRefresh)
+    throws ConfigurationException {
 
         if (configuration != null) {
 
             String pattern = (String) 
configuration.get(LogConfigManager.LOG_PATTERN);
-            String level = (String) 
configuration.get(LogConfigManager.LOG_LEVEL);
+            final String level = (String) 
configuration.get(LogConfigManager.LOG_LEVEL);
             String fileName = (String) 
configuration.get(LogConfigManager.LOG_FILE);
-            Set<String> categories = 
toCategoryList(configuration.get(LogConfigManager.LOG_LOGGERS));
+            final Set<String> categories = 
toCategoryList(configuration.get(LogConfigManager.LOG_LOGGERS));
+            final boolean additiv;
+            if ( configuration.get(LogConfigManager.LOG_ADDITIV) != null ) {
+                additiv = 
Boolean.valueOf(configuration.get(LogConfigManager.LOG_ADDITIV).toString());
+            } else {
+                // If an appender is explicitly defined then set additive to 
false
+                // to be compatible with earlier Sling Logging behavior
+                additiv = false;
+            }
 
             // verify categories
             if (categories == null) {
@@ -480,8 +489,8 @@ public class LogConfigManager implements
             }
 
             // verify no other configuration has any of the categories
-            for (String cat : categories) {
-                LogConfig cfg = configByCategory.get(cat);
+            for (final String cat : categories) {
+                final LogConfig cfg = configByCategory.get(cat);
                 if (cfg != null && !pid.equals(cfg.getConfigPid())) {
                     throw new 
ConfigurationException(LogConfigManager.LOG_LOGGERS, "Category " + cat
                         + " already defined by configuration " + pid);
@@ -493,7 +502,7 @@ public class LogConfigManager implements
                 throw new ConfigurationException(LogConfigManager.LOG_LEVEL, 
"Value required");
             }
             // TODO: support numeric levels !
-            Level logLevel = Level.toLevel(level);
+            final Level logLevel = Level.toLevel(level);
             if (logLevel == null) {
                 throw new ConfigurationException(LogConfigManager.LOG_LEVEL, 
"Unsupported value: " + level);
             }
@@ -510,7 +519,7 @@ public class LogConfigManager implements
             }
 
             // create or modify existing configuration object
-            LogConfig newConfig = new LogConfig(this, pattern, categories, 
logLevel, fileName, pid, loggerContext);
+            final LogConfig newConfig = new LogConfig(this, pattern, 
categories, logLevel, fileName, additiv, pid, loggerContext);
             LogConfig oldConfig = configByPid.get(pid);
             if (oldConfig != null) {
                 configByCategory.keySet().removeAll(oldConfig.getCategories());
@@ -614,7 +623,7 @@ public class LogConfigManager implements
      * unmodified. Otherwise it is made absolute by resolving it relative to 
the
      * root directory set on this instance by the {@link #setRoot(String)}
      * method.
-     * 
+     *
      * @throws NullPointerException if <code>logFileName</code> is
      *             <code>null</code>.
      */
@@ -654,7 +663,7 @@ public class LogConfigManager implements
      * array of strings or a collection of strings. Each string may in turn be 
a
      * comma-separated list of strings. Each entry makes up an entry in the
      * resulting set.
-     * 
+     *
      * @param loggers The configuration object to be decomposed. If this is
      *            <code>null</code>, <code>null</code> is returned immediately
      * @return The set of logger names provided by the <code>loggers</code>

Modified: 
sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/internal/TestLogConfig.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/internal/TestLogConfig.java?rev=1526886&r1=1526885&r2=1526886&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/internal/TestLogConfig.java
 (original)
+++ 
sling/trunk/bundles/commons/log/src/test/java/org/apache/sling/commons/log/logback/internal/TestLogConfig.java
 Fri Sep 27 12:58:02 2013
@@ -19,14 +19,15 @@
 
 package org.apache.sling.commons.log.logback.internal;
 
+import static org.junit.Assert.assertEquals;
+
 import java.util.Collections;
 
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.LoggerContext;
 import org.junit.Test;
 import org.slf4j.LoggerFactory;
 
-import static org.junit.Assert.assertEquals;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.LoggerContext;
 
 public class TestLogConfig {
 
@@ -48,7 +49,7 @@ public class TestLogConfig {
 
     private LogConfig createConfig(String pattern) {
         return new LogConfig(new DummyLogWriterProvider(), pattern, 
Collections.<String> emptySet(), Level.DEBUG,
-            "test", null, (LoggerContext) LoggerFactory.getILoggerFactory());
+            "test", false, null, (LoggerContext) 
LoggerFactory.getILoggerFactory());
     }
 
     private static class DummyLogWriterProvider implements 
LogConfig.LogWriterProvider {


Reply via email to