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. -->

Reply via email to