You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by vi...@apache.org on 2014/04/29 06:28:05 UTC

git commit: Add ability to set/get logging levels to nodetool patch by Jackson Chung reviewed by Vijay for CASSANDRA-6751

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 daf54c5c7 -> 0a20f5f17


Add ability to set/get logging levels to nodetool
patch by Jackson Chung reviewed by Vijay for CASSANDRA-6751


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/0a20f5f1
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/0a20f5f1
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/0a20f5f1

Branch: refs/heads/cassandra-2.0
Commit: 0a20f5f170b3596e6e74bba7daddebd4c1f5963a
Parents: daf54c5
Author: Vijay <vi...@gmail.com>
Authored: Mon Apr 28 21:24:07 2014 -0700
Committer: Vijay <vi...@gmail.com>
Committed: Mon Apr 28 21:27:58 2014 -0700

----------------------------------------------------------------------
 .../cassandra/service/StorageService.java       | 41 ++++++++++++++++++--
 .../cassandra/service/StorageServiceMBean.java  |  2 +
 .../org/apache/cassandra/tools/NodeCmd.java     | 29 +++++++++++++-
 .../org/apache/cassandra/tools/NodeProbe.java   | 10 +++++
 .../apache/cassandra/tools/NodeToolHelp.yaml    |  6 +++
 5 files changed, 84 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/0a20f5f1/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java
index 75f6427..f44eaed 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -45,6 +45,7 @@ import com.google.common.util.concurrent.Uninterruptibles;
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,7 +58,6 @@ import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.KSMetaData;
 import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.index.SecondaryIndex;
 import org.apache.cassandra.dht.*;
@@ -2795,9 +2795,44 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
     public void setLog4jLevel(String classQualifier, String rawLevel)
     {
+        org.apache.log4j.Logger log4jlogger = org.apache.log4j.Logger.getLogger(classQualifier);
+        // if both classQualifer and rawLevel are empty, reload from configuration
+        if (StringUtils.isBlank(classQualifier) && StringUtils.isBlank(rawLevel))
+        {
+            LogManager.resetConfiguration();
+            CassandraDaemon.initLog4j();
+            return;
+        }
+        // classQualifer is set, but blank level given
+        else if (StringUtils.isNotBlank(classQualifier) && StringUtils.isBlank(rawLevel))
+        {
+            if (log4jlogger.getLevel() != null || log4jlogger.getAllAppenders().hasMoreElements())
+                log4jlogger.setLevel(null);
+            return;
+        }
+
         Level level = Level.toLevel(rawLevel);
-        org.apache.log4j.Logger.getLogger(classQualifier).setLevel(level);
-        logger.info("set log level to " + level + " for classes under '" + classQualifier + "' (if the level doesn't look like '" + rawLevel + "' then log4j couldn't parse '" + rawLevel + "')");
+        log4jlogger.setLevel(level);
+        logger.info("set log level to {} for classes under '{}' (if the level doesn't look like '{}' then the logger couldn't parse '{}')", level, classQualifier, rawLevel, rawLevel);
+    }
+
+    /**
+     * @return the runtime logging levels for all the configured loggers
+     */
+    @Override
+    public Map<String,String> getLoggingLevels()
+    {
+        Map<String, String> logLevelMaps = Maps.newLinkedHashMap();
+        org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger();
+        logLevelMaps.put(rootLogger.getName(), rootLogger.getLevel().toString());
+        Enumeration<org.apache.log4j.Logger> loggers = LogManager.getCurrentLoggers();
+        while (loggers.hasMoreElements())
+        {
+            org.apache.log4j.Logger logger= loggers.nextElement();
+            if (logger.getLevel() != null)
+                logLevelMaps.put(logger.getName(), logger.getLevel().toString());
+        }
+        return logLevelMaps;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0a20f5f1/src/java/org/apache/cassandra/service/StorageServiceMBean.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
index ed260b8..9b1487f 100644
--- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java
+++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
@@ -341,6 +341,8 @@ public interface StorageServiceMBean extends NotificationEmitter
     /** set the logging level at runtime */
     public void setLog4jLevel(String classQualifier, String level);
 
+    public Map<String,String>getLoggingLevels();
+
     /** get the operational mode (leaving, joining, normal, decommissioned, client) **/
     public String getOperationMode();
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0a20f5f1/src/java/org/apache/cassandra/tools/NodeCmd.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java
index 618097d..b79a037 100644
--- a/src/java/org/apache/cassandra/tools/NodeCmd.java
+++ b/src/java/org/apache/cassandra/tools/NodeCmd.java
@@ -55,6 +55,9 @@ import org.apache.cassandra.streaming.SessionInfo;
 import org.apache.cassandra.utils.EstimatedHistogram;
 import org.apache.cassandra.utils.Pair;
 
+import static org.apache.commons.lang3.StringUtils.EMPTY;
+
+
 public class NodeCmd
 {
     private static final String HISTORYFILE = "nodetool.history";
@@ -184,7 +187,9 @@ public class NodeCmd
         ENABLEBACKUP,
         DISABLEBACKUP,
         SETCACHEKEYSTOSAVE,
-        RELOADTRIGGERS
+        RELOADTRIGGERS,
+        SETLOGGINGLEVEL,
+        GETLOGGINGLEVELS
     }
 
 
@@ -1444,6 +1449,20 @@ public class NodeCmd
                     probe.reloadTriggers();
                     break;
 
+                case SETLOGGINGLEVEL:
+                    String classQualifer = EMPTY;
+                    String level = EMPTY;
+                    if (arguments.length >= 1)
+                        classQualifer = arguments[0];
+                    if (arguments.length == 2)
+                        level = arguments[1];
+                    probe.setLoggingLevel(classQualifer, level);
+                    break;
+
+                case GETLOGGINGLEVELS :
+                    nodeCmd.getLoggingLevels(System.out);
+                    break;
+
                 default :
                     throw new RuntimeException("Unreachable code.");
             }
