You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by el...@apache.org on 2016/01/28 00:59:28 UTC

[1/2] calcite git commit: [CALCITE-669] Mass removal of Java Logging for SLF4J

Repository: calcite
Updated Branches:
  refs/heads/master f55d10c14 -> 05a57992a


http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
index c48ab66..03b0ac3 100644
--- a/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
+++ b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java
@@ -33,6 +33,8 @@ import org.apache.calcite.util.SaffronProperties;
 import org.apache.calcite.util.Util;
 import org.apache.calcite.util.trace.CalciteTrace;
 
+import org.slf4j.Logger;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.charset.Charset;
@@ -40,8 +42,6 @@ import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Locale;
 import java.util.StringTokenizer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.calcite.util.Static.RESOURCE;
 
@@ -541,13 +541,9 @@ public final class SqlParserUtil {
    * taking operator precedence and associativity into account.
    */
   public static SqlNode toTree(List<Object> list) {
-    if (LOGGER.isLoggable(Level.FINER)) {
-      LOGGER.finer("Attempting to reduce " + list);
-    }
+    LOGGER.trace("Attempting to reduce {}", list);
     final SqlNode node = toTreeEx(list, 0, 0, SqlKind.OTHER);
-    if (LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine("Reduced " + node);
-    }
+    LOGGER.debug("Reduced {}", node);
     return node;
   }
 
@@ -647,9 +643,7 @@ public final class SqlParserUtil {
                     new SqlNode[]{leftExp, rightExp});
             final SqlCall newExp =
                 current.createCall(callPos, leftExp, rightExp);
-            if (LOGGER.isLoggable(Level.FINE)) {
-              LOGGER.fine("Reduced infix: " + newExp);
-            }
+            LOGGER.debug("Reduced infix: {}", newExp);
 
             // Replace elements {i - 1, i, i + 1} with the new
             // expression.
@@ -681,9 +675,7 @@ public final class SqlParserUtil {
                 currentPos.plusAll(new SqlNode[]{leftExp});
             final SqlCall newExp =
                 current.createCall(callPos, leftExp);
-            if (LOGGER.isLoggable(Level.FINE)) {
-              LOGGER.fine("Reduced postfix: " + newExp);
-            }
+            LOGGER.debug("Reduced postfix: {}", newExp);
 
             // Replace elements {i - 1, i} with the new expression.
             list.remove(i);
@@ -733,9 +725,7 @@ public final class SqlParserUtil {
           }
           if ((previousRight < left) && (right >= nextLeft)) {
             i = specOp.reduceExpr(i, list);
-            if (LOGGER.isLoggable(Level.FINE)) {
-              LOGGER.fine("Reduced special op: " + list.get(i));
-            }
+            LOGGER.debug("Reduced special op: {}", list.get(i));
             break;
           }
           i = nextOrdinal;

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
index 0d78656..948f3db 100644
--- a/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
+++ b/core/src/main/java/org/apache/calcite/sql/pretty/SqlPrettyWriter.java
@@ -27,6 +27,8 @@ import org.apache.calcite.util.trace.CalciteLogger;
 
 import com.google.common.base.Throwables;
 
+import org.slf4j.LoggerFactory;
+
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.lang.reflect.InvocationTargetException;
@@ -39,7 +41,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Properties;
 import java.util.Set;
-import java.util.logging.Logger;
 
 /**
  * Pretty printer for SQL statements.
@@ -122,7 +123,7 @@ public class SqlPrettyWriter implements SqlWriter {
 
   protected static final CalciteLogger LOGGER =
       new CalciteLogger(
-          Logger.getLogger("org.apache.calcite.sql.pretty.SqlPrettyWriter"));
+          LoggerFactory.getLogger("org.apache.calcite.sql.pretty.SqlPrettyWriter"));
 
   /**
    * Bean holding the default property values.
@@ -870,7 +871,7 @@ public class SqlPrettyWriter implements SqlWriter {
     if (result) {
       nextWhitespace = NL;
     }
-    LOGGER.finest("Token is '" + s + "'; result is " + result);
+    LOGGER.trace("Token is '{}'; result is {}", s, result);
     return result;
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java
index fe739f2..7a8bbdf 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java
@@ -18,7 +18,8 @@ package org.apache.calcite.sql.validate;
 
 import org.apache.calcite.util.CalciteValidatorException;
 
-import java.util.logging.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 // NOTE:  This class gets compiled independently of everything else so that
 // resource generation can use reflection.  That means it must have no
@@ -36,7 +37,7 @@ public class SqlValidatorException extends Exception
   //~ Static fields/initializers ---------------------------------------------
 
   private static final Logger LOGGER =
-      Logger.getLogger("org.apache.calcite.runtime.CalciteException");
+      LoggerFactory.getLogger("org.apache.calcite.runtime.CalciteException");
 
   static final long serialVersionUID = -831683113957131387L;
 
@@ -54,8 +55,8 @@ public class SqlValidatorException extends Exception
     super(message, cause);
 
     // TODO: see note in CalciteException constructor
-    LOGGER.throwing("SqlValidatorException", "constructor", this);
-    LOGGER.severe(toString());
+    LOGGER.trace("SqlValidatorException", this);
+    LOGGER.error(toString());
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
index ebc7ad0..b9ccf13 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java
@@ -91,6 +91,8 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
+import org.slf4j.Logger;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.AbstractList;
@@ -109,8 +111,6 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.calcite.sql.SqlUtil.stripAs;
 import static org.apache.calcite.util.Static.RESOURCE;
@@ -800,9 +800,7 @@ public class SqlValidatorImpl implements SqlValidatorWithHints {
     SqlNode outermostNode = performUnconditionalRewrites(topNode, false);
     cursorSet.add(outermostNode);
     top = outermostNode;
-    if (TRACER.isLoggable(Level.FINER)) {
-      TRACER.finer("After unconditional rewrite: " + outermostNode.toString());
-    }
+    TRACER.trace("After unconditional rewrite: " + outermostNode.toString());
     if (outermostNode.isA(SqlKind.TOP_LEVEL)) {
       registerQuery(scope, null, outermostNode, outermostNode, null, false);
     }
@@ -812,9 +810,7 @@ public class SqlValidatorImpl implements SqlValidatorWithHints {
       // caller later without needing the scope
       deriveType(scope, outermostNode);
     }
-    if (TRACER.isLoggable(Level.FINER)) {
-      TRACER.finer("After validation: " + outermostNode.toString());
-    }
+    TRACER.trace("After validation: " + outermostNode.toString());
     return outermostNode;
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
index 5d58f3f..252e6d1 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java
@@ -97,6 +97,8 @@ import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 import com.google.common.collect.SortedSetMultimap;
 
+import org.slf4j.Logger;
+
 import java.math.BigDecimal;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
@@ -112,8 +114,6 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * RelDecorrelator replaces all correlated expressions (corExp) in a relational
@@ -199,8 +199,8 @@ public class RelDecorrelator implements ReflectiveVisitor {
 
     RelNode newRootRel = decorrelator.removeCorrelationViaRule(rootRel);
 
-    if (SQL2REL_LOGGER.isLoggable(Level.FINE)) {
-      SQL2REL_LOGGER.fine(
+    if (SQL2REL_LOGGER.isDebugEnabled()) {
+      SQL2REL_LOGGER.debug(
           RelOptUtil.dumpPlan(
               "Plan after removing Correlator",
               newRootRel,
@@ -1741,9 +1741,8 @@ public class RelDecorrelator implements ReflectiveVisitor {
         final RelMetadataQuery mq = RelMetadataQuery.instance();
         if (!RelMdUtil.areColumnsDefinitelyUniqueWhenNullsFiltered(mq, right,
             rightJoinKeys)) {
-          SQL2REL_LOGGER.fine(rightJoinKeys.toString()
-              + "are not unique keys for "
-              + right.toString());
+          SQL2REL_LOGGER.debug("{} are not unique keys for {}",
+              rightJoinKeys.toString(), right.toString());
           return;
         }
 
@@ -1956,9 +1955,8 @@ public class RelDecorrelator implements ReflectiveVisitor {
         final RelMetadataQuery mq = RelMetadataQuery.instance();
         if (!RelMdUtil.areColumnsDefinitelyUniqueWhenNullsFiltered(mq, left,
             correlatedInputRefJoinKeys)) {
-          SQL2REL_LOGGER.fine(correlatedJoinKeys.toString()
-              + "are not unique keys for "
-              + left.toString());
+          SQL2REL_LOGGER.debug("{} are not unique keys for {}",
+              correlatedJoinKeys.toString(), left.toString());
           return;
         }
 
@@ -2034,7 +2032,7 @@ public class RelDecorrelator implements ReflectiveVisitor {
         // fields
         final RelMetadataQuery mq = RelMetadataQuery.instance();
         if (!RelMdUtil.areColumnsDefinitelyUnique(mq, left, allCols)) {
-          SQL2REL_LOGGER.fine("There are no unique keys for " + left);
+          SQL2REL_LOGGER.debug("There are no unique keys for {}", left);
           return;
         }
         //

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
index bd62c87..5246fa9 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
@@ -73,7 +73,6 @@ import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
 
 /**
  * Transformer that walks over a tree of relational expressions, replacing each
@@ -162,8 +161,8 @@ public class RelFieldTrimmer implements ReflectiveVisitor {
     if (!trimResult.right.isIdentity()) {
       throw new IllegalArgumentException();
     }
-    if (SqlToRelConverter.SQL2REL_LOGGER.isLoggable(Level.FINE)) {
-      SqlToRelConverter.SQL2REL_LOGGER.fine(
+    if (SqlToRelConverter.SQL2REL_LOGGER.isDebugEnabled()) {
+      SqlToRelConverter.SQL2REL_LOGGER.debug(
           RelOptUtil.dumpPlan("Plan after trimming unused fields",
               trimResult.left, false, SqlExplainLevel.EXPPLAN_ATTRIBUTES));
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index a17df51..5a51ca9 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -167,6 +167,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
+import org.slf4j.Logger;
+
 import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.util.AbstractList;
@@ -181,8 +183,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.calcite.sql.SqlUtil.stripAs;
 import static org.apache.calcite.util.Static.RESOURCE;
@@ -533,9 +533,8 @@ public class SqlToRelConverter {
             .replace(RelCollationTraitDef.INSTANCE, collations);
         rootRel = rootRel.copy(traitSet, rootRel.getInputs());
       }
-      boolean dumpPlan = SQL2REL_LOGGER.isLoggable(Level.FINE);
-      if (dumpPlan) {
-        SQL2REL_LOGGER.fine(
+      if (SQL2REL_LOGGER.isDebugEnabled()) {
+        SQL2REL_LOGGER.debug(
             RelOptUtil.dumpPlan(
                 "Plan after trimming unused fields",
                 rootRel,
@@ -590,9 +589,8 @@ public class SqlToRelConverter {
     }
     checkConvertedType(query, result);
 
-    boolean dumpPlan = SQL2REL_LOGGER.isLoggable(Level.FINE);
-    if (dumpPlan) {
-      SQL2REL_LOGGER.fine(
+    if (SQL2REL_LOGGER.isDebugEnabled()) {
+      SQL2REL_LOGGER.debug(
           RelOptUtil.dumpPlan(
               "Plan after converting SqlNode to RelNode",
               result,

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/util/Benchmark.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Benchmark.java b/core/src/main/java/org/apache/calcite/util/Benchmark.java
index b992427..513123e 100644
--- a/core/src/main/java/org/apache/calcite/util/Benchmark.java
+++ b/core/src/main/java/org/apache/calcite/util/Benchmark.java
@@ -18,12 +18,12 @@ package org.apache.calcite.util;
 
 import org.apache.calcite.linq4j.function.Function1;
 
-import java.text.MessageFormat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * Helps to run benchmarks by running the same task repeatedly and averaging
@@ -35,7 +35,7 @@ public class Benchmark {
    * higher.
    */
   public static final Logger LOGGER =
-      Logger.getLogger(Benchmark.class.getCanonicalName());
+      LoggerFactory.getLogger(Benchmark.class);
 
   private final Function1<Statistician, Void> function;
   private final int repeat;
@@ -52,13 +52,13 @@ public class Benchmark {
    * Returns whether performance tests are enabled.
    */
   public static boolean enabled() {
-    return LOGGER.isLoggable(Level.FINE);
+    return LOGGER.isDebugEnabled();
   }
 
   static long printDuration(String desc, long t0) {
     final long t1 = System.nanoTime();
     final long duration = t1 - t0;
-    LOGGER.finer(desc + " took " + duration + " nanos");
+    LOGGER.debug("{} took {} nanos", desc, duration);
     return duration;
   }
 
@@ -88,7 +88,7 @@ public class Benchmark {
     }
 
     private void printDurations() {
-      if (!LOGGER.isLoggable(Level.FINE)) {
+      if (!LOGGER.isDebugEnabled()) {
         return;
       }
 
@@ -120,14 +120,13 @@ public class Benchmark {
       }
       final double stddev = Math.sqrt(y / count);
       if (durations.size() == 0) {
-        LOGGER.fine(MessageFormat.format("{0}: {1}", desc, "no runs"));
+        LOGGER.debug("{}: {}", desc, "no runs");
       } else {
-        LOGGER.fine(
-            MessageFormat.format(
-                "{0}: {1} first; {2} +- {3}; {4} min; {5} max; {6} nanos",
+        LOGGER.debug(
+                "{}: {} first; {} +- {}; {} min; {} max; {} nanos",
                 desc,
                 durations.get(0), avg, stddev, coreDurations.get(0),
-                Util.last(coreDurations), durationsString));
+                Util.last(coreDurations), durationsString);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/util/Util.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java
index ed39af0..099f13c 100644
--- a/core/src/main/java/org/apache/calcite/util/Util.java
+++ b/core/src/main/java/org/apache/calcite/util/Util.java
@@ -37,6 +37,8 @@ import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+import org.slf4j.Logger;
+
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
@@ -80,8 +82,6 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TimeZone;
 import java.util.jar.JarFile;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
@@ -235,7 +235,7 @@ public class Util {
       Throwable e,
       Logger logger) {
     if (logger != null) {
-      logger.log(Level.FINER, "Discarding exception", e);
+      logger.debug("Discarding exception", e);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java b/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java
index 8105f8e..4b15f17 100644
--- a/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java
+++ b/core/src/main/java/org/apache/calcite/util/trace/CalciteLogger.java
@@ -16,21 +16,20 @@
  */
 package org.apache.calcite.util.trace;
 
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import org.slf4j.Logger;
 
 /**
  * Small extension to {@link Logger} with some performance improvements.
  *
- * <p>{@link Logger#log(Level level, String msg, Object[] params)} is expensive
+ * <p>{@link Logger#info(String format, Object[] params)} is expensive
  * to call, since the caller must always allocate and fill in the array
- * <code>params</code>, even when <code>level</code> will prevent a message
- * being logged. On the other hand, {@link Logger#log(Level level, String msg)}
- * and {@link Logger#log(Level level, String msg, Object)} do not have this
+ * <code>params</code>, even when the <code>level</code> will prevent a message
+ * being logged. On the other hand, {@link Logger#info(String msg)}
+ * and {@link Logger#info(String msg, Object o)} do not have this
  * problem.
  *
  * <p>As a workaround this class provides
- * {@link #log(Level, String msg, Object, Object)} etc. (The varargs feature of
+ * {@link #info(String msg, Object o1, Object o2)} etc. (The varargs feature of
  * java 1.5 half-solves this problem, by automatically wrapping args in an
  * array, but it does so without testing the level.)
  *
@@ -58,101 +57,156 @@ public class CalciteLogger {
 
   //~ Methods ----------------------------------------------------------------
 
+  // WARN
+
   /**
-   * Conditionally logs a message with two Object parameters
+   * Logs a WARN message with two Object parameters
    */
-  public void log(Level level, String msg, Object arg1, Object arg2) {
-    if (logger.isLoggable(level)) {
-      logger.log(
-          level,
-          msg,
-          new Object[]{arg1, arg2});
+  public void warn(String format, Object arg1, Object arg2) {
+    // slf4j already avoids the array creation for 1 or 2 arg invocations
+    logger.warn(format, arg1, arg2);
+  }
+
+  /**
+   * Conditionally logs a WARN message with three Object parameters
+   */
+  public void warn(String format, Object arg1, Object arg2, Object arg3) {
+    if (logger.isWarnEnabled()) {
+      logger.warn(format, arg1, arg2, arg3);
+    }
+  }
+
+  /**
+   * Conditionally logs a WARN message with four Object parameters
+   */
+  public void warn(String format, Object arg1, Object arg2, Object arg3, Object arg4) {
+    if (logger.isWarnEnabled()) {
+      logger.warn(format, arg1, arg2, arg3, arg4);
+    }
+  }
+
+  public void warn(String format, Object... args) {
+    if (logger.isWarnEnabled()) {
+      logger.warn(format, args);
     }
   }
 
+  // INFO
+
   /**
-   * Conditionally logs a message with three Object parameters
+   * Logs an INFO message with two Object parameters
    */
-  public void log(
-      Level level,
-      String msg,
-      Object arg1,
-      Object arg2,
-      Object arg3) {
-    if (logger.isLoggable(level)) {
-      logger.log(
-          level,
-          msg,
-          new Object[]{arg1, arg2, arg3});
+  public void info(String format, Object arg1, Object arg2) {
+    // slf4j already avoids the array creation for 1 or 2 arg invocations
+    logger.info(format, arg1, arg2);
+  }
+
+  /**
+   * Conditionally logs an INFO message with three Object parameters
+   */
+  public void info(String format, Object arg1, Object arg2, Object arg3) {
+    if (logger.isInfoEnabled()) {
+      logger.info(format, arg1, arg2, arg3);
     }
   }
 
   /**
-   * Conditionally logs a message with four Object parameters
+   * Conditionally logs an INFO message with four Object parameters
    */
-  public void log(
-      Level level,
-      String msg,
-      Object arg1,
-      Object arg2,
-      Object arg3,
-      Object arg4) {
-    if (logger.isLoggable(level)) {
-      logger.log(
-          level,
-          msg,
-          new Object[]{arg1, arg2, arg3, arg4});
+  public void info(String format, Object arg1, Object arg2, Object arg3, Object arg4) {
+    if (logger.isInfoEnabled()) {
+      logger.info(format, arg1, arg2, arg3, arg4);
     }
   }
 
-  // We expose and delegate the commonly used part of the Logger interface.
-  // For everything else, just expose the delegate. (Could use reflection.)
-  public Logger getLogger() {
-    return logger;
+  public void info(String format, Object... args) {
+    if (logger.isInfoEnabled()) {
+      logger.info(format, args);
+    }
   }
 
-  public void log(Level level, String msg) {
-    logger.log(level, msg);
+  // DEBUG
+
+  /**
+   * Logs a DEBUG message with two Object parameters
+   */
+  public void debug(String format, Object arg1, Object arg2) {
+    // slf4j already avoids the array creation for 1 or 2 arg invocations
+    logger.debug(format, arg1, arg2);
   }
 
-  public void log(Level level, String msg, Object param1) {
-    logger.log(level, msg, param1);
+  /**
+   * Conditionally logs a DEBUG message with three Object parameters
+   */
+  public void debug(String format, Object arg1, Object arg2, Object arg3) {
+    if (logger.isDebugEnabled()) {
+      logger.debug(format, arg1, arg2, arg3);
+    }
   }
 
-  public void log(Level level, String msg, Object[] params) {
-    logger.log(level, msg, params);
+  /**
+   * Conditionally logs a DEBUG message with four Object parameters
+   */
+  public void debug(String format, Object arg1, Object arg2, Object arg3, Object arg4) {
+    if (logger.isDebugEnabled()) {
+      logger.debug(format, arg1, arg2, arg3, arg4);
+    }
   }
 
-  public void log(Level level, String msg, Throwable thrown) {
-    logger.log(level, msg, thrown);
+  public void debug(String format, Object... args) {
+    if (logger.isDebugEnabled()) {
+      logger.debug(format, args);
+    }
   }
 
-  public void severe(String msg) {
-    logger.severe(msg);
+  // TRACE
+
+  /**
+   * Logs a TRACE message with two Object parameters
+   */
+  public void trace(String format, Object arg1, Object arg2) {
+    // slf4j already avoids the array creation for 1 or 2 arg invocations
+    logger.trace(format, arg1, arg2);
   }
 
-  public void warning(String msg) {
-    logger.warning(msg);
+  /**
+   * Conditionally logs a TRACE message with three Object parameters
+   */
+  public void trace(String format, Object arg1, Object arg2, Object arg3) {
+    if (logger.isTraceEnabled()) {
+      logger.trace(format, arg1, arg2, arg3);
+    }
   }
 
-  public void info(String msg) {
-    logger.info(msg);
+  /**
+   * Conditionally logs a TRACE message with four Object parameters
+   */
+  public void trace(String format, Object arg1, Object arg2, Object arg3, Object arg4) {
+    if (logger.isTraceEnabled()) {
+      logger.trace(format, arg1, arg2, arg3, arg4);
+    }
   }
 
-  public void config(String msg) {
-    logger.config(msg);
+  public void trace(String format, Object... args) {
+    if (logger.isTraceEnabled()) {
+      logger.trace(format, args);
+    }
   }
 
-  public void fine(String msg) {
-    logger.fine(msg);
+  // We expose and delegate the commonly used part of the Logger interface.
+  // For everything else, just expose the delegate. (Could use reflection.)
+  public Logger getLogger() {
+    return logger;
   }
 
-  public void finer(String msg) {
-    logger.finer(msg);
+  // Hold-over from the previous j.u.logging implementation
+
+  public void warn(String msg) {
+    logger.warn(msg);
   }
 
-  public void finest(String msg) {
-    logger.finest(msg);
+  public void info(String msg) {
+    logger.info(msg);
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java b/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
index bd962ba..792ab79 100644
--- a/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
+++ b/core/src/main/java/org/apache/calcite/util/trace/CalciteTimingTracer.java
@@ -16,9 +16,9 @@
  */
 package org.apache.calcite.util.trace;
 
+import org.slf4j.Logger;
+
 import java.text.DecimalFormat;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * CalciteTimingTracer provides a mechanism for tracing the timing of a call
@@ -49,14 +49,14 @@ public class CalciteTimingTracer {
   public CalciteTimingTracer(
       Logger logger,
       String startEvent) {
-    if (!logger.isLoggable(Level.FINE)) {
+    if (!logger.isDebugEnabled()) {
       this.logger = null;
       return;
     } else {
       this.logger = logger;
     }
     lastNanoTime = System.nanoTime();
-    logger.fine(startEvent + ":  elapsed nanos=0");
+    logger.debug("{}:  elapsed nanos=0", startEvent);
   }
 
   //~ Methods ----------------------------------------------------------------
@@ -73,8 +73,7 @@ public class CalciteTimingTracer {
     long newNanoTime = System.nanoTime();
     long elapsed = newNanoTime - lastNanoTime;
     lastNanoTime = newNanoTime;
-    logger.fine(
-        event + ":  elapsed nanos=" + DECIMAL_FORMAT.format(elapsed));
+    logger.debug("{}:  elapsed nanos={}", event, DECIMAL_FORMAT.format(elapsed));
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java b/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java
index eb04640..b3e46c4 100644
--- a/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java
+++ b/core/src/main/java/org/apache/calcite/util/trace/CalciteTrace.java
@@ -22,12 +22,13 @@ import org.apache.calcite.plan.RelImplementor;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.prepare.Prepare;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.File;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
- * Contains all of the {@link java.util.logging.Logger tracers} used within
+ * Contains all of the {@link org.slf4j.Logger tracers} used within
  * org.apache.calcite class libraries.
  *
  * <h3>Note to developers</h3>
@@ -39,8 +40,7 @@ import java.util.logging.Logger;
  *
  * <p>The javadoc in this file is the primary source of information on what
  * tracers are available, so the javadoc against each tracer member must be an
- * up-to-date description of what that tracer does. Be sure to describe what
- * {@link Level tracing level} is required to obtain each category of tracing.
+ * up-to-date description of what that tracer does.
  *
  * <p>In the class where the tracer is used, create a <em>private</em> (or
  * perhaps <em>protected</em>) <em>static final</em> member called <code>
@@ -51,8 +51,7 @@ public abstract class CalciteTrace {
 
   /**
    * The "org.apache.calcite.sql.parser" tracer reports parser events in
-   * {@link org.apache.calcite.sql.parser.SqlParser} and other classes (at level
-   * {@link Level#FINE} or higher).
+   * {@link org.apache.calcite.sql.parser.SqlParser} and other classes at DEBUG.
    */
   public static final Logger PARSER_LOGGER = getParserTracer();
 
@@ -73,30 +72,31 @@ public abstract class CalciteTrace {
    * <p>Levels:
    *
    * <ul>
-   * <li>{@link Level#FINE} prints rules as they fire;
-   * <li>{@link Level#FINER} prints and validates the whole expression pool
-   * and rule queue as each rule fires;
-   * <li>{@link Level#FINEST} prints finer details like rule importances.
+   * <li>{@link Logger#debug(String)} (formerly FINE) prints rules as they fire;
+   * <li>{@link Logger#trace(String)} (formerly FINER) prints and validates the whole expression
+   * pool and rule queue as each rule fires;
+   * <li>{@link Logger#trace(String)} (formerly FINEST) also prints finer details like rule
+   * importances.
    * </ul>
    */
   public static Logger getPlannerTracer() {
-    return Logger.getLogger(RelOptPlanner.class.getName());
+    return LoggerFactory.getLogger(RelOptPlanner.class.getName());
   }
 
   /**
    * The "org.apache.calcite.prepare.Prepare" tracer prints the generated
-   * program at level {@link java.util.logging.Level#FINE} or higher.
+   * program at DEBUG (formerly, FINE)  or higher.
    */
   public static Logger getStatementTracer() {
-    return Logger.getLogger(Prepare.class.getName());
+    return LoggerFactory.getLogger(Prepare.class.getName());
   }
 
   /**
    * The "org.apache.calcite.rel.RelImplementorImpl" tracer reports when
-   * expressions are bound to variables ({@link Level#FINE})
+   * expressions are bound to variables (DEBUG, formerly FINE)
    */
   public static Logger getRelImplementorTracer() {
-    return Logger.getLogger(RelImplementor.class.getName());
+    return LoggerFactory.getLogger(RelImplementor.class);
   }
 
   /**
@@ -106,21 +106,21 @@ public abstract class CalciteTrace {
    * @see CalciteTimingTracer
    */
   public static Logger getSqlTimingTracer() {
-    return Logger.getLogger("org.apache.calcite.sql.timing");
+    return LoggerFactory.getLogger("org.apache.calcite.sql.timing");
   }
 
   /**
    * The "org.apache.calcite.sql.parser" tracer reports parse events.
    */
   public static Logger getParserTracer() {
-    return Logger.getLogger("org.apache.calcite.sql.parser");
+    return LoggerFactory.getLogger("org.apache.calcite.sql.parser");
   }
 
   /**
    * The "org.apache.calcite.sql2rel" tracer reports parse events.
    */
   public static Logger getSqlToRelTracer() {
-    return Logger.getLogger("org.apache.calcite.sql2rel");
+    return LoggerFactory.getLogger("org.apache.calcite.sql2rel");
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index 2584dd2..cde2b8c 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -39,11 +39,13 @@ import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
-import java.util.logging.Logger;
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertEquals;
@@ -70,7 +72,7 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
   private static final String ANY = "(?s).*";
 
   protected static final Logger LOGGER =
-      Logger.getLogger(SqlValidatorTest.class.getName());
+      LoggerFactory.getLogger(SqlValidatorTest.class);
 
   private static final String ERR_IN_VALUES_INCOMPATIBLE =
       "Values in expression list must have compatible types";

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/core/src/test/resources/log4j.properties b/core/src/test/resources/log4j.properties
new file mode 100644
index 0000000..834e2db
--- /dev/null
+++ b/core/src/test/resources/log4j.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Root logger is configured at INFO and is sent to A1
+log4j.rootLogger=INFO, A1
+
+# A1 goes to the console
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# Set the pattern for each log message
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p - %m%n

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/mongodb/pom.xml
----------------------------------------------------------------------
diff --git a/mongodb/pom.xml b/mongodb/pom.xml
index 95132fb..3e65fd3 100644
--- a/mongodb/pom.xml
+++ b/mongodb/pom.xml
@@ -38,6 +38,10 @@ limitations under the License.
          in dependencyManagement in the root POM, not here. -->
     <dependency>
       <groupId>org.apache.calcite</groupId>
+      <artifactId>calcite-avatica</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.calcite</groupId>
       <artifactId>calcite-core</artifactId>
       <type>jar</type>
     </dependency>
@@ -70,6 +74,15 @@ limitations under the License.
       <groupId>org.mongodb</groupId>
       <artifactId>mongo-java-driver</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -77,6 +90,26 @@ limitations under the License.
       <!-- Sorted by groupId, artifactId. Put versions in
            pluginManagement in the root POM, not here. -->
       <plugin>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>analyze</id>
+            <goals>
+              <goal>analyze-only</goal>
+            </goals>
+            <configuration>
+              <failOnWarning>true</failOnWarning>
+              <!-- ignore "unused but declared" warnings -->
+              <ignoredUnusedDeclaredDependencies>
+                <ignoredUnusedDeclaredDependency>org.apache.calcite:calcite-avatica</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-api</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-log4j12</ignoredUnusedDeclaredDependency>
+              </ignoredUnusedDeclaredDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <executions>

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
----------------------------------------------------------------------
diff --git a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
index 50478ee..2f4bbef 100644
--- a/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
+++ b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoRules.java
@@ -46,12 +46,13 @@ import org.apache.calcite.util.Bug;
 import org.apache.calcite.util.Util;
 import org.apache.calcite.util.trace.CalciteTrace;
 
+import org.slf4j.Logger;
+
 import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Logger;
 
 /**
  * Rules and relational operators for
@@ -518,7 +519,7 @@ public class MongoRules {
             agg.getGroupSets(),
             agg.getAggCallList());
       } catch (InvalidRelException e) {
-        LOGGER.warning(e.toString());
+        LOGGER.warn(e.toString());
         return null;
       }
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/mongodb/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/mongodb/src/test/resources/log4j.properties b/mongodb/src/test/resources/log4j.properties
new file mode 100644
index 0000000..834e2db
--- /dev/null
+++ b/mongodb/src/test/resources/log4j.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Root logger is configured at INFO and is sent to A1
+log4j.rootLogger=INFO, A1
+
+# A1 goes to the console
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# Set the pattern for each log message
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p - %m%n

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/piglet/pom.xml
----------------------------------------------------------------------
diff --git a/piglet/pom.xml b/piglet/pom.xml
index 0cb463d..790910e 100644
--- a/piglet/pom.xml
+++ b/piglet/pom.xml
@@ -79,6 +79,15 @@ limitations under the License.
       <artifactId>hsqldb</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -147,6 +156,8 @@ limitations under the License.
               <ignoredUnusedDeclaredDependencies>
                 <ignoredUnusedDeclaredDependency>net.hydromatic:scott-data-hsqldb</ignoredUnusedDeclaredDependency>
                 <ignoredUnusedDeclaredDependency>org.hsqldb:hsqldb</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-api</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-log4j12</ignoredUnusedDeclaredDependency>
               </ignoredUnusedDeclaredDependencies>
             </configuration>
           </execution>

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/piglet/src/main/javacc/PigletParser.jj
----------------------------------------------------------------------
diff --git a/piglet/src/main/javacc/PigletParser.jj b/piglet/src/main/javacc/PigletParser.jj
index 9a6a43d..069400d 100644
--- a/piglet/src/main/javacc/PigletParser.jj
+++ b/piglet/src/main/javacc/PigletParser.jj
@@ -37,9 +37,9 @@ import org.apache.calcite.util.Pair;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
+import org.slf4j.Logger;
+
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.calcite.util.Static.RESOURCE;
 
@@ -61,7 +61,7 @@ PARSER_END(PigletParser)
 JAVACODE
 void debug_message1()
 {
-  LOGGER.log(Level.INFO, getToken(0).image + " , " + getToken(1).image);
+  LOGGER.info("{} , {}", getToken(0).image, getToken(1).image);
 }
 
 JAVACODE String unquotedIdentifier() {

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/piglet/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/piglet/src/test/resources/log4j.properties b/piglet/src/test/resources/log4j.properties
new file mode 100644
index 0000000..834e2db
--- /dev/null
+++ b/piglet/src/test/resources/log4j.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Root logger is configured at INFO and is sent to A1
+log4j.rootLogger=INFO, A1
+
+# A1 goes to the console
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# Set the pattern for each log message
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p - %m%n

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index fab54ef..a2dffd4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -102,6 +102,7 @@ limitations under the License.
     <scala.version>2.10.3</scala.version>
     <scott-data-hsqldb.version>0.1</scott-data-hsqldb.version>
     <servlet.version>3.0.1</servlet.version>
+    <slf4j.version>1.7.13</slf4j.version>
     <spark.version>0.9.0-incubating</spark.version>
     <sqlline.version>1.1.9</sqlline.version>
     <xalan.version>2.7.1</xalan.version>
@@ -182,11 +183,6 @@ limitations under the License.
         <version>${commons-dbcp.version}</version>
       </dependency>
       <dependency>
-        <groupId>commons-logging</groupId>
-        <artifactId>commons-logging</artifactId>
-        <version>${commons-logging.version}</version>
-      </dependency>
-      <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-core</artifactId>
         <version>${jackson.version}</version>
@@ -357,6 +353,16 @@ limitations under the License.
         <version>${jmh.version}</version>
       </dependency>
       <dependency>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-api</artifactId>
+        <version>${slf4j.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-log4j12</artifactId>
+        <version>${slf4j.version}</version>
+      </dependency>
+      <dependency>
         <groupId>sqlline</groupId>
         <artifactId>sqlline</artifactId>
         <version>${sqlline.version}</version>

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/site/_docs/history.md
----------------------------------------------------------------------
diff --git a/site/_docs/history.md b/site/_docs/history.md
index 3eba953..d46bfc8 100644
--- a/site/_docs/history.md
+++ b/site/_docs/history.md
@@ -28,6 +28,20 @@ For a full list of releases, see
 Downloads are available on the
 [downloads page]({{ site.baseurl }}/downloads/).
 
+## 1.7.0 / (Under Development)
+{: #v1-7-0}
+
+One notable change is that the use of JUL (java.util.logging) has been replaced
+with [SLF4J](http://slf4j.org/). SLF4J provides an API which Calcite can use
+independent of the logging implementation. This ultimately provides additional
+flexibility to users, allowing them to configure Calcite's logging within their
+own chosen logging framework. This work was done in [CALCITE-669](https://issues.apache.org/jira/browse/CALCITE-669).
+
+For users experienced with configuring JUL in Calcite previously, there are some
+differences as some the JUL logging levels do not exist in SLF4J: `FINE`,
+`FINER`, and `FINEST`, specifically. To deal with this, `FINE` was mapped
+to SLF4J's `DEBUG` level, while `FINER` and `FINEST` were mapped to SLF4J's `TRACE`.
+
 ## <a href="https://github.com/apache/calcite/releases/tag/calcite-1.6.0">1.6.0</a> / 2016-01-22
 {: #v1-6-0}
 
@@ -2327,4 +2341,3 @@ with the other changes in that release.
 {: #linq4j-v0-1-11}
 
 * Initial commit
-

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/site/_docs/howto.md
----------------------------------------------------------------------
diff --git a/site/_docs/howto.md b/site/_docs/howto.md
index e64e5af..1498152 100644
--- a/site/_docs/howto.md
+++ b/site/_docs/howto.md
@@ -170,7 +170,7 @@ See the [developers guide]({{ site.baseurl }}/develop/#getting-started).
 
 To enable tracing, add the following flags to the java command line:
 
-`-Dcalcite.debug=true -Djava.util.logging.config.file=core/src/test/resources/logging.properties`
+`-Dcalcite.debug=true`
 
 The first flag causes Calcite to print the Java code it generates
 (to execute queries) to stdout. It is especially useful if you are debugging
@@ -179,22 +179,20 @@ mysterious problems like this:
 `Exception in thread "main" java.lang.ClassCastException: Integer cannot be cast to Long
   at Baz$1$1.current(Unknown Source)`
 
-The second flag specifies a config file for
-the <a href="http://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html">java.util.logging</a>
-framework. Put the following into core/src/test/resources/logging.properties:
+By default, Calcite uses the Log4j bindings for SLF4J. There is a provided configuration
+file which outputs logging at the INFO level to the console in `core/src/test/resources/log4j.properties`.
+You can modify the level for the rootLogger to increase verbosity or change the level
+for a specific class if you so choose.
 
 {% highlight properties %}
-handlers= java.util.logging.ConsoleHandler
-.level= INFO
-org.apache.calcite.plan.RelOptPlanner.level=FINER
-java.util.logging.ConsoleHandler.level=ALL
+# Change rootLogger level to WARN
+log4j.rootLogger=WARN, A1
+# Increase level to DEBUG for RelOptPlanner
+log4j.logger.org.apache.calcite.plan.RelOptPlanner=DEBUG
+# Increase level to TRACE for HepPlanner
+log4j.logger.org.apache.calcite.plan.hep.HepPlanner=TRACE
 {% endhighlight %}
 
-The line `org.apache.calcite.plan.RelOptPlanner.level=FINER` tells the planner to produce
-fairly verbose output. You can modify the file to enable other loggers, or to change levels.
-For instance, if you change `FINER` to `FINEST` the planner will give you an account of the
-planning process so detailed that it might fill up your hard drive.
-
 ## CSV adapter
 
 See the [tutorial](/docs/tutorial.html).

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/splunk/pom.xml
----------------------------------------------------------------------
diff --git a/splunk/pom.xml b/splunk/pom.xml
index ea6f407..5b955b5 100644
--- a/splunk/pom.xml
+++ b/splunk/pom.xml
@@ -73,6 +73,15 @@ limitations under the License.
       <artifactId>hamcrest-core</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -82,6 +91,25 @@ limitations under the License.
            plugin declared here, IDEs don't know the sources are
            available. -->
       <plugin>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>analyze</id>
+            <goals>
+              <goal>analyze-only</goal>
+            </goals>
+            <configuration>
+              <failOnWarning>true</failOnWarning>
+              <!-- ignore "unused but declared" warnings -->
+              <ignoredUnusedDeclaredDependencies>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-api</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-log4j12</ignoredUnusedDeclaredDependency>
+              </ignoredUnusedDeclaredDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-source-plugin</artifactId>
         <executions>

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java
----------------------------------------------------------------------
diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java
index d432466..a9c0d8e 100644
--- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java
+++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkPushDownRule.java
@@ -41,11 +41,12 @@ import org.apache.calcite.util.Pair;
 
 import com.google.common.collect.ImmutableSet;
 
+import org.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Logger;
 
 /**
  * Planner rule to push filters and projections to Splunk.
@@ -111,7 +112,7 @@ public class SplunkPushDownRule
 
   // implement RelOptRule
   public void onMatch(RelOptRuleCall call) {
-    LOGGER.fine(description);
+    LOGGER.debug(description);
 
     int relLength = call.rels.length;
     SplunkTableScan splunkRel =
@@ -149,7 +150,7 @@ public class SplunkPushDownRule
       SqlOperator op = filterCall.getOperator();
       List<RexNode> operands = filterCall.getOperands();
 
-      LOGGER.fine("fieldNames: " + getFieldsString(topRow));
+      LOGGER.debug("fieldNames: {}", getFieldsString(topRow));
 
       final StringBuilder buf = new StringBuilder();
       if (getFilter(op, operands, buf, topRow.getFieldNames())) {
@@ -165,7 +166,7 @@ public class SplunkPushDownRule
     if (topProj != null) {
       topRow =  topProj.getRowType();
     }
-    LOGGER.fine("pre transformTo fieldNames: " + getFieldsString(topRow));
+    LOGGER.debug("pre transformTo fieldNames: {}", getFieldsString(topRow));
 
     call.transformTo(
         appendSearchString(
@@ -227,7 +228,7 @@ public class SplunkPushDownRule
     // handle top projection (ie reordering and renaming)
     List<RelDataTypeField> newFields = bottomFields;
     if (topProj != null) {
-      LOGGER.fine("topProj: " + String.valueOf(topProj.getPermutation()));
+      LOGGER.debug("topProj: {}", String.valueOf(topProj.getPermutation()));
       newFields = new ArrayList<RelDataTypeField>();
       int i = 0;
       for (RexNode rn : topProj.getProjects()) {
@@ -266,9 +267,9 @@ public class SplunkPushDownRule
             splunkRel.latest,
             resultType.getFieldNames());
 
-    LOGGER.fine(
-        "end of appendSearchString fieldNames: "
-        + rel.getRowType().getFieldNames());
+    LOGGER.debug(
+        "end of appendSearchString fieldNames: {}",
+        rel.getRowType().getFieldNames());
     return rel;
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java
----------------------------------------------------------------------
diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java
index 69affa1..8a41556 100644
--- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java
+++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java
@@ -23,6 +23,9 @@ import org.apache.calcite.linq4j.Linq4j;
 
 import au.com.bytecode.opencsv.CSVReader;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.BufferedReader;
 import java.io.Closeable;
 import java.io.IOException;
@@ -37,7 +40,6 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -49,7 +51,7 @@ import static org.apache.calcite.adapter.splunk.util.HttpUtils.post;
  */
 public class SplunkConnectionImpl implements SplunkConnection {
   private static final Logger LOGGER =
-      Logger.getLogger(SplunkConnectionImpl.class.getName());
+      LoggerFactory.getLogger(SplunkConnectionImpl.class);
 
   private static final Pattern SESSION_KEY =
       Pattern.compile(
@@ -175,8 +177,7 @@ public class SplunkConnectionImpl implements SplunkConnection {
     } catch (Exception e) {
       StringWriter sw = new StringWriter();
       e.printStackTrace(new PrintWriter(sw));
-      LOGGER.warning(e.getMessage() + "\n"
-          + sw);
+      LOGGER.warn("{}\n{}", e.getMessage(), sw);
       return srl == null ? Linq4j.emptyEnumerator() : null;
     }
   }
@@ -202,8 +203,7 @@ public class SplunkConnectionImpl implements SplunkConnection {
     } catch (IOException ignore) {
       StringWriter sw = new StringWriter();
       ignore.printStackTrace(new PrintWriter(sw));
-      LOGGER.warning(ignore.getMessage() + "\n"
-          + sw);
+      LOGGER.warn("{}\n{}", ignore.getMessage(), sw);
     } finally {
       HttpUtils.close(csvr); // CSVReader closes the input stream too
     }
@@ -381,8 +381,7 @@ public class SplunkConnectionImpl implements SplunkConnection {
       } catch (IOException ignore) {
         StringWriter sw = new StringWriter();
         ignore.printStackTrace(new PrintWriter(sw));
-        LOGGER.warning(ignore.getMessage() + "\n"
-            + sw);
+        LOGGER.warn("{}\n{}", ignore.getMessage(), sw);
       }
     }
 
@@ -423,8 +422,7 @@ public class SplunkConnectionImpl implements SplunkConnection {
       } catch (IOException ignore) {
         StringWriter sw = new StringWriter();
         ignore.printStackTrace(new PrintWriter(sw));
-        LOGGER.warning(ignore.getMessage() + "\n"
-            + sw);
+        LOGGER.warn("{}\n{}", ignore.getMessage(), sw);
       }
       return false;
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/HttpUtils.java
----------------------------------------------------------------------
diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/HttpUtils.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/HttpUtils.java
index 2ec870d..e259397 100644
--- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/HttpUtils.java
+++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/HttpUtils.java
@@ -16,6 +16,8 @@
  */
 package org.apache.calcite.adapter.splunk.util;
 
+import org.slf4j.Logger;
+
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
@@ -26,8 +28,6 @@ import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLEncoder;
 import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLSession;
@@ -156,9 +156,7 @@ public class HttpUtils {
       InputStream in = conn.getInputStream();
       wr.close();
 
-      if (LOGGER.isLoggable(Level.FINE)) {
-        LOGGER.fine("url: " + url + ", data: " + String.valueOf(data));
-      }
+      LOGGER.debug("url: {}, data: {}", url, String.valueOf(data));
       return in;
     } finally {
       close(wr);

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/StringUtils.java
----------------------------------------------------------------------
diff --git a/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/StringUtils.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/StringUtils.java
index 5000d1d..ac08949 100644
--- a/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/StringUtils.java
+++ b/splunk/src/main/java/org/apache/calcite/adapter/splunk/util/StringUtils.java
@@ -16,9 +16,11 @@
  */
 package org.apache.calcite.adapter.splunk.util;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.LinkedList;
 import java.util.List;
-import java.util.logging.Logger;
 
 /**
  * Utility methods for encoding and decoding strings for Splunk REST calls.
@@ -150,7 +152,7 @@ public class StringUtils {
   }
 
   public static Logger getClassTracer(Class clazz) {
-    return Logger.getLogger(clazz.getName());
+    return LoggerFactory.getLogger(clazz);
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/splunk/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/splunk/src/test/resources/log4j.properties b/splunk/src/test/resources/log4j.properties
new file mode 100644
index 0000000..834e2db
--- /dev/null
+++ b/splunk/src/test/resources/log4j.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Root logger is configured at INFO and is sent to A1
+log4j.rootLogger=INFO, A1
+
+# A1 goes to the console
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# Set the pattern for each log message
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p - %m%n

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/src/main/config/checkstyle/suppressions.xml
----------------------------------------------------------------------
diff --git a/src/main/config/checkstyle/suppressions.xml b/src/main/config/checkstyle/suppressions.xml
index e4aaead..e0cc66a 100644
--- a/src/main/config/checkstyle/suppressions.xml
+++ b/src/main/config/checkstyle/suppressions.xml
@@ -28,6 +28,7 @@ limitations under the License.
   <suppress checks=".*" files="trace.properties"/>
   <suppress checks=".*" files="release.properties"/>
   <suppress checks=".*" files="avatica[/\\]src[/\\]main[/\\]java[/\\]org[/\\]apache[/\\]calcite[/\\]avatica[/\\]proto"/>
+  <suppress checks=".*" files="log4j.properties"/>
 
   <!-- This file triggers https://github.com/checkstyle/checkstyle/issues/92,
        through no fault of its own. -->


[2/2] calcite git commit: [CALCITE-669] Mass removal of Java Logging for SLF4J

Posted by el...@apache.org.
[CALCITE-669] Mass removal of Java Logging for SLF4J

Replace FINE with DEBUG, FINER and FINEST with TRACE.
Includes the slf4j-log4j12 binding for test-time. Attempts
remove all conditional logging blocks unless there is
a reason to keep them. Adds forward-looking documentation
for log-level changes.

Closes apache/calcite#186


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/05a57992
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/05a57992
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/05a57992

Branch: refs/heads/master
Commit: 05a57992a45f9aa66db31355aa7733cfadafa1e1
Parents: f55d10c
Author: Josh Elser <el...@apache.org>
Authored: Wed Jan 27 17:43:50 2016 -0500
Committer: Josh Elser <el...@apache.org>
Committed: Wed Jan 27 18:59:10 2016 -0500

----------------------------------------------------------------------
 avatica-server/pom.xml                          |  11 +-
 .../apache/calcite/avatica/jdbc/JdbcMeta.java   |  78 +++-----
 .../avatica/server/AvaticaJsonHandler.java      |  16 +-
 .../avatica/server/AvaticaProtobufHandler.java  |   8 +-
 .../server/DelegatingAvaticaHandler.java        |   8 +-
 .../calcite/avatica/server/HttpServer.java      |  10 +-
 .../src/test/resources/log4j.properties         |  24 +++
 avatica/pom.xml                                 |  27 +++
 .../apache/calcite/avatica/remote/Driver.java   |   5 +
 core/pom.xml                                    |  11 ++
 core/src/main/codegen/templates/Parser.jj       |   7 +-
 .../enumerable/EnumerableAggregateRule.java     |   2 +-
 .../adapter/enumerable/EnumerableJoinRule.java  |   4 +-
 .../enumerable/EnumerableMergeJoinRule.java     |   2 +-
 .../adapter/enumerable/EnumerableRules.java     |   2 +-
 .../apache/calcite/adapter/jdbc/JdbcRules.java  |   7 +-
 .../apache/calcite/interpreter/Bindables.java   |   2 +-
 .../calcite/plan/AbstractRelOptPlanner.java     |  29 +--
 .../org/apache/calcite/plan/RelOptPlanner.java  |   3 +-
 .../org/apache/calcite/plan/RelOptRuleCall.java |   3 +-
 .../calcite/plan/RexImplicationChecker.java     |  16 +-
 .../calcite/plan/SubstitutionVisitor.java       |  20 +-
 .../apache/calcite/plan/VisitorDataContext.java |  15 +-
 .../org/apache/calcite/plan/hep/HepPlanner.java |  46 ++---
 .../org/apache/calcite/plan/volcano/RelSet.java |   5 +-
 .../apache/calcite/plan/volcano/RelSubset.java  |  13 +-
 .../apache/calcite/plan/volcano/RuleQueue.java  |  42 ++---
 .../calcite/plan/volcano/VolcanoPlanner.java    |  58 ++----
 .../calcite/plan/volcano/VolcanoRuleCall.java   |  67 +++----
 .../org/apache/calcite/prepare/Prepare.java     |  11 +-
 .../org/apache/calcite/rel/AbstractRelNode.java |   8 +-
 .../apache/calcite/rel/InvalidRelException.java |   2 +-
 .../calcite/rel/rel2sql/SqlImplementor.java     |  12 +-
 .../calcite/rel/rules/CalcRelSplitter.java      |   8 +-
 .../calcite/rel/rules/ValuesReduceRule.java     |   3 +-
 .../calcite/runtime/CalciteException.java       |   9 +-
 .../calcite/runtime/ResultSetEnumerable.java    |  13 +-
 .../apache/calcite/sql/advise/SqlAdvisor.java   |   3 +-
 .../calcite/sql/parser/SqlParserUtil.java       |  24 +--
 .../calcite/sql/pretty/SqlPrettyWriter.java     |   7 +-
 .../sql/validate/SqlValidatorException.java     |   9 +-
 .../calcite/sql/validate/SqlValidatorImpl.java  |  12 +-
 .../apache/calcite/sql2rel/RelDecorrelator.java |  20 +-
 .../apache/calcite/sql2rel/RelFieldTrimmer.java |   5 +-
 .../calcite/sql2rel/SqlToRelConverter.java      |  14 +-
 .../java/org/apache/calcite/util/Benchmark.java |  23 ++-
 .../main/java/org/apache/calcite/util/Util.java |   6 +-
 .../calcite/util/trace/CalciteLogger.java       | 184 ++++++++++++-------
 .../calcite/util/trace/CalciteTimingTracer.java |  11 +-
 .../apache/calcite/util/trace/CalciteTrace.java |  38 ++--
 .../apache/calcite/test/SqlValidatorTest.java   |   6 +-
 core/src/test/resources/log4j.properties        |  24 +++
 mongodb/pom.xml                                 |  33 ++++
 .../calcite/adapter/mongodb/MongoRules.java     |   5 +-
 mongodb/src/test/resources/log4j.properties     |  24 +++
 piglet/pom.xml                                  |  11 ++
 piglet/src/main/javacc/PigletParser.jj          |   6 +-
 piglet/src/test/resources/log4j.properties      |  24 +++
 pom.xml                                         |  16 +-
 site/_docs/history.md                           |  15 +-
 site/_docs/howto.md                             |  24 ++-
 splunk/pom.xml                                  |  28 +++
 .../adapter/splunk/SplunkPushDownRule.java      |  17 +-
 .../splunk/search/SplunkConnectionImpl.java     |  18 +-
 .../calcite/adapter/splunk/util/HttpUtils.java  |   8 +-
 .../adapter/splunk/util/StringUtils.java        |   6 +-
 splunk/src/test/resources/log4j.properties      |  24 +++
 src/main/config/checkstyle/suppressions.xml     |   1 +
 68 files changed, 718 insertions(+), 535 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica-server/pom.xml
----------------------------------------------------------------------
diff --git a/avatica-server/pom.xml b/avatica-server/pom.xml
index 11509d3..2386243 100644
--- a/avatica-server/pom.xml
+++ b/avatica-server/pom.xml
@@ -49,8 +49,8 @@ limitations under the License.
       <artifactId>guava</artifactId>
     </dependency>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.eclipse.jetty</groupId>
@@ -100,6 +100,11 @@ limitations under the License.
       <artifactId>jcip-annotations</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
@@ -140,6 +145,8 @@ limitations under the License.
               <ignoredUnusedDeclaredDependencies>
                 <ignoredUnusedDeclaredDependency>net.hydromatic:scott-data-hsqldb</ignoredUnusedDeclaredDependency>
                 <ignoredUnusedDeclaredDependency>org.hsqldb:hsqldb</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-api</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-log4j12</ignoredUnusedDeclaredDependency>
               </ignoredUnusedDeclaredDependencies>
             </configuration>
           </execution>

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
index 9ff7cc9..8cac9f8 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/jdbc/JdbcMeta.java
@@ -30,14 +30,14 @@ import org.apache.calcite.avatica.QueryState;
 import org.apache.calcite.avatica.SqlType;
 import org.apache.calcite.avatica.remote.TypedValue;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.RemovalListener;
 import com.google.common.cache.RemovalNotification;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.lang.reflect.InvocationTargetException;
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
@@ -61,7 +61,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 /** Implementation of {@link Meta} upon an existing JDBC data source. */
 public class JdbcMeta implements Meta {
-  private static final Log LOG = LogFactory.getLog(JdbcMeta.class);
+  private static final Logger LOG = LoggerFactory.getLogger(JdbcMeta.class);
 
   private static final String CONN_CACHE_KEY_BASE = "avatica.connectioncache";
 
@@ -151,9 +151,7 @@ public class JdbcMeta implements Meta {
         .expireAfterAccess(connectionExpiryDuration, connectionExpiryUnit)
         .removalListener(new ConnectionExpiryHandler())
         .build();
-    if (LOG.isDebugEnabled()) {
-      LOG.debug("instantiated connection cache: " + connectionCache.stats());
-    }
+    LOG.debug("instantiated connection cache: {}", connectionCache.stats());
 
     concurrencyLevel = Integer.parseInt(
         info.getProperty(StatementCacheSettings.CONCURRENCY_LEVEL.key(),
@@ -177,9 +175,8 @@ public class JdbcMeta implements Meta {
         .expireAfterAccess(connectionExpiryDuration, connectionExpiryUnit)
         .removalListener(new StatementExpiryHandler())
         .build();
-    if (LOG.isDebugEnabled()) {
-      LOG.debug("instantiated statement cache: " + statementCache.stats());
-    }
+
+    LOG.debug("instantiated statement cache: {}", statementCache.stats());
   }
 
   /**
@@ -396,10 +393,8 @@ public class JdbcMeta implements Meta {
 
   public MetaResultSet getBestRowIdentifier(ConnectionHandle ch, String catalog, String schema,
       String table, int scope, boolean nullable) {
-    if (LOG.isTraceEnabled()) {
-      LOG.trace("getBestRowIdentifier catalog:" + catalog + " schema:" + schema
-          + " table:" + table + " scope:" + scope + " nullable:" + nullable);
-    }
+    LOG.trace("getBestRowIdentifier catalog:{} schema:{} table:{} scope:{} nullable:{}", catalog,
+        schema, table, scope, nullable);
     try {
       final ResultSet rs =
           getConnection(ch.id).getMetaData().getBestRowIdentifier(catalog, schema,
@@ -413,9 +408,7 @@ public class JdbcMeta implements Meta {
 
   public MetaResultSet getVersionColumns(ConnectionHandle ch, String catalog, String schema,
       String table) {
-    if (LOG.isTraceEnabled()) {
-      LOG.trace("getVersionColumns catalog:" + catalog + " schema:" + schema + " table:" + table);
-    }
+    LOG.trace("getVersionColumns catalog:{} schema:{} table:{}", catalog, schema, table);
     try {
       final ResultSet rs =
           getConnection(ch.id).getMetaData().getVersionColumns(catalog, schema, table);
@@ -428,9 +421,7 @@ public class JdbcMeta implements Meta {
 
   public MetaResultSet getPrimaryKeys(ConnectionHandle ch, String catalog, String schema,
       String table) {
-    if (LOG.isTraceEnabled()) {
-      LOG.trace("getPrimaryKeys catalog:" + catalog + " schema:" + schema + " table:" + table);
-    }
+    LOG.trace("getPrimaryKeys catalog:{} schema:{} table:{}", catalog, schema, table);
     try {
       final ResultSet rs =
           getConnection(ch.id).getMetaData().getPrimaryKeys(catalog, schema, table);
@@ -535,9 +526,7 @@ public class JdbcMeta implements Meta {
       final int id = statementIdGenerator.getAndIncrement();
       statementCache.put(id, new StatementInfo(statement));
       StatementHandle h = new StatementHandle(ch.id, id, null);
-      if (LOG.isTraceEnabled()) {
-        LOG.trace("created statement " + h);
-      }
+      LOG.trace("created statement {}", h);
       return h;
     } catch (SQLException e) {
       throw propagate(e);
@@ -547,12 +536,10 @@ public class JdbcMeta implements Meta {
   @Override public void closeStatement(StatementHandle h) {
     StatementInfo info = statementCache.getIfPresent(h.id);
     if (info == null || info.statement == null) {
-      LOG.debug("client requested close unknown statement " + h);
+      LOG.debug("client requested close unknown statement {}", h);
       return;
     }
-    if (LOG.isTraceEnabled()) {
-      LOG.trace("closing statement " + h);
-    }
+    LOG.trace("closing statement {}", h);
     try {
       ResultSet results = info.getResultSet();
       if (info.isResultSetInitialized() && null != results) {
@@ -590,12 +577,10 @@ public class JdbcMeta implements Meta {
   @Override public void closeConnection(ConnectionHandle ch) {
     Connection conn = connectionCache.getIfPresent(ch.id);
     if (conn == null) {
-      LOG.debug("client requested close unknown connection " + ch);
+      LOG.debug("client requested close unknown connection {}", ch);
       return;
     }
-    if (LOG.isTraceEnabled()) {
-      LOG.trace("closing connection " + ch);
-    }
+    LOG.trace("closing connection {}", ch);
     try {
       conn.close();
     } catch (SQLException e) {
@@ -626,9 +611,7 @@ public class JdbcMeta implements Meta {
 
   @Override public ConnectionProperties connectionSync(ConnectionHandle ch,
       ConnectionProperties connProps) {
-    if (LOG.isTraceEnabled()) {
-      LOG.trace("syncing properties for connection " + ch);
-    }
+    LOG.trace("syncing properties for connection {}", ch);
     try {
       Connection conn = getConnection(ch.id);
       ConnectionPropertiesImpl props = new ConnectionPropertiesImpl(conn).merge(connProps);
@@ -669,9 +652,7 @@ public class JdbcMeta implements Meta {
       StatementHandle h = new StatementHandle(ch.id, id,
           signature(statement.getMetaData(), statement.getParameterMetaData(),
               sql, statementType));
-      if (LOG.isTraceEnabled()) {
-        LOG.trace("prepared statement " + h);
-      }
+      LOG.trace("prepared statement {}", h);
       return h;
     } catch (SQLException e) {
       throw propagate(e);
@@ -706,9 +687,7 @@ public class JdbcMeta implements Meta {
         resultSets.add(
             JdbcResultSet.create(h.connectionId, h.id, info.getResultSet(), maxRowCount));
       }
-      if (LOG.isTraceEnabled()) {
-        LOG.trace("prepAndExec statement " + h);
-      }
+      LOG.trace("prepAndExec statement {}", h);
       // TODO: review client to ensure statementId is updated when appropriate
       return new ExecuteResult(resultSets);
     } catch (SQLException e) {
@@ -742,10 +721,7 @@ public class JdbcMeta implements Meta {
 
   public Frame fetch(StatementHandle h, long offset, int fetchMaxRowCount) throws
       NoSuchStatementException, MissingResultsException {
-    if (LOG.isTraceEnabled()) {
-      LOG.trace("fetching " + h + " offset:" + offset + " fetchMaxRowCount:"
-          + fetchMaxRowCount);
-    }
+    LOG.trace("fetching {} offset:{} fetchMaxRowCount:{}", h, offset, fetchMaxRowCount);
     try {
       final StatementInfo statementInfo = statementCache.getIfPresent(h.id);
       if (null == statementInfo) {
@@ -935,16 +911,13 @@ public class JdbcMeta implements Meta {
     public void onRemoval(RemovalNotification<String, Connection> notification) {
       String connectionId = notification.getKey();
       Connection doomed = notification.getValue();
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Expiring connection " + connectionId + " because "
-                + notification.getCause());
-      }
+      LOG.debug("Expiring connection {} because {}", connectionId, notification.getCause());
       try {
         if (doomed != null) {
           doomed.close();
         }
       } catch (Throwable t) {
-        LOG.info("Exception thrown while expiring connection " + connectionId, t);
+        LOG.info("Exception thrown while expiring connection {}", connectionId, t);
       }
     }
   }
@@ -959,10 +932,7 @@ public class JdbcMeta implements Meta {
         // log/throw?
         return;
       }
-      if (LOG.isDebugEnabled()) {
-        LOG.debug("Expiring statement " + stmtId + " because "
-                + notification.getCause());
-      }
+      LOG.debug("Expiring statement {} because {}", stmtId, notification.getCause());
       try {
         if (doomed.getResultSet() != null) {
           doomed.getResultSet().close();
@@ -971,7 +941,7 @@ public class JdbcMeta implements Meta {
           doomed.statement.close();
         }
       } catch (Throwable t) {
-        LOG.info("Exception thrown while expiring statement " + stmtId);
+        LOG.info("Exception thrown while expiring statement {}", stmtId, t);
       }
     }
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java
index 51ffba6..250c1d5 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaJsonHandler.java
@@ -22,12 +22,12 @@ import org.apache.calcite.avatica.remote.JsonHandler;
 import org.apache.calcite.avatica.remote.Service;
 import org.apache.calcite.avatica.remote.Service.RpcMetadataResponse;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.IOException;
 import java.util.Objects;
 
@@ -40,7 +40,7 @@ import javax.servlet.http.HttpServletResponse;
  * Jetty handler that executes Avatica JSON request-responses.
  */
 public class AvaticaJsonHandler extends AbstractHandler implements AvaticaHandler {
-  private static final Log LOG = LogFactory.getLog(AvaticaJsonHandler.class);
+  private static final Logger LOG = LoggerFactory.getLogger(AvaticaJsonHandler.class);
 
   final Service service;
   final JsonHandler jsonHandler;
@@ -66,14 +66,10 @@ public class AvaticaJsonHandler extends AbstractHandler implements AvaticaHandle
       }
       final String jsonRequest =
           new String(rawRequest.getBytes("ISO-8859-1"), "UTF-8");
-      if (LOG.isTraceEnabled()) {
-        LOG.trace("request: " + jsonRequest);
-      }
+      LOG.trace("request: {}", jsonRequest);
 
       final HandlerResponse<String> jsonResponse = jsonHandler.apply(jsonRequest);
-      if (LOG.isTraceEnabled()) {
-        LOG.trace("response: " + jsonResponse);
-      }
+      LOG.trace("response: {}", jsonResponse);
       baseRequest.setHandled(true);
       // Set the status code and write out the response.
       response.setStatus(jsonResponse.getStatusCode());

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
index dcaf05e..e44de00 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/AvaticaProtobufHandler.java
@@ -24,12 +24,12 @@ import org.apache.calcite.avatica.remote.ProtobufTranslationImpl;
 import org.apache.calcite.avatica.remote.Service;
 import org.apache.calcite.avatica.remote.Service.RpcMetadataResponse;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.IOException;
 import java.util.Objects;
 
@@ -42,7 +42,7 @@ import javax.servlet.http.HttpServletResponse;
  * Jetty handler that executes Avatica JSON request-responses.
  */
 public class AvaticaProtobufHandler extends AbstractHandler implements AvaticaHandler {
-  private static final Log LOG = LogFactory.getLog(AvaticaJsonHandler.class);
+  private static final Logger LOG = LoggerFactory.getLogger(AvaticaJsonHandler.class);
 
   private final Service service;
   private final ProtobufHandler pbHandler;

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica-server/src/main/java/org/apache/calcite/avatica/server/DelegatingAvaticaHandler.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/DelegatingAvaticaHandler.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/DelegatingAvaticaHandler.java
index 7270f40..223fba7 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/DelegatingAvaticaHandler.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/DelegatingAvaticaHandler.java
@@ -18,13 +18,13 @@ package org.apache.calcite.avatica.server;
 
 import org.apache.calcite.avatica.remote.Service.RpcMetadataResponse;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.Server;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.IOException;
 import java.util.Objects;
 
@@ -39,7 +39,7 @@ import javax.servlet.http.HttpServletResponse;
  * {@link #setServerRpcMetadata(org.apache.calcite.avatica.remote.Service.RpcMetadataResponse)}.
  */
 public class DelegatingAvaticaHandler implements AvaticaHandler {
-  private static final Log LOG = LogFactory.getLog(DelegatingAvaticaHandler.class);
+  private static final Logger LOG = LoggerFactory.getLogger(DelegatingAvaticaHandler.class);
 
   private final Handler handler;
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica-server/src/main/java/org/apache/calcite/avatica/server/HttpServer.java
----------------------------------------------------------------------
diff --git a/avatica-server/src/main/java/org/apache/calcite/avatica/server/HttpServer.java b/avatica-server/src/main/java/org/apache/calcite/avatica/server/HttpServer.java
index cffbf60..c81e899 100644
--- a/avatica-server/src/main/java/org/apache/calcite/avatica/server/HttpServer.java
+++ b/avatica-server/src/main/java/org/apache/calcite/avatica/server/HttpServer.java
@@ -18,9 +18,6 @@ package org.apache.calcite.avatica.server;
 
 import org.apache.calcite.avatica.remote.Service.RpcMetadataResponse;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Server;
@@ -29,6 +26,9 @@ import org.eclipse.jetty.server.handler.DefaultHandler;
 import org.eclipse.jetty.server.handler.HandlerList;
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 
@@ -39,7 +39,7 @@ import java.net.UnknownHostException;
  * {@link #configureConnector(ServerConnector, int)} method in a derived class.
  */
 public class HttpServer {
-  private static final Log LOG = LogFactory.getLog(HttpServer.class);
+  private static final Logger LOG = LoggerFactory.getLogger(HttpServer.class);
 
   private Server server;
   private int port = -1;
@@ -96,7 +96,7 @@ public class HttpServer {
     }
     port = connector.getLocalPort();
 
-    LOG.info("Service listening on port " + getPort() + ".");
+    LOG.info("Service listening on port {}.", getPort());
 
     // Set the information about the address for this server
     try {

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica-server/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/avatica-server/src/test/resources/log4j.properties b/avatica-server/src/test/resources/log4j.properties
new file mode 100644
index 0000000..834e2db
--- /dev/null
+++ b/avatica-server/src/test/resources/log4j.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Root logger is configured at INFO and is sent to A1
+log4j.rootLogger=INFO, A1
+
+# A1 goes to the console
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# Set the pattern for each log message
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p - %m%n

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica/pom.xml
----------------------------------------------------------------------
diff --git a/avatica/pom.xml b/avatica/pom.xml
index 1fd1fca..7e229ea 100644
--- a/avatica/pom.xml
+++ b/avatica/pom.xml
@@ -53,6 +53,10 @@ limitations under the License.
       <artifactId>protobuf-java</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
@@ -67,10 +71,33 @@ limitations under the License.
       <artifactId>mockito-all</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <build>
     <plugins>
+      <plugin>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>analyze</id>
+            <goals>
+              <goal>analyze-only</goal>
+            </goals>
+            <configuration>
+              <failOnWarning>true</failOnWarning>
+              <!-- ignore "unused but declared" warnings -->
+              <ignoredUnusedDeclaredDependencies>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-log4j12</ignoredUnusedDeclaredDependency>
+              </ignoredUnusedDeclaredDependencies>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
       <!-- Parent module has the same plugin and does the work of
            generating -sources.jar for each project. But without the
            plugin declared here, IDEs don't know the sources are

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
index 707a163..752e18d 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/Driver.java
@@ -24,6 +24,9 @@ import org.apache.calcite.avatica.DriverVersion;
 import org.apache.calcite.avatica.Meta;
 import org.apache.calcite.avatica.UnregisteredDriver;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.sql.Connection;
@@ -38,6 +41,7 @@ import java.util.Properties;
  * Avatica Remote JDBC driver.
  */
 public class Driver extends UnregisteredDriver {
+  private static final Logger LOG = LoggerFactory.getLogger(Driver.class);
   public static final String CONNECT_STRING_PREFIX = "jdbc:avatica:remote:";
 
   static {
@@ -99,6 +103,7 @@ public class Driver extends UnregisteredDriver {
       final AvaticaHttpClient httpClient = getHttpClient(connection, config);
       final Serialization serializationType = getSerialization(config);
 
+      LOG.debug("Instantiating {} service", serializationType);
       switch (serializationType) {
       case JSON:
         service = new RemoteService(httpClient);

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index fdcaafe..64c4e3a 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -140,6 +140,15 @@ limitations under the License.
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
       <groupId>sqlline</groupId>
       <artifactId>sqlline</artifactId>
       <scope>test</scope>
@@ -243,6 +252,8 @@ limitations under the License.
                 <ignoredUnusedDeclaredDependency>net.hydromatic:scott-data-hsqldb</ignoredUnusedDeclaredDependency>
                 <ignoredUnusedDeclaredDependency>net.hydromatic:foodmart-data-hsqldb</ignoredUnusedDeclaredDependency>
                 <ignoredUnusedDeclaredDependency>org.postgresql:postgresql</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-api</ignoredUnusedDeclaredDependency>
+                <ignoredUnusedDeclaredDependency>org.slf4j:slf4j-log4j12</ignoredUnusedDeclaredDependency>
               </ignoredUnusedDeclaredDependencies>
               <ignoredUsedUndeclaredDependencies>
                 <ignoredUsedUndeclaredDependency>org.eclipse.jetty:jetty-server</ignoredUsedUndeclaredDependency>

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/codegen/templates/Parser.jj
----------------------------------------------------------------------
diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj
index f41814a..ce4920b 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -98,6 +98,8 @@ import org.apache.calcite.util.trace.CalciteTrace;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
+import org.slf4j.Logger;
+
 import java.io.Reader;
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -105,8 +107,6 @@ import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collections;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.calcite.util.Static.RESOURCE;
 
@@ -228,8 +228,7 @@ PARSER_END(${parser.class})
 JAVACODE
 void debug_message1()
 {
-    LOGGER.log(Level.INFO,  getToken( 0 ).image
-        + " , " + getToken( 1 ).image );
+    LOGGER.info("{} , {}", getToken( 0 ).image, getToken( 1 ).image );
 }
 
 JAVACODE String unquotedIdentifier() {

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
index aec578a..e29b9fc 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java
@@ -47,7 +47,7 @@ class EnumerableAggregateRule extends ConverterRule {
           agg.getGroupSets(),
           agg.getAggCallList());
     } catch (InvalidRelException e) {
-      EnumerableRules.LOGGER.fine(e.toString());
+      EnumerableRules.LOGGER.debug(e.toString());
       return null;
     }
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java
index 88655ba..375568b 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableJoinRule.java
@@ -67,7 +67,7 @@ class EnumerableJoinRule extends ConverterRule {
         return new EnumerableThetaJoin(cluster, traitSet, left, right,
             join.getCondition(), join.getVariablesSet(), join.getJoinType());
       } catch (InvalidRelException e) {
-        EnumerableRules.LOGGER.fine(e.toString());
+        EnumerableRules.LOGGER.debug(e.toString());
         return null;
       }
     }
@@ -84,7 +84,7 @@ class EnumerableJoinRule extends ConverterRule {
           join.getVariablesSet(),
           join.getJoinType());
     } catch (InvalidRelException e) {
-      EnumerableRules.LOGGER.fine(e.toString());
+      EnumerableRules.LOGGER.debug(e.toString());
       return null;
     }
     if (!info.isEqui()) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
index 9dd0ce1..222111c 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java
@@ -102,7 +102,7 @@ class EnumerableMergeJoinRule extends ConverterRule {
           join.getVariablesSet(),
           join.getJoinType());
     } catch (InvalidRelException e) {
-      EnumerableRules.LOGGER.fine(e.toString());
+      EnumerableRules.LOGGER.debug(e.toString());
       return null;
     }
     if (!info.isEqui()) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
index 289bc68..29ee347 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRules.java
@@ -19,7 +19,7 @@ package org.apache.calcite.adapter.enumerable;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.util.trace.CalciteTrace;
 
-import java.util.logging.Logger;
+import org.slf4j.Logger;
 
 /**
  * Rules and relational operators for the

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
index db8bc89..a1a786d 100644
--- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
+++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java
@@ -76,10 +76,11 @@ import org.apache.calcite.util.trace.CalciteTrace;
 
 import com.google.common.collect.ImmutableList;
 
+import org.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Logger;
 
 /**
  * Rules and relational operators for
@@ -164,7 +165,7 @@ public class JdbcRules {
             join.getVariablesSet(),
             join.getJoinType());
       } catch (InvalidRelException e) {
-        LOGGER.fine(e.toString());
+        LOGGER.debug(e.toString());
         return null;
       }
     }
@@ -467,7 +468,7 @@ public class JdbcRules {
             convert(agg.getInput(), out), agg.indicator, agg.getGroupSet(),
             agg.getGroupSets(), agg.getAggCallList());
       } catch (InvalidRelException e) {
-        LOGGER.fine(e.toString());
+        LOGGER.debug(e.toString());
         return null;
       }
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
index aa44c6a..249caed 100644
--- a/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
+++ b/core/src/main/java/org/apache/calcite/interpreter/Bindables.java
@@ -621,7 +621,7 @@ public class Bindables {
             convert(agg.getInput(), traitSet), agg.indicator, agg.getGroupSet(),
             agg.getGroupSets(), agg.getAggCallList());
       } catch (InvalidRelException e) {
-        RelOptPlanner.LOGGER.fine(e.toString());
+        RelOptPlanner.LOGGER.debug(e.toString());
         return null;
       }
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
index 38c0e7e..e8f7578 100644
--- a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
@@ -32,7 +32,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
 import java.util.regex.Pattern;
 
 import static org.apache.calcite.util.Static.RESOURCE;
@@ -290,19 +289,15 @@ public abstract class AbstractRelOptPlanner implements RelOptPlanner {
 
     assert ruleCall.getRule().matches(ruleCall);
     if (isRuleExcluded(ruleCall.getRule())) {
-      if (LOGGER.isLoggable(Level.FINE)) {
-        LOGGER.fine("call#" + ruleCall.id
-            + ": Rule [" + ruleCall.getRule() + "] not fired"
-            + " due to exclusion filter");
-      }
+      LOGGER.debug("call#{}: Rule [{}] not fired due to exclusion filter",
+          ruleCall.id, ruleCall.getRule());
       return;
     }
 
-    if (LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine(
-          "call#" + ruleCall.id
-          + ": Apply rule [" + ruleCall.getRule() + "] to "
-          + Arrays.toString(ruleCall.rels));
+    if (LOGGER.isDebugEnabled()) {
+      // Leave this wrapped in a conditional to prevent unnecessarily calling Arrays.toString(...)
+      LOGGER.debug("call#{}: Apply rule [{}] to {}",
+          ruleCall.id, ruleCall.getRule(), Arrays.toString(ruleCall.rels));
     }
 
     if (listener != null) {
@@ -340,11 +335,9 @@ public abstract class AbstractRelOptPlanner implements RelOptPlanner {
       RelOptRuleCall ruleCall,
       RelNode newRel,
       boolean before) {
-    if (before && LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine("call#" + ruleCall.id
-          + ": Rule " + ruleCall.getRule() + " arguments "
-          + Arrays.toString(ruleCall.rels) + " produced "
-          + newRel);
+    if (before && LOGGER.isDebugEnabled()) {
+      LOGGER.debug("call#{}: Rule {} arguments {} produced {}",
+          ruleCall.id, ruleCall.getRule(), Arrays.toString(ruleCall.rels), newRel);
     }
 
     if (listener != null) {
@@ -365,9 +358,7 @@ public abstract class AbstractRelOptPlanner implements RelOptPlanner {
    * @param rel chosen rel
    */
   protected void notifyChosen(RelNode rel) {
-    if (LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine("For final plan, using " + rel);
-    }
+    LOGGER.debug("For final plan, using {}", rel);
 
     if (listener != null) {
       RelOptListener.RelChosenEvent event =

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java
index bad9402..58f4449 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptPlanner.java
@@ -25,8 +25,9 @@ import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.CancelFlag;
 import org.apache.calcite.util.trace.CalciteTrace;
 
+import org.slf4j.Logger;
+
 import java.util.List;
-import java.util.logging.Logger;
 import java.util.regex.Pattern;
 
 /**

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java b/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java
index f8df61f..e3f78aa 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptRuleCall.java
@@ -24,10 +24,11 @@ import org.apache.calcite.util.trace.CalciteTrace;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+import org.slf4j.Logger;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Logger;
 
 /**
  * A <code>RelOptRuleCall</code> is an invocation of a {@link RelOptRule} with a

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
index fe3ab7f..60655bf 100644
--- a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
+++ b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java
@@ -36,12 +36,13 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
+import org.slf4j.LoggerFactory;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Logger;
 
 /**
  * Checks whether one condition logically implies another.
@@ -56,7 +57,7 @@ import java.util.logging.Logger;
  */
 public class RexImplicationChecker {
   private static final CalciteLogger LOGGER =
-      new CalciteLogger(Logger.getLogger(RexImplicationChecker.class.getName()));
+      new CalciteLogger(LoggerFactory.getLogger(RexImplicationChecker.class));
 
   final RexBuilder builder;
   final RexExecutorImpl executor;
@@ -89,7 +90,7 @@ public class RexImplicationChecker {
       return false;
     }
 
-    LOGGER.fine("Checking if " + first.toString() + " => " + second.toString());
+    LOGGER.debug("Checking if {} => {}", first.toString(), second.toString());
 
     RexCall firstCond = (RexCall) first;
     RexCall secondCond = (RexCall) second;
@@ -140,13 +141,13 @@ public class RexImplicationChecker {
         // If f could not imply even one conjunction in
         // secondDnfs, then final implication may be false
         if (!implyOneConjunction) {
-          LOGGER.fine(first + " doesnot imply " + second);
+          LOGGER.debug("{} doesnot imply {}", first, second);
           return false;
         }
       }
     }
 
-    LOGGER.fine(first + " implies " + second);
+    LOGGER.debug("{} implies {}", first, second);
     return true;
   }
 
@@ -160,8 +161,7 @@ public class RexImplicationChecker {
 
     // Check Support
     if (!checkSupport(firstUsageFinder, secondUsageFinder)) {
-      LOGGER.warning("Support for checking " + first
-          + " => " + second + " is not there");
+      LOGGER.warn("Support for checking {} => {} is not there", first, second);
       return false;
     }
 
@@ -220,7 +220,7 @@ public class RexImplicationChecker {
     } catch (Exception e) {
       // TODO: CheckSupport should not allow this exception to be thrown
       // Need to monitor it and handle all the cases raising them.
-      LOGGER.warning("Exception thrown while checking if => " + second + ": " + e.getMessage());
+      LOGGER.warn("Exception thrown while checking if => {}: {}", second, e.getMessage());
       return false;
     }
     return result != null

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
index ccbe2c2..560dda1 100644
--- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
@@ -76,6 +76,8 @@ import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 
+import org.slf4j.Logger;
+
 import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -83,8 +85,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 import static org.apache.calcite.rex.RexUtil.andNot;
 import static org.apache.calcite.rex.RexUtil.removeAll;
@@ -1115,12 +1115,8 @@ public class SubstitutionVisitor {
     protected MutableRel invert(List<Pair<RexNode, String>> namedProjects,
         MutableRel input,
         RexShuttle shuttle) {
-      if (LOGGER.isLoggable(Level.FINER)) {
-        LOGGER.finer("SubstitutionVisitor: invert:\n"
-            + "projects: " + namedProjects + "\n"
-            + "input: " + input + "\n"
-            + "project: " + shuttle + "\n");
-      }
+      LOGGER.trace("SubstitutionVisitor: invert:\nprojects: {}\ninput: {}\nproject: {}\n",
+          namedProjects, input, shuttle);
       final List<RexNode> exprList = new ArrayList<>();
       final RexBuilder rexBuilder = input.cluster.getRexBuilder();
       final List<RexNode> projects = Pair.left(namedProjects);
@@ -1139,12 +1135,8 @@ public class SubstitutionVisitor {
 
     protected MutableRel invert(MutableRel model, MutableRel input,
         MutableProject project) {
-      if (LOGGER.isLoggable(Level.FINER)) {
-        LOGGER.finer("SubstitutionVisitor: invert:\n"
-            + "model: " + model + "\n"
-            + "input: " + input + "\n"
-            + "project: " + project + "\n");
-      }
+      LOGGER.trace("SubstitutionVisitor: invert:\nmodel: {}\ninput: {}\nproject: {}\n",
+          model, input, project);
       final List<RexNode> exprList = new ArrayList<>();
       final RexBuilder rexBuilder = model.cluster.getRexBuilder();
       for (RelDataTypeField field : model.getRowType().getFieldList()) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java b/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java
index 2d43389..b7af92d 100644
--- a/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java
+++ b/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java
@@ -34,18 +34,19 @@ import org.apache.calcite.util.NlsString;
 import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.trace.CalciteLogger;
 
+import org.slf4j.LoggerFactory;
+
 import java.math.BigDecimal;
 import java.sql.Date;
 import java.util.Calendar;
 import java.util.List;
-import java.util.logging.Logger;
 
 /**
  * DataContext for evaluating an RexExpression
  */
 public class VisitorDataContext implements DataContext {
   private static final CalciteLogger LOGGER =
-      new CalciteLogger(Logger.getLogger(VisitorDataContext.class.getName()));
+      new CalciteLogger(LoggerFactory.getLogger(VisitorDataContext.class.getName()));
 
   private final Object[] values;
 
@@ -99,8 +100,8 @@ public class VisitorDataContext implements DataContext {
     for (Pair<RexInputRef, RexNode> elem : usageList) {
       Pair<Integer, ?> value = getValue(elem.getKey(), elem.getValue());
       if (value == null) {
-        LOGGER.warning(elem.getKey() + " is not handled for " + elem.getValue()
-            + " for checking implication");
+        LOGGER.warn("{} is not handled for {} for checking implication",
+            elem.getKey(), elem.getValue());
         return null;
       }
       int index = value.getKey();
@@ -120,7 +121,7 @@ public class VisitorDataContext implements DataContext {
       final RelDataType type = inputRef.getType();
 
       if (type.getSqlTypeName() == null) {
-        LOGGER.warning(inputRef.toString() + " returned null SqlTypeName");
+        LOGGER.warn("{} returned null SqlTypeName", inputRef.toString());
         return null;
       }
 
@@ -175,8 +176,8 @@ public class VisitorDataContext implements DataContext {
         }
       default:
         //TODO: Support few more supported cases
-        LOGGER.warning(type.getSqlTypeName() + " for value of class " + value.getClass()
-            + " is being handled in default way");
+        LOGGER.warn("{} for value of class {} is being handled in default way",
+            type.getSqlTypeName(), value.getClass());
         if (value instanceof NlsString) {
           return Pair.of(index, ((NlsString) value).getValue());
         } else {

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
index 5569431..e029872 100644
--- a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
@@ -58,7 +58,6 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
 
 /**
  * HepPlanner is a heuristic implementation of the {@link RelOptPlanner}
@@ -222,17 +221,13 @@ public class HepPlanner extends AbstractRelOptPlanner {
 
   void executeInstruction(
       HepInstruction.MatchLimit instruction) {
-    if (LOGGER.isLoggable(Level.FINEST)) {
-      LOGGER.finest("Setting match limit to " + instruction.limit);
-    }
+    LOGGER.trace("Setting match limit to {}", instruction.limit);
     currentProgram.matchLimit = instruction.limit;
   }
 
   void executeInstruction(
       HepInstruction.MatchOrder instruction) {
-    if (LOGGER.isLoggable(Level.FINEST)) {
-      LOGGER.finest("Setting match limit to " + instruction.order);
-    }
+    LOGGER.trace("Setting match limit to {}", instruction.order);
     currentProgram.matchOrder = instruction.order;
   }
 
@@ -245,11 +240,8 @@ public class HepPlanner extends AbstractRelOptPlanner {
       assert instruction.ruleDescription != null;
       instruction.rule =
           getRuleByDescription(instruction.ruleDescription);
-      if (LOGGER.isLoggable(Level.FINEST)) {
-        LOGGER.finest("Looking up rule with description "
-            + instruction.ruleDescription
-            + ", found " + instruction.rule);
-      }
+      LOGGER.trace("Looking up rule with description {}, found {}",
+          instruction.ruleDescription, instruction.rule);
     }
     if (instruction.rule != null) {
       applyRules(
@@ -263,9 +255,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
     if (skippingGroup()) {
       return;
     }
-    if (LOGGER.isLoggable(Level.FINEST)) {
-      LOGGER.finest("Applying rule class " + instruction.ruleClass);
-    }
+    LOGGER.trace("Applying rule class {}", instruction.ruleClass);
     if (instruction.ruleSet == null) {
       instruction.ruleSet = new LinkedHashSet<>();
       for (RelOptRule rule : allRules) {
@@ -336,7 +326,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
 
   void executeInstruction(
       HepInstruction.Subprogram instruction) {
-    LOGGER.finest("Entering subprogram");
+    LOGGER.trace("Entering subprogram");
     for (;;) {
       int nTransformationsBefore = nTransformations;
       executeProgram(instruction.subprogram);
@@ -345,14 +335,14 @@ public class HepPlanner extends AbstractRelOptPlanner {
         break;
       }
     }
-    LOGGER.finest("Leaving subprogram");
+    LOGGER.trace("Leaving subprogram");
   }
 
   void executeInstruction(
       HepInstruction.BeginGroup instruction) {
     assert currentProgram.group == null;
     currentProgram.group = instruction.endGroup;
-    LOGGER.finest("Entering group");
+    LOGGER.trace("Entering group");
   }
 
   void executeInstruction(
@@ -361,7 +351,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
     currentProgram.group = null;
     instruction.collecting = false;
     applyRules(instruction.ruleSet, true);
-    LOGGER.finest("Leaving group");
+    LOGGER.trace("Leaving group");
   }
 
   private void applyRules(
@@ -373,9 +363,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
       return;
     }
 
-    if (LOGGER.isLoggable(Level.FINEST)) {
-      LOGGER.finest("Applying rule set " + rules);
-    }
+    LOGGER.trace("Applying rule set {}", rules);
 
     boolean fullRestartAfterTransformation =
         currentProgram.matchOrder != HepMatchOrder.ARBITRARY;
@@ -651,10 +639,10 @@ public class HepPlanner extends AbstractRelOptPlanner {
       final RelMetadataQuery mq = RelMetadataQuery.instance();
       for (RelNode rel : call.getResults()) {
         RelOptCost thisCost = getCost(rel, mq);
-        if (LOGGER.isLoggable(Level.FINER)) {
-          LOGGER.finer("considering " + rel
-              + " with cumulative cost=" + thisCost
-              + " and rowcount=" + mq.getRowCount(rel));
+        if (LOGGER.isTraceEnabled()) {
+          // Keep in the isTraceEnabled for the getRowCount method call
+          LOGGER.trace("considering {} with cumulative cost={} and rowcount={}",
+              rel, thisCost, mq.getRowCount(rel));
         }
         if ((bestRel == null) || thisCost.isLt(bestCost)) {
           bestRel = rel;
@@ -892,7 +880,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
     }
     nTransformationsLastGC = nTransformations;
 
-    LOGGER.finest("collecting garbage");
+    LOGGER.trace("collecting garbage");
 
     // Yer basic mark-and-sweep.
     final Set<HepRelVertex> rootSet = new HashSet<>();
@@ -942,7 +930,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
   }
 
   private void dumpGraph() {
-    if (!LOGGER.isLoggable(Level.FINER)) {
+    if (!LOGGER.isTraceEnabled()) {
       return;
     }
 
@@ -964,7 +952,7 @@ public class HepPlanner extends AbstractRelOptPlanner {
           .append('\n');
     }
     sb.append("}");
-    LOGGER.finer(sb.toString());
+    LOGGER.trace(sb.toString());
   }
 
   // implement RelOptPlanner

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java
index 35cf026..7cee6b6 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/RelSet.java
@@ -28,11 +28,12 @@ import org.apache.calcite.util.trace.CalciteTrace;
 
 import com.google.common.collect.ImmutableList;
 
+import org.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Logger;
 
 /**
  * A <code>RelSet</code> is an equivalence-set of expressions; that is, a set of
@@ -232,7 +233,7 @@ class RelSet {
     assert this != otherSet;
     assert this.equivalentSet == null;
     assert otherSet.equivalentSet == null;
-    LOGGER.finer("Merge set#" + otherSet.id + " into set#" + id);
+    LOGGER.trace("Merge set#{} into set#{}", otherSet.id, id);
     otherSet.equivalentSet = this;
 
     // remove from table

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
index b71390b..af32671 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java
@@ -37,6 +37,8 @@ import org.apache.calcite.util.trace.CalciteTrace;
 
 import com.google.common.collect.Iterables;
 
+import org.slf4j.Logger;
+
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
@@ -45,8 +47,6 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * Subset of an equivalence class where all relational expressions have the
@@ -329,16 +329,13 @@ public class RelSubset extends AbstractRelNode {
       // This subset is already in the chain being propagated to. This
       // means that the graph is cyclic, and therefore the cost of this
       // relational expression - not this subset - must be infinite.
-      LOGGER.finer("cyclic: " + this);
+      LOGGER.trace("cyclic: {}", this);
       return;
     }
     try {
       final RelOptCost cost = planner.getCost(rel, mq);
       if (cost.isLt(bestCost)) {
-        if (LOGGER.isLoggable(Level.FINER)) {
-          LOGGER.finer("Subset cost improved: subset [" + this
-              + "] cost was " + bestCost + " now " + cost);
-        }
+        LOGGER.trace("Subset cost improved: subset [{}] cost was {} now {}", this, bestCost, cost);
 
         bestCost = cost;
         best = rel;
@@ -445,7 +442,7 @@ public class RelSubset extends AbstractRelNode {
           final String dump = sw.toString();
           RuntimeException e =
               new RelOptPlanner.CannotPlanException(dump);
-          LOGGER.throwing(getClass().getName(), "visit", e);
+          LOGGER.trace("Caught exception in class={}, method=visit", getClass().getName(), e);
           throw e;
         }
         p = cheapest;

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/volcano/RuleQueue.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/RuleQueue.java b/core/src/main/java/org/apache/calcite/plan/volcano/RuleQueue.java
index 9fa5b2b..ddfe14a 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/RuleQueue.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/RuleQueue.java
@@ -29,6 +29,8 @@ import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
 
+import org.slf4j.Logger;
+
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayDeque;
@@ -45,8 +47,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * Priority queue of relexps whose rules have not been called, and rule-matches
@@ -220,9 +220,7 @@ class RuleQueue {
    *                importance by 25%)
    */
   public void boostImportance(Collection<RelSubset> subsets, double factor) {
-    if (LOGGER.isLoggable(Level.FINER)) {
-      LOGGER.finer("boostImportance(" + factor + ", " + subsets + ")");
-    }
+    LOGGER.trace("boostImportance({}, {})", factor, subsets);
     final List<RelSubset> boostRemovals = new ArrayList<>();
     final Iterator<RelSubset> iter = boostedSubsets.iterator();
     while (iter.hasNext()) {
@@ -345,11 +343,7 @@ class RuleQueue {
         }
       }
 
-      if (LOGGER.isLoggable(Level.FINEST)) {
-        LOGGER.finest(
-            matchList.phase.toString() + " Rule-match queued: "
-                + matchName);
-      }
+      LOGGER.trace("{} Rule-match queued: {}", matchList.phase.toString(), matchName);
 
       matchList.list.add(match);
 
@@ -402,19 +396,17 @@ class RuleQueue {
         importance = Math.max(importance, childImportance);
       }
     }
-    if (LOGGER.isLoggable(Level.FINEST)) {
-      LOGGER.finest("Importance of [" + subset + "] is " + importance);
-    }
+    LOGGER.trace("Importance of [{}] is {}", subset, importance);
     return importance;
   }
 
   private void dump() {
-    if (LOGGER.isLoggable(Level.FINER)) {
+    if (LOGGER.isTraceEnabled()) {
       StringWriter sw = new StringWriter();
       PrintWriter pw = new PrintWriter(sw);
       dump(pw);
       pw.flush();
-      LOGGER.finer(sw.toString());
+      LOGGER.trace(sw.toString());
     }
   }
 
@@ -461,7 +453,7 @@ class RuleQueue {
       if (matchList.isEmpty()) {
         return null;
       }
-      if (LOGGER.isLoggable(Level.FINEST)) {
+      if (LOGGER.isTraceEnabled()) {
         Collections.sort(matchList, MATCH_COMPARATOR);
         match = matchList.remove(0);
 
@@ -475,7 +467,7 @@ class RuleQueue {
           b.append(importance);
         }
 
-        LOGGER.finest(b.toString());
+        LOGGER.trace(b.toString());
       } else {
         // If we're not tracing, it's not worth the effort of sorting the
         // list to find the minimum.
@@ -494,9 +486,7 @@ class RuleQueue {
       }
 
       if (skipMatch(match)) {
-        if (LOGGER.isLoggable(Level.FINE)) {
-          LOGGER.fine("Skip match: " + match);
-        }
+        LOGGER.debug("Skip match: {}", match);
       } else {
         break;
       }
@@ -510,9 +500,7 @@ class RuleQueue {
     phaseMatchList.matchMap.remove(
         planner.getSubset(match.rels[0]), match);
 
-    if (LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine("Pop match: " + match);
-    }
+    LOGGER.debug("Pop match: {}", match);
     return match;
   }
 
@@ -595,12 +583,8 @@ class RuleQueue {
       alpha = 0.99;
     }
     final double importance = parentImportance * alpha;
-    if (LOGGER.isLoggable(Level.FINEST)) {
-      LOGGER.finest("Importance of [" + child + "] to its parent ["
-          + parent + "] is " + importance + " (parent importance="
-          + parentImportance + ", child cost=" + childCost
-          + ", parent cost=" + parentCost + ")");
-    }
+    LOGGER.trace("Importance of [{}] to its parent [{}] is {} (parent importance={}, child cost={},"
+        + " parent cost={})", child, parent, importance, parentImportance, childCost, parentCost);
     return importance;
   }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
index 74af6ce..2565ca7 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
@@ -106,7 +106,6 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Level;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -808,12 +807,8 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
           injectImportanceBoost();
         }
 
-        if (LOGGER.isLoggable(Level.FINE)) {
-          LOGGER.fine("PLANNER = " + this
-              + "; TICK = " + cumulativeTicks + "/" + tick
-              + "; PHASE = " + phase.toString()
-              + "; COST = " + root.bestCost);
-        }
+        LOGGER.debug("PLANNER = {}; TICK = {}/{}; PHASE = {}; COST = {}",
+            this, cumulativeTicks, tick, phase.toString(), root.bestCost);
 
         VolcanoRuleMatch match = ruleQueue.popMatch(phase);
         if (match == null) {
@@ -830,21 +825,19 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
 
       ruleQueue.phaseCompleted(phase);
     }
-    if (LOGGER.isLoggable(Level.FINER)) {
+    if (LOGGER.isTraceEnabled()) {
       StringWriter sw = new StringWriter();
       final PrintWriter pw = new PrintWriter(sw);
       dump(pw);
       pw.flush();
-      LOGGER.finer(sw.toString());
+      LOGGER.trace(sw.toString());
     }
     RelNode cheapest = root.buildCheapestPlan(this);
-    if (LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine(
-          "Cheapest plan:\n"
-          + RelOptUtil.toString(cheapest, SqlExplainLevel.ALL_ATTRIBUTES));
+    if (LOGGER.isDebugEnabled()) {
+      LOGGER.debug(
+          "Cheapest plan:\n{}", RelOptUtil.toString(cheapest, SqlExplainLevel.ALL_ATTRIBUTES));
 
-      LOGGER.fine("Provenance:\n"
-          + provenance(cheapest));
+      LOGGER.debug("Provenance:\n{}", provenance(cheapest));
     }
     return cheapest;
   }
@@ -1031,7 +1024,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
     }
     final RelSubset subset = registerImpl(rel, set);
 
-    if (LOGGER.isLoggable(Level.FINE)) {
+    if (LOGGER.isDebugEnabled()) {
       validate();
     }
 
@@ -1424,9 +1417,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
       final RelNode removed = mapDigestToRel.remove(oldKey);
       assert removed == rel;
       final String newDigest = rel.recomputeDigest();
-      LOGGER.finer(
-          "Rename #" + rel.getId() + " from '" + oldDigest
-          + "' to '" + newDigest + "'");
+      LOGGER.trace("Rename #{} from '{}' to '{}'", rel.getId(), oldDigest, newDigest);
       final Pair<String, RelDataType> key = key(rel);
       final RelNode equivRel = mapDigestToRel.put(key, rel);
       if (equivRel != null) {
@@ -1434,9 +1425,8 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
 
         // There's already an equivalent with the same name, and we
         // just knocked it out. Put it back, and forget about 'rel'.
-        LOGGER.finer(
-            "After renaming rel#" + rel.getId()
-            + ", it is now equivalent to rel#" + equivRel.getId());
+        LOGGER.trace("After renaming rel#{} it is now equivalent to rel#{}",
+            rel.getId(), equivRel.getId());
         mapDigestToRel.put(key, equivRel);
 
         RelSubset equivRelSubset = getSubset(equivRel);
@@ -1703,11 +1693,8 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
           Litmus.THROW);
       RelSet equivSet = getSet(equivExp);
       if (equivSet != null) {
-        if (LOGGER.isLoggable(Level.FINER)) {
-          LOGGER.finer(
-              "Register: rel#" + rel.getId()
-              + " is equivalent to " + equivExp.getDescription());
-        }
+        LOGGER.trace(
+            "Register: rel#{} is equivalent to {}", rel.getId(), equivExp.getDescription());
         return registerSubset(set, getSubset(equivExp));
       }
     }
@@ -1719,11 +1706,9 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
       if ((set != null)
           && (set != childSet)
           && (set.equivalentSet == null)) {
-        if (LOGGER.isLoggable(Level.FINER)) {
-          LOGGER.finer(
-              "Register #" + rel.getId() + " " + rel.getDigest()
-              + " (and merge sets, because it is a conversion)");
-        }
+        LOGGER.trace(
+            "Register #{} {} (and merge sets, because it is a conversion)",
+            rel.getId(), rel.getDigest());
         merge(set, childSet);
         registerCount++;
 
@@ -1778,11 +1763,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
     final RelNode xx = mapDigestToRel.put(key, rel);
     assert xx == null || xx == rel : rel.getDigest();
 
-    if (LOGGER.isLoggable(Level.FINER)) {
-      LOGGER.finer(
-          "Register " + rel.getDescription()
-          + " in " + subset.getDescription());
-    }
+    LOGGER.trace("Register {} in {}", rel.getDescription(), subset.getDescription());
 
     // This relational expression may have been registered while we
     // recursively registered its children. If this is the case, we're done.
@@ -1852,8 +1833,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
     if ((set != subset.set)
         && (set != null)
         && (set.equivalentSet == null)) {
-      LOGGER.finer("Register #" + subset.getId() + " " + subset
-          + ", and merge sets");
+      LOGGER.trace("Register #{} {}, and merge sets", subset.getId(), subset);
       merge(set, subset.set);
       registerCount++;
     }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java
index aa4e8ae..4fde111 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoRuleCall.java
@@ -33,7 +33,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Level;
 
 /**
  * <code>VolcanoRuleCall</code> implements the {@link RelOptRuleCall} interface
@@ -89,10 +88,10 @@ public class VolcanoRuleCall extends RelOptRuleCall {
 
   // implement RelOptRuleCall
   public void transformTo(RelNode rel, Map<RelNode, RelNode> equiv) {
-    if (LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine(
-          "Transform to: rel#" + rel.getId() + " via " + getRule()
-          + (equiv.isEmpty() ? "" : " with equivalences " + equiv));
+    if (LOGGER.isDebugEnabled()) {
+      LOGGER.debug(
+          "Transform to: rel#{}" + rel.getId() + " via {}{}", rel.getId(), getRule(),
+          equiv.isEmpty() ? "" : " with equivalences " + equiv);
       if (generatedRelList != null) {
         generatedRelList.add(rel);
       }
@@ -109,14 +108,13 @@ public class VolcanoRuleCall extends RelOptRuleCall {
           getPlanner(),
           rels0Traits).go(rel);
 
-      if (LOGGER.isLoggable(Level.FINEST)) {
+      if (LOGGER.isTraceEnabled()) {
         // Cannot call RelNode.toString() yet, because rel has not
         // been registered. For now, let's make up something similar.
         String relDesc =
             "rel#" + rel.getId() + ":" + rel.getRelTypeName();
-        LOGGER.finest("call#" + id
-            + ": Rule " + getRule() + " arguments "
-            + Arrays.toString(rels) + " created " + relDesc);
+        LOGGER.trace("call#{}: Rule {} arguments {} created {}",
+            id, getRule(), Arrays.toString(rels), relDesc);
       }
 
       if (volcanoPlanner.listener != null) {
@@ -162,10 +160,7 @@ public class VolcanoRuleCall extends RelOptRuleCall {
     volcanoPlanner.checkCancel();
     try {
       if (volcanoPlanner.isRuleExcluded(getRule())) {
-        if (LOGGER.isLoggable(Level.FINE)) {
-          LOGGER.fine("Rule [" + getRule() + "] not fired"
-              + " due to exclusion filter");
-        }
+        LOGGER.debug("Rule [{}] not fired due to exclusion filter", getRule());
         return;
       }
 
@@ -174,42 +169,32 @@ public class VolcanoRuleCall extends RelOptRuleCall {
         RelSubset subset = volcanoPlanner.getSubset(rel);
 
         if (subset == null) {
-          if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine(
-                "Rule [" + getRule() + "] not fired because"
-                + " operand #" + i + " (" + rel
-                + ") has no subset");
-          }
+          LOGGER.debug(
+              "Rule [{}] not fired because operand #{} ({}) has no subset",
+              getRule(), i, rel);
           return;
         }
 
         if (subset.set.equivalentSet != null) {
-          if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine(
-                "Rule [" + getRule() + "] not fired because"
-                + " operand #" + i + " (" + rel
-                + ") belongs to obsolete set");
-          }
+          LOGGER.debug(
+              "Rule [{}] not fired because operand #{} ({}) belongs to obsolete set",
+              getRule(), i, rel);
           return;
         }
 
         final Double importance =
             volcanoPlanner.relImportances.get(rel);
         if ((importance != null) && (importance == 0d)) {
-          if (LOGGER.isLoggable(Level.FINE)) {
-            LOGGER.fine("Rule [" + getRule() + "] not fired because"
-                + " operand #" + i + " (" + rel
-                + ") has importance=0");
-          }
+          LOGGER.debug("Rule [{}] not fired because operand #{} ({}) has importance=0",
+              getRule(), i, rel);
           return;
         }
       }
 
-      if (LOGGER.isLoggable(Level.FINE)) {
-        LOGGER.fine(
-            "call#" + id
-            + ": Apply rule [" + getRule() + "] to "
-            + Arrays.toString(rels));
+      if (LOGGER.isDebugEnabled()) {
+        LOGGER.debug(
+            "call#{}: Apply rule [{}] to {}",
+            id, getRule(), Arrays.toString(rels));
       }
 
       if (volcanoPlanner.listener != null) {
@@ -222,19 +207,19 @@ public class VolcanoRuleCall extends RelOptRuleCall {
         volcanoPlanner.listener.ruleAttempted(event);
       }
 
-      if (LOGGER.isLoggable(Level.FINE)) {
+      if (LOGGER.isDebugEnabled()) {
         this.generatedRelList = new ArrayList<>();
       }
 
       getRule().onMatch(this);
 
-      if (LOGGER.isLoggable(Level.FINE)) {
+      if (LOGGER.isDebugEnabled()) {
         if (generatedRelList.isEmpty()) {
-          LOGGER.fine("call#" + id + " generated 0 successors.");
+          LOGGER.debug("call#{} generated 0 successors.", id);
         } else {
-          LOGGER.fine(
-              "call#" + id + " generated " + generatedRelList.size()
-              + " successors: " + generatedRelList);
+          LOGGER.debug(
+              "call#{} generated {} successors: {}",
+              id, generatedRelList.size(), generatedRelList);
         }
         this.generatedRelList = null;
       }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/prepare/Prepare.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/prepare/Prepare.java b/core/src/main/java/org/apache/calcite/prepare/Prepare.java
index e624d1d..e95495d 100644
--- a/core/src/main/java/org/apache/calcite/prepare/Prepare.java
+++ b/core/src/main/java/org/apache/calcite/prepare/Prepare.java
@@ -59,11 +59,11 @@ import org.apache.calcite.util.trace.CalciteTrace;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
+import org.slf4j.Logger;
+
 import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * Abstract base for classes that implement
@@ -151,11 +151,8 @@ public abstract class Prepare {
     }
 
     final RelNode rootRel4 = program.run(planner, root.rel, desiredTraits);
-    if (LOGGER.isLoggable(Level.FINE)) {
-      LOGGER.fine(
-          "Plan after physical tweaks: "
-          + RelOptUtil.toString(rootRel4, SqlExplainLevel.ALL_ATTRIBUTES));
-    }
+    LOGGER.debug("Plan after physical tweaks: {}",
+        RelOptUtil.toString(rootRel4, SqlExplainLevel.ALL_ATTRIBUTES));
 
     return root.withRel(rootRel4);
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
index 164d34e..706cd82 100644
--- a/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
+++ b/core/src/main/java/org/apache/calcite/rel/AbstractRelNode.java
@@ -44,14 +44,14 @@ import org.apache.calcite.util.trace.CalciteTrace;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
+import org.slf4j.Logger;
+
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * Base class for every relational expression ({@link RelNode}).
@@ -115,9 +115,7 @@ public abstract class AbstractRelNode implements RelNode {
     this.id = nextId++;
     this.digest = getRelTypeName() + "#" + id;
     this.desc = digest;
-    if (LOGGER.isLoggable(Level.FINEST)) {
-      LOGGER.finest("new " + digest);
-    }
+    LOGGER.trace("new {}", digest);
   }
 
   //~ Methods ----------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/rel/InvalidRelException.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/InvalidRelException.java b/core/src/main/java/org/apache/calcite/rel/InvalidRelException.java
index 0852967..f929dbb 100644
--- a/core/src/main/java/org/apache/calcite/rel/InvalidRelException.java
+++ b/core/src/main/java/org/apache/calcite/rel/InvalidRelException.java
@@ -36,7 +36,7 @@ package org.apache.calcite.rel;
  *
  * <p>The caller that receives an {@code InvalidRelException} (typically a rule
  * attempting to create a relational expression) should log it at
- * {@link java.util.logging.Level#FINE} level.</p>
+ * the DEBUG level.</p>
  */
 public class InvalidRelException extends Exception {
   /**

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
index a4a0481..03cc708 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
@@ -66,6 +66,9 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -76,14 +79,13 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.logging.Logger;
 
 /**
  * State for generating a SQL statement.
  */
 public abstract class SqlImplementor {
   private static final Logger LOGGER =
-      Logger.getLogger(SqlImplementor.class.getName());
+      LoggerFactory.getLogger(SqlImplementor.class);
 
   public static final SqlParserPos POS = SqlParserPos.ZERO;
 
@@ -168,8 +170,8 @@ public abstract class SqlImplementor {
       break;
 
     default:
-      LOGGER.fine("SINGLE_VALUE rewrite not supported for "
-          + sqlDialect.getDatabaseProduct());
+      LOGGER.debug("SINGLE_VALUE rewrite not supported for {}",
+          sqlDialect.getDatabaseProduct());
       return aggCall;
     }
 
@@ -184,7 +186,7 @@ public abstract class SqlImplementor {
     SqlNode caseExpr =
         new SqlCase(POS, caseOperand, whenList, thenList, elseExpr);
 
-    LOGGER.fine("SINGLE_VALUE rewritten into [" + caseExpr + "]");
+    LOGGER.debug("SINGLE_VALUE rewritten into [{}]", caseExpr);
 
     return caseExpr;
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java b/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java
index 2e4e9e0..d4f42f0 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/CalcRelSplitter.java
@@ -44,6 +44,8 @@ import org.apache.calcite.util.graph.DefaultEdge;
 import org.apache.calcite.util.graph.DirectedGraph;
 import org.apache.calcite.util.graph.TopologicalOrderIterator;
 
+import org.slf4j.Logger;
+
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
@@ -51,8 +53,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 
 /**
  * CalcRelSplitter operates on a
@@ -153,7 +153,7 @@ public abstract class CalcRelSplitter {
     }
 
     // Print out what we've got.
-    if (RULE_LOGGER.isLoggable(Level.FINER)) {
+    if (RULE_LOGGER.isTraceEnabled()) {
       traceLevelExpressions(
           exprs,
           exprLevels,
@@ -655,7 +655,7 @@ public abstract class CalcRelSplitter {
       traceWriter.println();
     }
     String msg = traceMsg.toString();
-    RULE_LOGGER.finer(msg);
+    RULE_LOGGER.trace(msg);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
index d1f205d..1f5c699 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/ValuesReduceRule.java
@@ -36,9 +36,10 @@ import org.apache.calcite.util.trace.CalciteTrace;
 
 import com.google.common.collect.ImmutableList;
 
+import org.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Logger;
 
 /**
  * Planner rule that folds projections and filters into an underlying

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/runtime/CalciteException.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/runtime/CalciteException.java b/core/src/main/java/org/apache/calcite/runtime/CalciteException.java
index 387e8da..402fa90 100644
--- a/core/src/main/java/org/apache/calcite/runtime/CalciteException.java
+++ b/core/src/main/java/org/apache/calcite/runtime/CalciteException.java
@@ -16,7 +16,8 @@
  */
 package org.apache.calcite.runtime;
 
-import java.util.logging.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 // NOTE:  This class gets compiled independently of everything else so that
 // resource generation can use reflection.  That means it must have no
@@ -39,7 +40,7 @@ public class CalciteException extends RuntimeException {
   private static final long serialVersionUID = -1314522633397794178L;
 
   private static final Logger LOGGER =
-      Logger.getLogger(CalciteException.class.getName());
+      LoggerFactory.getLogger(CalciteException.class);
 
   //~ Constructors -----------------------------------------------------------
 
@@ -56,8 +57,8 @@ public class CalciteException extends RuntimeException {
 
     // TODO: Force the caller to pass in a Logger as a trace argument for
     // better context.  Need to extend ResGen for this.
-    LOGGER.throwing("CalciteException", "constructor", this);
-    LOGGER.severe(toString());
+    LOGGER.trace("CalciteException", this);
+    LOGGER.error(toString());
   }
 }
 

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java
index b805a1c..e7cdf4e 100644
--- a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java
+++ b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java
@@ -23,6 +23,9 @@ import org.apache.calcite.linq4j.function.Function0;
 import org.apache.calcite.linq4j.function.Function1;
 import org.apache.calcite.linq4j.tree.Primitive;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
@@ -32,8 +35,6 @@ import java.sql.Statement;
 import java.sql.Types;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import javax.sql.DataSource;
 
 /**
@@ -45,8 +46,8 @@ public class ResultSetEnumerable<T> extends AbstractEnumerable<T> {
   private final DataSource dataSource;
   private final String sql;
   private final Function1<ResultSet, Function0<T>> rowBuilderFactory;
-  private static final Logger LOGGER = Logger.getLogger(
-      ResultSetEnumerable.class.getName());
+  private static final Logger LOGGER = LoggerFactory.getLogger(
+      ResultSetEnumerable.class);
 
   private static final Function1<ResultSet, Function0<Object>>
   AUTO_ROW_BUILDER_FACTORY =
@@ -137,9 +138,7 @@ public class ResultSetEnumerable<T> extends AbstractEnumerable<T> {
       try {
         statement.setQueryTimeout(10);
       } catch (SQLFeatureNotSupportedException e) {
-        if (LOGGER.isLoggable(Level.FINE)) {
-          LOGGER.fine("Failed to set query timeout.");
-        }
+        LOGGER.debug("Failed to set query timeout.");
       }
       final ResultSet resultSet = statement.executeQuery(sql);
       statement = null;

http://git-wip-us.apache.org/repos/asf/calcite/blob/05a57992/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
index e6690a5..73a3401 100644
--- a/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
+++ b/core/src/main/java/org/apache/calcite/sql/advise/SqlAdvisor.java
@@ -37,12 +37,13 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
+import org.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.logging.Logger;
 
 /**
  * An assistant which offers hints and corrections to a partially-formed SQL