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