@@ -1465,6 +1484,14 @@ public class NodeCmd
         System.exit(probe.isFailed() ? 1 : 0);
     }
 
+    private void getLoggingLevels(PrintStream out)
+    {
+        // what if some one set a very long logger name? 50 space may not be enough...
+        System.out.printf("%n%-50s%10s%n", "Logger Name", "Log Level");
+        for (Map.Entry<String, String> entry : this.probe.getLoggingLevels().entrySet())
+            System.out.printf("%-50s%10s%n", entry.getKey(), entry.getValue());
+    }
+
     private void printCompactionHistory(PrintStream out)
     {
         out.println("Compaction History: ");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0a20f5f1/src/java/org/apache/cassandra/tools/NodeProbe.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java
index f42fd22..f0ee15d 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -916,6 +916,16 @@ public class NodeProbe
     {
         spProxy.reloadTriggerClasses();
     }
+
+    public void setLoggingLevel(String classQualifier, String level)
+    {
+        ssProxy.setLog4jLevel(classQualifier, level);
+    }
+
+    public Map<String, String> getLoggingLevels()
+    {
+         return ssProxy.getLoggingLevels();
+    }
 }
 
 class ColumnFamilyStoreMBeanIterator implements Iterator<Map.Entry<String, ColumnFamilyStoreMBean>>

http://git-wip-us.apache.org/repos/asf/cassandra/blob/0a20f5f1/src/resources/org/apache/cassandra/tools/NodeToolHelp.yaml
----------------------------------------------------------------------
diff --git a/src/resources/org/apache/cassandra/tools/NodeToolHelp.yaml b/src/resources/org/apache/cassandra/tools/NodeToolHelp.yaml
index eaab98a..8b0185e 100644
--- a/src/resources/org/apache/cassandra/tools/NodeToolHelp.yaml
+++ b/src/resources/org/apache/cassandra/tools/NodeToolHelp.yaml
@@ -220,3 +220,9 @@ commands:
   - name: reloadtriggers
     help: |
       reload trigger classes
+  - name: setLoggingLevel
+    help: |
+      Set a log level for a given logger. If both classQualifer and level are empty/null, it will reset to the initial configuration
+  - name: getLoggingLevels
+    help: |
+      Get the runtime logging levels