You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by wf...@apache.org on 2016/01/12 06:04:07 UTC

aurora git commit: Replace scheduler log scaffolding with logback.

Repository: aurora
Updated Branches:
  refs/heads/master 6a5309ae3 -> d542bd1d5


Replace scheduler log scaffolding with logback.

Reviewed at https://reviews.apache.org/r/41785/


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

Branch: refs/heads/master
Commit: d542bd1d58bc5dcf6ead95d902c0a8cecbbffe9e
Parents: 6a5309a
Author: Bill Farner <wf...@apache.org>
Authored: Mon Jan 11 23:57:49 2016 -0500
Committer: Bill Farner <wf...@apache.org>
Committed: Mon Jan 11 23:57:49 2016 -0500

----------------------------------------------------------------------
 NEWS                                            |   5 +
 build.gradle                                    |  12 +-
 .../org/apache/aurora/common/logging/Glog.java  | 208 ------------
 .../aurora/common/logging/LogFormatter.java     |  80 -----
 .../aurora/common/logging/RootLogConfig.java    | 296 -----------------
 .../aurora/common/logging/log4j/GlogLayout.java |  98 ------
 .../common/net/http/handlers/LogConfig.java     | 137 --------
 .../common/net/http/handlers/logconfig.st       |  44 ---
 .../aurora/common/logging/LogFormatterTest.java |  72 ----
 .../common/logging/RootLogConfigTest.java       | 333 -------------------
 config/legacy_untested_classes.txt              |   2 +
 .../upstart/aurora-scheduler-kerberos.conf      |   6 +-
 examples/vagrant/upstart/aurora-scheduler.conf  |   9 +-
 .../aurora/scheduler/app/Log4jConfigurator.java |  68 ----
 .../aurora/scheduler/app/SchedulerMain.java     |  41 ---
 .../scheduler/http/JettyServerModule.java       |   1 -
 .../apache/aurora/scheduler/http/LogConfig.java | 126 +++++++
 src/main/resources/logback.xml                  |  33 ++
 .../apache/aurora/scheduler/http/logconfig.st   |  44 +++
 19 files changed, 222 insertions(+), 1393 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/NEWS
----------------------------------------------------------------------
diff --git a/NEWS b/NEWS
index ecb26d2..acaff9e 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,11 @@
 - Log destination is configurable for the thermos runner. See the configuration reference for details
   on how to configure destination per-process. Command line options may also be passed through the
   scheduler in order to configure the global default behavior.
+- Changed scheduler logging to use logback.
+  Operators wishing to customize logging may do so with standard logback configuration as described
+  at http://logback.qos.ch/manual/configuration.html
+  With this change, we have removed the following scheduler command line arguments as they were
+  made redundant: `logtostderr`, `alsologtostderr`, `vlog`, `vmodule`, and `use_glog_formatter`.
 
 0.11.0
 ------

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/build.gradle
----------------------------------------------------------------------
diff --git a/build.gradle b/build.gradle
index 8e7ea37..169fb25 100644
--- a/build.gradle
+++ b/build.gradle
@@ -87,7 +87,6 @@ For more details, please see https://issues.apache.org/jira/browse/AURORA-1169
   ext.jerseyRev = '1.19'
   ext.jsrRev = '3.0.1'
   ext.junitRev = '4.12'
-  ext.log4jRev = '1.2.17'
   ext.protobufRev = '2.6.1'
   ext.servletRev = '3.1.0'
   ext.slf4jRev = '1.7.12'
@@ -100,6 +99,10 @@ For more details, please see https://issues.apache.org/jira/browse/AURORA-1169
   configurations {
     compile {
       exclude module: 'junit-dep'
+      // We use logback, so we do not want to pull in log4j artifacts.
+      exclude module: 'log4j'
+      exclude module: 'slf4j-log4j12'
+
       // ResolutionStrategy needs to be set in the allprojects block otherwise dependent projects
       // will not inherit it. Note that dependencies still need to be specified in a dependencies
       // block - this only affects strategy.
@@ -112,11 +115,9 @@ For more details, please see https://issues.apache.org/jira/browse/AURORA-1169
         force "com.google.guava:guava:${guavaRev}"
         force "com.google.protobuf:protobuf-java:${protobufRev}"
         force "junit:junit:${junitRev}"
-        force "log4j:log4j:${log4jRev}"
         force "org.apache.thrift:libthrift:${thriftRev}"
         force "org.hamcrest:hamcrest-core:1.3"
         force "org.slf4j:slf4j-api:${slf4jRev}"
-        force "org.slf4j:slf4j-jdk14:${slf4jRev}"
       }
     }
   }
@@ -165,11 +166,9 @@ project(':commons') {
     compile "commons-lang:commons-lang:${commonsLangRev}"
     compile "javax.servlet:javax.servlet-api:${servletRev}"
     compile "joda-time:joda-time:2.9.1"
-    compile "log4j:log4j:${log4jRev}"
     compile "org.antlr:stringtemplate:${stringTemplateRev}"
     compile "org.apache.zookeeper:zookeeper:${zookeeperRev}"
     compile "org.easymock:easymock:3.4"
-    compile "org.slf4j:slf4j-jdk14:${slf4jRev}"
 
     // There are a few testing support libs in the src/main/java trees that use junit - currently:
     //   src/main/java/org/apache/aurora/common/zookeeper/testing
@@ -343,6 +342,7 @@ dependencies {
   compile project(':commons-args')
 
   compile 'aopalliance:aopalliance:1.0'
+  compile 'ch.qos.logback:logback-classic:1.1.3'
   compile "com.google.code.findbugs:jsr305:${jsrRev}"
   compile "com.google.inject:guice:${guiceRev}"
   compile "com.google.inject.extensions:guice-assistedinject:${guiceRev}"
@@ -357,7 +357,6 @@ dependencies {
   compile "com.sun.jersey.contribs:jersey-guice:${jerseyRev}"
   compile 'javax.inject:javax.inject:1'
   compile "javax.servlet:javax.servlet-api:${servletRev}"
-  compile "log4j:log4j:${log4jRev}"
   compile "org.antlr:stringtemplate:${stringTemplateRev}"
   compile 'org.apache.mesos:mesos:0.25.0'
   compile "org.apache.shiro:shiro-guice:${shiroRev}"
@@ -370,7 +369,6 @@ dependencies {
   compile 'org.mybatis:mybatis:3.3.0'
   compile 'org.mybatis:mybatis-guice:3.7'
   compile 'org.quartz-scheduler:quartz:2.2.2'
-  compile "org.slf4j:slf4j-jdk14:${slf4jRev}"
   compile "uno.perk:forward:1.0.0"
 
   testCompile "com.sun.jersey:jersey-client:${jerseyRev}"

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/main/java/org/apache/aurora/common/logging/Glog.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/logging/Glog.java b/commons/src/main/java/org/apache/aurora/common/logging/Glog.java
deleted file mode 100644
index 5bae399..0000000
--- a/commons/src/main/java/org/apache/aurora/common/logging/Glog.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.common.logging;
-
-import javax.annotation.Nullable;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Throwables;
-
-import org.joda.time.DateTimeZone;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-
-/**
- * A utility that can format log records to match the format generated by glog:
- * <pre>
- * I0218 17:36:47.461 (source) (message)
- * </pre>
- */
-public final class Glog {
-
-  /**
-   * Classifies the importance of a log message.
-   */
-  public enum Level {
-
-    /**
-     * Indicates the message's classification is unknown.  This most likely indicates a
-     * configuration or programming error that can be corrected by mapping the underlying log
-     * system's level appropriately.
-     */
-    UNKNOWN('U'),
-
-    /**
-     * Indicates the message is for debugging purposes only.
-     */
-    DEBUG('D'),
-
-    /**
-     * Indicates a message of general interest.
-     */
-    INFO('I'),
-
-    /**
-     * Indicates a warning message likely worth of attention.
-     */
-    WARNING('W'),
-
-    /**
-     * Indicates an unexpected error.
-     */
-    ERROR('E'),
-
-    /**
-     * Indicates a fatal exception generally paired with actions to shut down the errored process.
-     */
-    FATAL('F');
-
-    final char label;
-
-    private Level(char label) {
-      this.label = label;
-    }
-  }
-
-  /**
-   * An object that can provide details of a log record.
-   *
-   * @param <T> The type of log record the formatter handles.
-   */
-  public interface Formatter<T> {
-
-    /**
-     * Gets the message contained in the log record.
-     *
-     * @param record The record to extract a message from.
-     * @return The formatted message.
-     */
-    String getMessage(T record);
-
-    /**
-     * Gets the class name of the class that sent the log record for logging.
-     *
-     * @param record The record to extract a producing class name from.
-     * @return The producing class if known; otherwise {@code null}.
-     */
-    @Nullable
-    String getClassName(T record);
-
-    /**
-     * Gets the name of the method of within the class that sent the log record for logging.
-     *
-     * @param record The record to extract a producing method name from.
-     * @return The producing method name if known; otherwise {@code null}.
-     */
-    @Nullable
-    String getMethodName(T record);
-
-    /**
-     * Gets the level of the log record.
-     *
-     * @param record The record to extract a log level from.
-     * @return The record's log level. Can be {@code null} or {@link Level#UNKNOWN} if unknown.
-     */
-    @Nullable
-    Level getLevel(T record);
-
-    /**
-     * Gets the timestamp in milliseconds since the epoch when the log record was generated.
-     *
-     * @param record The record to extract a time stamp from.
-     * @return The log record's birth date.
-     */
-    long getTimeStamp(T record);
-
-    /**
-     * Gets the id of the thread that generated the log record.
-     *
-     * @param record The record to extract a thread id from.
-     * @return The id of the thread that generated the log record.
-     */
-    long getThreadId(T record);
-
-    /**
-     * Gets the exception associated with the log record if any.
-     *
-     * @param record The record to extract an exception from.
-     * @return The exception associated with the log record; may be {@code null}.
-     */
-    @Nullable
-    Throwable getThrowable(T record);
-  }
-
-  private static final DateTimeFormatter DATE_TIME_FORMATTER =
-      DateTimeFormat.forPattern("MMdd HH:mm:ss.SSS").withZone(DateTimeZone.UTC);
-
-  private static final int BASE_MESSAGE_LENGTH =
-      1     // Level char.
-      + 4   // Month + day
-      + 1   // space
-      + 12  // Timestamp
-      + 1   // space
-      + 6   // THREAD
-      + 4   // Room for thread ID.
-      + 1;  // space
-
-  /**
-   * Converts the given log record into a glog format log line using the given formatter.
-   *
-   * @param formatter A formatter that understands how to unpack the given log record.
-   * @param record A structure containing log data.
-   * @param <T> The type of log record.
-   * @return A glog formatted log line.
-   */
-  public static <T> String formatRecord(Formatter<T> formatter, T record) {
-    String message = formatter.getMessage(record);
-    int messageLength = BASE_MESSAGE_LENGTH
-        + 2  // Colon and space
-        + message.length();
-
-    String className = formatter.getClassName(record);
-    String methodName = null;
-    if (className != null) {
-      messageLength += className.length();
-      methodName = formatter.getMethodName(record);
-      if (methodName != null) {
-        messageLength += 1;  // Period between class and method.
-        messageLength += methodName.length();
-      }
-    }
-
-    StringBuilder sb = new StringBuilder(messageLength)
-        .append(Objects.firstNonNull(formatter.getLevel(record), Level.UNKNOWN).label)
-        .append(DATE_TIME_FORMATTER.print(formatter.getTimeStamp(record)))
-        .append(" THREAD")
-        .append(formatter.getThreadId(record));
-
-    if (className != null) {
-      sb.append(' ').append(className);
-      if (methodName != null) {
-        sb.append('.').append(methodName);
-      }
-    }
-
-    sb.append(": ").append(message);
-    Throwable throwable = formatter.getThrowable(record);
-    if (throwable != null) {
-      sb.append('\n').append(Throwables.getStackTraceAsString(throwable));
-    }
-
-    return sb.append('\n').toString();
-  }
-
-  private Glog() {
-    // utility
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/main/java/org/apache/aurora/common/logging/LogFormatter.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/logging/LogFormatter.java b/commons/src/main/java/org/apache/aurora/common/logging/LogFormatter.java
deleted file mode 100644
index 0cb621d..0000000
--- a/commons/src/main/java/org/apache/aurora/common/logging/LogFormatter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.common.logging;
-
-import java.util.logging.Formatter;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-
-import com.google.common.collect.ImmutableMap;
-
-/**
- * Log formatter to match the format generated by glog.
- *
- * @see Glog
- */
-public class LogFormatter extends Formatter implements Glog.Formatter<LogRecord> {
-
-  private static final ImmutableMap<Level, Glog.Level> LEVEL_LABELS =
-      ImmutableMap.<Level, Glog.Level>builder()
-          .put(Level.FINEST, Glog.Level.DEBUG)
-          .put(Level.FINER, Glog.Level.DEBUG)
-          .put(Level.FINE, Glog.Level.DEBUG)
-          .put(Level.CONFIG, Glog.Level.INFO)
-          .put(Level.INFO, Glog.Level.INFO)
-          .put(Level.WARNING, Glog.Level.WARNING)
-          .put(Level.SEVERE, Glog.Level.ERROR)
-          .build();
-
-
-  @Override
-  public String format(final LogRecord record) {
-    return Glog.formatRecord(this, record);
-  }
-
-  @Override
-  public String getMessage(LogRecord record) {
-    return formatMessage(record);
-  }
-
-  @Override
-  public String getClassName(LogRecord record) {
-    return record.getSourceClassName();
-  }
-
-  @Override
-  public String getMethodName(LogRecord record) {
-    return record.getSourceMethodName();
-  }
-
-  @Override
-  public Glog.Level getLevel(LogRecord record) {
-    return LEVEL_LABELS.get(record.getLevel());
-  }
-
-  @Override
-  public long getTimeStamp(LogRecord record) {
-    return record.getMillis();
-  }
-
-  @Override
-  public long getThreadId(LogRecord record) {
-    return record.getThreadID();
-  }
-
-  @Override
-  public Throwable getThrowable(LogRecord record) {
-    return record.getThrown();
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/main/java/org/apache/aurora/common/logging/RootLogConfig.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/logging/RootLogConfig.java b/commons/src/main/java/org/apache/aurora/common/logging/RootLogConfig.java
deleted file mode 100644
index 26dd0aa..0000000
--- a/commons/src/main/java/org/apache/aurora/common/logging/RootLogConfig.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.common.logging;
-
-import java.util.Map;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogManager;
-import java.util.logging.Logger;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-
-/**
- * A configuration class for the root java.util.logging Logger.
- *
- * Defines flags to control the behavior behavior of the root logger similarly to Google's glog
- * library (see http://code.google.com/p/google-glog ).
- */
-public class RootLogConfig {
-  /**
-   * An enum reflecting log {@link Level} constants.
-   */
-  public enum LogLevel {
-    FINEST(Level.FINEST),
-    FINER(Level.FINER),
-    FINE(Level.FINE),
-    CONFIG(Level.CONFIG),
-    INFO(Level.INFO),
-    WARNING(Level.WARNING),
-    SEVERE(Level.SEVERE);
-
-    private final Level level;
-
-    private LogLevel(Level level) {
-      this.level = level;
-    }
-
-    private Level getLevel() {
-      return level;
-    }
-  }
-
-  /**
-   * Represents a logging configuration for java.util.logging.
-   */
-  public static final class Configuration {
-    boolean logToStderr = false;
-    boolean alsoLogToStderr = false;
-    boolean useGLogFormatter = true;
-    LogLevel vlog = LogLevel.INFO;
-    ImmutableMap<Class<?>, LogLevel> vmodule = ImmutableMap.of();
-    String rootLoggerName = "";
-
-    Configuration() {
-      // Guard for internal use only.
-    }
-
-    /**
-     * Returns {@code true} if configured to log just to stderr.
-     */
-    public boolean isLogToStderr() {
-      return logToStderr;
-    }
-
-    /**
-     * Returns {@code true} if configured to log to stderr in addition to log files..
-     */
-    public boolean isAlsoLogToStderr() {
-      return alsoLogToStderr;
-    }
-
-    /**
-     * Returns {@code true} if configured to log in google-glog format.
-     */
-    public boolean isUseGLogFormatter() {
-      return useGLogFormatter;
-    }
-
-    /**
-     * Returns the default global log level.
-     */
-    public LogLevel getVlog() {
-      return vlog;
-    }
-
-    /**
-     * Returns the custom log levels configured for individual classes.
-     */
-    public ImmutableMap<Class<?>, LogLevel> getVmodule() {
-      return vmodule;
-    }
-
-    /**
-     * Applies this configuration to the root log.
-     */
-    public void apply() {
-      RootLogConfig.configure(this);
-    }
-  }
-
-  /**
-   * A builder-pattern class used to perform the configuration programmatically
-   * (i.e. not through flags).
-   * Example:
-   * <code>
-   *    RootLogConfig.builder().logToStderr(true).build().apply();
-   * </code>
-   */
-  public static final class Builder {
-    private final Configuration configuration;
-
-    private Builder() {
-      this.configuration = new Configuration();
-    }
-
-    /**
-     * Only log messages to stderr, instead of log files. Overrides alsologtostderr.
-     * Default: false.
-     *
-     * @param flag True to enable, false to disable.
-     * @return this Configuration object.
-     */
-    public Builder logToStderr(boolean flag) {
-      configuration.logToStderr = flag;
-      return this;
-    }
-
-    /**
-     * Also log messages to stderr, in addition to log files.
-     * Overridden by logtostderr.
-     * Default: false.
-     *
-     * @param flag True to enable, false to disable.
-     * @return this Configuration object.
-     */
-    public Builder alsoLogToStderr(boolean flag) {
-      configuration.alsoLogToStderr = flag;
-      return this;
-    }
-
-    /**
-     * Format log messages in one-line with a header, similar to google-glog.
-     * Default: false.
-     *
-     * @param flag True to enable, false to disable.
-     * @return this Configuration object.
-     */
-    public Builder useGLogFormatter(boolean flag) {
-      configuration.useGLogFormatter = flag;
-      return this;
-    }
-
-    /**
-     * Output log messages at least at the given verbosity level.
-     * Overridden by vmodule.
-     * Default: INFO
-     *
-     * @param level LogLevel enumerator for the minimum log message verbosity level that is output.
-     * @return this Configuration object.
-     */
-    public Builder vlog(LogLevel level) {
-      Preconditions.checkNotNull(level);
-      configuration.vlog = level;
-      return this;
-    }
-
-    /**
-     * Output log messages for a given set of classes at the associated verbosity levels.
-     * Overrides vlog.
-     * Default: no classes are treated specially.
-     *
-     * @param pairs Map of classes and correspoding log levels.
-     * @return this Configuration object.
-     */
-    public Builder vmodule(Map<Class<?>, LogLevel> pairs) {
-      Preconditions.checkNotNull(pairs);
-      configuration.vmodule = ImmutableMap.copyOf(pairs);
-      return this;
-    }
-
-    /**
-     * Returns the built up configuration.
-     */
-    public Configuration build() {
-      return configuration;
-    }
-
-    // Intercepts the root logger, for testing purposes only.
-    @VisibleForTesting
-    Builder rootLoggerName(String name) {
-      Preconditions.checkNotNull(name);
-      Preconditions.checkArgument(!name.isEmpty());
-      configuration.rootLoggerName = name;
-      return this;
-    }
-  }
-
-  /**
-   * Creates a new Configuration builder object.
-   *
-   * @return The builder.
-   */
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  private static void configure(Configuration configuration) {
-    // Edit the properties of the root logger.
-    Logger rootLogger = Logger.getLogger(configuration.rootLoggerName);
-    if (configuration.logToStderr) {
-      setLoggerToStderr(rootLogger);
-    } else if (configuration.alsoLogToStderr) {
-      setLoggerToAlsoStderr(rootLogger);
-    }
-    if (configuration.useGLogFormatter) {
-      setGLogFormatter(rootLogger);
-    }
-    if (configuration.vlog != null) {
-      setVlog(rootLogger, configuration.vlog);
-    }
-    if (configuration.vmodule != null) {
-      setVmodules(configuration.vmodule);
-    }
-  }
-
-  private static void setLoggerToStderr(Logger logger) {
-    LogManager.getLogManager().reset();
-    setConsoleHandler(logger, true);
-  }
-
-  private static void setLoggerToAlsoStderr(Logger logger) {
-    setConsoleHandler(logger, false);
-  }
-
-  private static void setConsoleHandler(Logger logger, boolean removeOtherHandlers) {
-    Handler consoleHandler = null;
-    for (Handler h : logger.getHandlers()) {
-      if (h instanceof ConsoleHandler) {
-        consoleHandler = h;
-      } else if (removeOtherHandlers) {
-        logger.removeHandler(h);
-      }
-    }
-    if (consoleHandler == null) {
-      consoleHandler = new ConsoleHandler();
-      logger.addHandler(new ConsoleHandler());
-    }
-    consoleHandler.setLevel(Level.ALL);
-    consoleHandler.setFilter(null);
-  }
-
-  private static void setGLogFormatter(Logger logger) {
-    for (Handler h : logger.getHandlers()) {
-      h.setFormatter(new LogFormatter());
-    }
-  }
-
-  private static void setVmodules(Map<Class<?>, LogLevel> vmodules) {
-    for (Map.Entry<Class<?>, LogLevel> entry : vmodules.entrySet()) {
-      String className = entry.getKey().getName();
-      Logger logger = Logger.getLogger(className);
-      setVlog(logger, entry.getValue());
-    }
-  }
-
-  private static void setVlog(Logger logger, LogLevel logLevel) {
-    final Level newLevel = logLevel.getLevel();
-    logger.setLevel(newLevel);
-    do {
-      for (Handler handler : logger.getHandlers()) {
-        Level handlerLevel = handler.getLevel();
-        if (newLevel.intValue() < handlerLevel.intValue()) {
-          handler.setLevel(newLevel);
-        }
-      }
-    } while (logger.getUseParentHandlers() && (logger = logger.getParent()) != null);
-  }
-
-  // Utility class.
-  private RootLogConfig() {
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/main/java/org/apache/aurora/common/logging/log4j/GlogLayout.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/logging/log4j/GlogLayout.java b/commons/src/main/java/org/apache/aurora/common/logging/log4j/GlogLayout.java
deleted file mode 100644
index 1a90ded..0000000
--- a/commons/src/main/java/org/apache/aurora/common/logging/log4j/GlogLayout.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.common.logging.log4j;
-
-import com.google.common.collect.ImmutableMap;
-
-import org.apache.aurora.common.logging.Glog;
-import org.apache.log4j.Layout;
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.log4j.spi.ThrowableInformation;
-
-/**
- * Log4j Layout to match the format generated by glog.
- *
- * @see Glog
- */
-public class GlogLayout extends Layout implements Glog.Formatter<LoggingEvent> {
-
-  private static final ImmutableMap<Level, Glog.Level> LEVEL_LABELS =
-      ImmutableMap.<Level, Glog.Level>builder()
-          .put(Level.TRACE, Glog.Level.DEBUG)
-          .put(Level.DEBUG, Glog.Level.DEBUG)
-          .put(Level.INFO, Glog.Level.INFO)
-          .put(Level.WARN, Glog.Level.WARNING)
-          .put(Level.ERROR, Glog.Level.ERROR)
-          .put(Level.FATAL, Glog.Level.FATAL)
-          .build();
-
-  @Override
-  public String format(LoggingEvent record) {
-    return Glog.formatRecord(this, record);
-  }
-
-  @Override
-  public boolean ignoresThrowable() {
-    return false; // We handle stack trace formatting.
-  }
-
-  @Override
-  public void activateOptions() {
-    // We use no options
-  }
-
-  @Override
-  public String getMessage(LoggingEvent record) {
-    return record.getRenderedMessage();
-  }
-
-  @Override
-  public String getClassName(LoggingEvent record) {
-    LocationInfo locationInformation = record.getLocationInformation();
-    return (locationInformation != null)
-        ? locationInformation.getClassName()
-        : null;
-  }
-
-  @Override
-  public String getMethodName(LoggingEvent record) {
-    LocationInfo locationInformation = record.getLocationInformation();
-    return (locationInformation != null)
-        ? record.getLocationInformation().getMethodName()
-        : null;
-  }
-
-  @Override
-  public Glog.Level getLevel(LoggingEvent record) {
-    return LEVEL_LABELS.get(record.getLevel());
-  }
-
-  @Override
-  public long getTimeStamp(LoggingEvent record) {
-    return record.getTimeStamp();
-  }
-
-  @Override
-  public long getThreadId(LoggingEvent record) {
-    return Thread.currentThread().getId();
-  }
-
-  @Override
-  public Throwable getThrowable(LoggingEvent record) {
-    ThrowableInformation throwableInformation = record.getThrowableInformation();
-    return throwableInformation != null ? throwableInformation.getThrowable() : null;
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/main/java/org/apache/aurora/common/net/http/handlers/LogConfig.java
----------------------------------------------------------------------
diff --git a/commons/src/main/java/org/apache/aurora/common/net/http/handlers/LogConfig.java b/commons/src/main/java/org/apache/aurora/common/net/http/handlers/LogConfig.java
deleted file mode 100644
index d3c6ddd..0000000
--- a/commons/src/main/java/org/apache/aurora/common/net/http/handlers/LogConfig.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.common.net.http.handlers;
-
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Optional;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogManager;
-import java.util.logging.Logger;
-import java.util.logging.LoggingMXBean;
-
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
-
-import org.apache.aurora.common.util.templating.StringTemplateHelper;
-import org.apache.aurora.common.util.templating.StringTemplateHelper.TemplateException;
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Servlet that allows for dynamic adjustment of the logging configuration.
- *
- * @author William Farner
- */
-@Path("/logconfig")
-public class LogConfig {
-  private static final List<String> LOG_LEVELS = Lists.newArrayList(
-      Level.SEVERE.getName(),
-      Level.WARNING.getName(),
-      Level.INFO.getName(),
-      Level.CONFIG.getName(),
-      Level.FINE.getName(),
-      Level.FINER.getName(),
-      Level.FINEST.getName(),
-      "INHERIT" // Display value for a null level, the logger inherits from its ancestor.
-  );
-
-  private final StringTemplateHelper template =
-      new StringTemplateHelper(getClass(), "logconfig", false);
-
-  @POST
-  @Produces(MediaType.TEXT_HTML)
-  public String post(
-      @FormParam("logger") String loggerName,
-      @FormParam("level") String loggerLevel) throws TemplateException {
-
-    Optional<String> configChange = Optional.empty();
-    if (loggerName != null && loggerLevel != null) {
-      Logger logger = Logger.getLogger(loggerName);
-      Level newLevel = loggerLevel.equals("INHERIT") ? null : Level.parse(loggerLevel);
-      logger.setLevel(newLevel);
-      if (newLevel != null) {
-        maybeAdjustHandlerLevels(logger, newLevel);
-      }
-
-      configChange = Optional.of(String.format("%s level changed to %s", loggerName, loggerLevel));
-    }
-
-    return displayPage(configChange);
-  }
-
-  @GET
-  @Produces(MediaType.TEXT_HTML)
-  public String get() throws TemplateException {
-    return displayPage(Optional.empty());
-  }
-
-  protected String displayPage(Optional<String> configChange) throws TemplateException {
-    StringWriter writer = new StringWriter();
-
-    template.writeTemplate(writer, stringTemplate -> {
-      LoggingMXBean logBean = LogManager.getLoggingMXBean();
-
-      if (configChange.isPresent()) {
-        stringTemplate.setAttribute("configChange", configChange.get());
-      }
-
-      List<LoggerConfig> loggerConfigs = Lists.newArrayList();
-      for (String logger : Ordering.natural().immutableSortedCopy(logBean.getLoggerNames())) {
-        loggerConfigs.add(new LoggerConfig(logger, logBean.getLoggerLevel(logger)));
-      }
-
-      stringTemplate.setAttribute("loggers", loggerConfigs);
-      stringTemplate.setAttribute("levels", LOG_LEVELS);
-    });
-
-    return writer.toString();
-  }
-
-  private void maybeAdjustHandlerLevels(Logger logger, Level newLevel) {
-    do {
-      for (Handler handler : logger.getHandlers()) {
-        Level handlerLevel = handler.getLevel();
-        if (newLevel.intValue() < handlerLevel.intValue()) {
-          handler.setLevel(newLevel);
-        }
-      }
-    } while (logger.getUseParentHandlers() && (logger = logger.getParent()) != null);
-  }
-
-  private class LoggerConfig {
-    private final String name;
-    private final String level;
-
-    public LoggerConfig(String name, String level) {
-      this.name = name;
-      this.level = StringUtils.isBlank(level) ? "INHERIT" : level;
-    }
-
-    public String getName() {
-      return name;
-    }
-
-    public String getLevel() {
-      return level;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/main/resources/org/apache/aurora/common/net/http/handlers/logconfig.st
----------------------------------------------------------------------
diff --git a/commons/src/main/resources/org/apache/aurora/common/net/http/handlers/logconfig.st b/commons/src/main/resources/org/apache/aurora/common/net/http/handlers/logconfig.st
deleted file mode 100644
index 02b85c2..0000000
--- a/commons/src/main/resources/org/apache/aurora/common/net/http/handlers/logconfig.st
+++ /dev/null
@@ -1,44 +0,0 @@
-<html>
-  <title>Logger Config</title>
-    <head>
-      <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
-    </head>
-    <body>
-      <table border=1 cellpadding=0 cellspacing=0 align=left>
-        <tr>
-          <th>Logger</th>
-          <th>Level</th>
-        </tr>
-        $loggers:{ logger |    
-          <tr>
-            <td>$logger.name$</td>
-            <td>
-              <select id="$logger.name$" name="level"  class="selectlevels" data-loglevel="$logger.level$">
-                $levels:{ level |
-                  <option value='$level$'>$level$</option>	
-                }$
-              </select>
-            </td>
-          </tr>
-        }$
-      </table>
-      <script>
-        \$(document).ready(function() {
-          // For every logger changed the select to match the current level.
-          \$('.selectlevels').each(function() { 
-            \$(this).val(\$(this).data('loglevel')); 
-          });
-          // Every time a logger value is changed post the logger name and new level.        
-          \$('.selectlevels').change(function() { 
-            \$.post("/logconfig", 
-                   { logger : \$(this).attr('id'), level : \$(this).val() },
-                   function() {
-                     // Reload the page so the new logger value is visible.  
-                     location.reload();
-                   }
-            );	
-          });
-        });
-      </script>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/test/java/org/apache/aurora/common/logging/LogFormatterTest.java
----------------------------------------------------------------------
diff --git a/commons/src/test/java/org/apache/aurora/common/logging/LogFormatterTest.java b/commons/src/test/java/org/apache/aurora/common/logging/LogFormatterTest.java
deleted file mode 100644
index 9f04191..0000000
--- a/commons/src/test/java/org/apache/aurora/common/logging/LogFormatterTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.common.logging;
-
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-
-import com.google.common.base.Throwables;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertThat;
-
-/**
- * @author William Farner
- */
-public class LogFormatterTest {
-
-  private static final int THREAD_ID = 105;
-  private static final long TIME_MILLIS = 1298065054839L;
-  private static final String TIME_STRING = "0218 21:37:34.839";
-
-  private LogFormatter formatter;
-
-  @Before
-  public void setUp() {
-    formatter = new LogFormatter();
-  }
-
-  @Test
-  public void testSimpleMessage() {
-    String message = "Configurated the whizzbanger.";
-
-    LogRecord record = makeRecord(Level.INFO, message);
-
-    assertThat(formatter.format(record), is(
-        String.format("I%s THREAD%d: %s\n", TIME_STRING, THREAD_ID, message)));
-  }
-
-  @Test
-  public void testException() {
-    String message = "The fuzzbizzer failed.";
-    Throwable exception = new RuntimeException("No such fizzbuzzer.");
-
-    LogRecord record = makeRecord(Level.WARNING, message);
-    record.setThrown(exception);
-
-    assertThat(formatter.format(record), is(
-        String.format("W%s THREAD%d: %s\n%s\n", TIME_STRING, THREAD_ID, message,
-            Throwables.getStackTraceAsString(exception))));
-  }
-
-  private static LogRecord makeRecord(Level level, String message) {
-    LogRecord record = new LogRecord(level, message);
-    record.setMillis(TIME_MILLIS);
-    record.setThreadID(THREAD_ID);
-    return record;
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/commons/src/test/java/org/apache/aurora/common/logging/RootLogConfigTest.java
----------------------------------------------------------------------
diff --git a/commons/src/test/java/org/apache/aurora/common/logging/RootLogConfigTest.java b/commons/src/test/java/org/apache/aurora/common/logging/RootLogConfigTest.java
deleted file mode 100644
index 9d55a1a..0000000
--- a/commons/src/test/java/org/apache/aurora/common/logging/RootLogConfigTest.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.common.logging;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * @author Franco Callari
- * @author Keith Tsui.
- */
-public class RootLogConfigTest {
-  private static class FakeHandler extends Handler {
-    boolean hasPublished = false;
-    FakeHandler() { reset(); }
-    void reset() { hasPublished = false; }
-    public void publish(LogRecord record) { hasPublished = true; }
-    public void flush() {}
-    public void close() throws SecurityException {}
-  }
-
-  // Dummy classes used by the tests for --vmodule.
-  private static class ClassA {
-    static Logger logger = Logger.getLogger(ClassA.class.getName());
-  }
-
-  private static class ClassB {
-    static Logger logger = Logger.getLogger(ClassB.class.getName());
-  }
-
-  private ByteArrayOutputStream fakeErrorLog;
-  private PrintStream errPrintStream;
-  Logger fakeRootLogger, testLogger;
-  FakeHandler fakeFileLog;
-  ConsoleHandler consoleHandler;
-
-  private void assertHasLoggedToStderr() {
-    errPrintStream.flush();
-    assertTrue(fakeErrorLog.size() > 0);
-  }
-
-  private void assertHasNotLoggedToStderr() {
-    errPrintStream.flush();
-    assertEquals(fakeErrorLog.size(), 0);
-  }
-
-  private void assertHasLoggedToFile() {
-    assertTrue(fakeFileLog.hasPublished);
-  }
-
-  private void assertHasNotLoggedToFile() {
-    assertFalse(fakeFileLog.hasPublished);
-  }
-
-  // Passes if logger log at least at the given level, directing to stderr.
-  private void assertErrorLogAtLevel(Logger logger, Level level) {
-    List<Level> levels = Arrays.asList(
-        Level.SEVERE, Level.WARNING, Level.INFO, Level.CONFIG,
-        Level.FINE, Level.FINER, Level.FINEST);
-    for (Level l : levels) {
-      logger.log(l, "Message");
-      if (level.intValue() <= l.intValue()) {
-        assertHasLoggedToStderr();
-      } else {
-        assertHasNotLoggedToStderr();
-      }
-      resetLogs();
-    }
-  }
-
-  // Passes if logger does not allow verbose logging.
-  private void assertNoVerboseLogging(Logger logger) {
-    logger.config("Config");
-    logger.fine("Fine");
-    logger.finer("Finer");
-    logger.finest("Finest");
-    assertHasNotLoggedToStderr();
-    assertHasNotLoggedToFile();
-  }
-
-  private void resetLogs() {
-    errPrintStream.flush();
-    fakeErrorLog.reset();
-    fakeFileLog.reset();
-  }
-
-  // The following two methods are used to inject our fake root logger, so to avoid test flakyness
-  // due to background threads.
-  private RootLogConfig.Builder getConfig() {
-    return RootLogConfig.builder().rootLoggerName(fakeRootLogger.getName());
-  }
-
-  private void setFakeRootForLogger(Logger logger) {
-    Preconditions.checkArgument(logger != fakeRootLogger);
-    logger.setUseParentHandlers(true);
-    logger.setParent(fakeRootLogger);
-  }
-
-  @Before
-  public void setUp() {
-    // Intercept stderr (this must be done first).
-    fakeErrorLog = new ByteArrayOutputStream();
-    errPrintStream = new PrintStream(fakeErrorLog);
-    System.setErr(errPrintStream);
-
-    // Create other members
-    consoleHandler = new ConsoleHandler();
-    fakeFileLog = new FakeHandler();
-
-    // Emulate default setup (just a console handler), but avoiding the use
-    // of the global root logger so not to get a flaky test due to background threads.
-    fakeRootLogger = Logger.getLogger("FakeRoot-" + UUID.randomUUID().toString());
-    fakeRootLogger.setUseParentHandlers(false);
-    for (Handler h : fakeRootLogger.getHandlers()) {
-      fakeRootLogger.removeHandler(h);
-    }
-    fakeRootLogger.addHandler(consoleHandler);
-
-    testLogger = Logger.getLogger(RootLogConfigTest.class.getName());
-    testLogger.setUseParentHandlers(true);
-    testLogger.setParent(fakeRootLogger);
-
-    setFakeRootForLogger(ClassA.logger);
-    setFakeRootForLogger(ClassB.logger);
-
-    resetLogs();
-  }
-
-  @Test
-  public void testDefaultConfig() {
-    // Verify that default info, warning, severe logging goes to stderr, no logging below info.
-    assertErrorLogAtLevel(testLogger, Level.INFO);
-    resetLogs();
-    assertNoVerboseLogging(testLogger);
-  }
-
-  @Test
-  public void testLogToStderr() {
-    // Add a fake handler, verify that it works along with the console.
-    fakeRootLogger.addHandler(fakeFileLog);
-    testLogger.info("Info");
-    assertHasLoggedToStderr();
-    assertHasLoggedToFile();
-
-    // Configure logtostderr
-    getConfig().logToStderr(true).build().apply();
-    resetLogs();
-
-    // Verify that severe, warning, info logs go to stderr only.
-    testLogger.severe("Severe");
-    assertHasLoggedToStderr();
-    assertHasNotLoggedToFile();
-    resetLogs();
-    testLogger.warning("Warning");
-    assertHasLoggedToStderr();
-    assertHasNotLoggedToFile();
-    resetLogs();
-    testLogger.info("Info");
-    assertHasLoggedToStderr();
-    assertHasNotLoggedToFile();
-    resetLogs();
-
-    assertNoVerboseLogging(testLogger);
-  }
-
-  @Test
-  public void testAlsoLogToStderr() {
-    // Add a fake handler, remove console handler, verify that it works.
-    fakeRootLogger.removeHandler(consoleHandler);
-    fakeRootLogger.addHandler(fakeFileLog);
-    testLogger.info("Info");
-    assertHasNotLoggedToStderr();
-    assertHasLoggedToFile();
-    resetLogs();
-
-    // Configure alsologtostderr
-    getConfig().alsoLogToStderr(true).build().apply();
-    resetLogs();
-
-    // Verify that severe, warning, info logs go to both.
-    testLogger.severe("Severe");
-    assertHasLoggedToStderr();
-    assertHasLoggedToFile();
-    resetLogs();
-    testLogger.warning("Warning");
-    assertHasLoggedToStderr();
-    assertHasLoggedToFile();
-    resetLogs();
-    testLogger.info("Info");
-    assertHasLoggedToStderr();
-    assertHasLoggedToFile();
-    resetLogs();
-
-    assertNoVerboseLogging(testLogger);
-  }
-
-  @Test
-  public void testLogToStderrOverridesAlsoLogToStderr() {
-    // Add a fake handler, remove console handler, verify that it works.
-    fakeRootLogger.removeHandler(consoleHandler);
-    fakeRootLogger.addHandler(fakeFileLog);
-    testLogger.info("Info");
-    assertHasNotLoggedToStderr();
-    assertHasLoggedToFile();
-
-    // Configure with logtostderr AND alsologtostderr
-    getConfig().logToStderr(true).alsoLogToStderr(true).build().apply();
-    resetLogs();
-
-    // Verify that severe, warning, info logs go to stderr only.
-    testLogger.severe("Severe");
-    assertHasLoggedToStderr();
-    assertHasNotLoggedToFile();
-    resetLogs();
-    testLogger.warning("Warning");
-    assertHasLoggedToStderr();
-    assertHasNotLoggedToFile();
-    resetLogs();
-    testLogger.info("Info");
-    assertHasLoggedToStderr();
-    assertHasNotLoggedToFile();
-    resetLogs();
-
-    assertNoVerboseLogging(testLogger);
-  }
-
-  @Test
-  public void testUseGLogFormatter() {
-    // Configure glogformatter. We test in "logtostderr" mode so to verify correct formatting
-    // for both handlers.
-    getConfig().logToStderr(true).useGLogFormatter(true).build().apply();
-    resetLogs();
-
-    testLogger.severe("Severe Log Message");
-    assertHasLoggedToStderr();
-    String output = fakeErrorLog.toString();
-    // Verify that it is all in one line and chope the \n.
-    assertTrue(output.split("\n").length == 1);
-    assertTrue(output.endsWith("\n"));
-    output = output.replaceAll("\n", "");
-
-    // Verify that it is on glog format.
-    assertTrue("Unexpected output: " + output,
-        output.matches("E\\d+ " // Level, month, day.
-            + "\\d\\d:\\d\\d:\\d\\d\\.\\d+ " // Timestamp.
-            + "THREAD\\d+ " // Thread id.
-            + RootLogConfigTest.class.getName() + "\\.testUseGLogFormatter: " // Class name.
-            + "Severe Log Message" // Message.
-        ));
-  }
-
-  @Test
-  public void testVlog() {
-    // Configure with logtoStderr and vlog==FINE;
-    getConfig().logToStderr(true).vlog(RootLogConfig.LogLevel.FINE).build().apply();
-    resetLogs();
-
-    // Verify logging at levels fine and above.
-    assertErrorLogAtLevel(testLogger, Level.FINE);
-  }
-
-  @Test
-  public void testVModule() {
-    // Configure with ClassA using FINE and ClassB using WARNING;
-    Map<Class<?>, RootLogConfig.LogLevel> vmoduleMap =
-        ImmutableMap.of(ClassA.class, RootLogConfig.LogLevel.FINE,
-                        ClassB.class, RootLogConfig.LogLevel.WARNING);
-    getConfig().logToStderr(true).vmodule(vmoduleMap).build().apply();
-    resetLogs();
-
-    // No verbose logging other than in ClassA and ClassB.
-    assertNoVerboseLogging(testLogger);
-
-    // ClassA logs at FINE and above
-    assertErrorLogAtLevel(ClassA.logger, Level.FINE);
-    resetLogs();
-
-    // ClassB logs at WARNING and above
-    assertErrorLogAtLevel(ClassB.logger, Level.WARNING);
-  }
-
-  @Test
-  public void testVModuleOverridesVlog() {
-    // Configure with ClassA using FINE and ClassB using FINER;
-    Map<Class<?>, RootLogConfig.LogLevel> vmoduleMap =
-        ImmutableMap.of(ClassA.class, RootLogConfig.LogLevel.FINEST,
-                        ClassB.class, RootLogConfig.LogLevel.INFO);
-    // Configure setting default vlog=FINER
-    getConfig()
-        .logToStderr(true).vlog(RootLogConfig.LogLevel.FINER).vmodule(vmoduleMap).build().apply();
-    resetLogs();
-
-    // Default logging is at finer level.
-    assertErrorLogAtLevel(testLogger, Level.FINER);
-
-    // ClassA logs at FINEST and above
-    assertErrorLogAtLevel(ClassA.logger, Level.FINEST);
-    resetLogs();
-
-    // ClassB logs at INFO and above
-    assertErrorLogAtLevel(ClassB.logger, Level.INFO);
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/config/legacy_untested_classes.txt
----------------------------------------------------------------------
diff --git a/config/legacy_untested_classes.txt b/config/legacy_untested_classes.txt
index f183518..6b71fd2 100644
--- a/config/legacy_untested_classes.txt
+++ b/config/legacy_untested_classes.txt
@@ -18,6 +18,8 @@ org/apache/aurora/scheduler/cron/quartz/CronSchedulerImpl
 org/apache/aurora/scheduler/cron/quartz/CronSchedulerImpl$1
 org/apache/aurora/scheduler/http/AbortCallback
 org/apache/aurora/scheduler/http/JerseyTemplateServlet
+org/apache/aurora/scheduler/http/LogConfig
+org/apache/aurora/scheduler/http/LogConfig$LoggerConfig
 org/apache/aurora/scheduler/http/Maintenance
 org/apache/aurora/scheduler/http/Maintenance$1
 org/apache/aurora/scheduler/http/Maintenance$2

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/examples/vagrant/upstart/aurora-scheduler-kerberos.conf
----------------------------------------------------------------------
diff --git a/examples/vagrant/upstart/aurora-scheduler-kerberos.conf b/examples/vagrant/upstart/aurora-scheduler-kerberos.conf
index 4f43892..57fa312 100644
--- a/examples/vagrant/upstart/aurora-scheduler-kerberos.conf
+++ b/examples/vagrant/upstart/aurora-scheduler-kerberos.conf
@@ -24,12 +24,12 @@ env DIST_DIR=/home/vagrant/aurora/dist
 
 # Flags that control the behavior of the JVM.
 env JAVA_OPTS='-Djava.library.path=/usr/lib
-  -Dlog4j.configuration="file:///etc/zookeeper/conf/log4j.properties"
+  -Xdebug
+  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
   -Djava.security.krb5.conf=/home/vagrant/src/krb5-1.13.1/build/testdir/krb5.conf
   -Dsun.security.krb5.debug=true
   -Dsun.security.jgss.debug=true
   -Djavax.net.debug=all
-  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
 '
 
 chdir /home/vagrant/aurora/dist/install/aurora-scheduler
@@ -46,8 +46,6 @@ exec bin/aurora-scheduler \
   -backup_dir=/var/lib/aurora/backups \
   -thermos_executor_path=$DIST_DIR/thermos_executor.pex \
   -thermos_executor_flags="--announcer-enable --announcer-ensemble localhost:2181" \
-  -vlog=INFO \
-  -logtostderr \
   -allowed_container_types=MESOS,DOCKER \
   -shiro_realm_modules=KERBEROS5_AUTHN,INI_AUTHNZ \
   -shiro_ini_path=/home/vagrant/aurora/src/test/resources/org/apache/aurora/scheduler/http/api/security/shiro-example.ini \

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/examples/vagrant/upstart/aurora-scheduler.conf
----------------------------------------------------------------------
diff --git a/examples/vagrant/upstart/aurora-scheduler.conf b/examples/vagrant/upstart/aurora-scheduler.conf
index 4033184..8120ff7 100644
--- a/examples/vagrant/upstart/aurora-scheduler.conf
+++ b/examples/vagrant/upstart/aurora-scheduler.conf
@@ -22,7 +22,10 @@ env LIBPROCESS_IP=192.168.33.7
 env DIST_DIR=/home/vagrant/aurora/dist
 
 # Flags that control the behavior of the JVM.
-env JAVA_OPTS='-Djava.library.path=/usr/lib -Dlog4j.configuration="file:///etc/zookeeper/conf/log4j.properties" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005'
+env JAVA_OPTS='-Djava.library.path=/usr/lib
+  -Xdebug
+  -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
+'
 
 chdir /home/vagrant/aurora/dist/install/aurora-scheduler
 exec bin/aurora-scheduler \
@@ -38,12 +41,10 @@ exec bin/aurora-scheduler \
   -backup_dir=/var/lib/aurora/backups \
   -thermos_executor_path=$DIST_DIR/thermos_executor.pex \
   -thermos_executor_flags="--announcer-enable --announcer-ensemble localhost:2181" \
-  -vlog=INFO \
-  -logtostderr \
   -allowed_container_types=MESOS,DOCKER \
   -http_authentication_mechanism=BASIC \
   -use_beta_db_task_store=true \
   -shiro_ini_path=etc/shiro.example.ini \
   -enable_h2_console=true \
   -tier_config=/home/vagrant/aurora/src/test/resources/org/apache/aurora/scheduler/tiers-example.json \
-  -receive_revocable_resources=true
\ No newline at end of file
+  -receive_revocable_resources=true

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/src/main/java/org/apache/aurora/scheduler/app/Log4jConfigurator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/app/Log4jConfigurator.java b/src/main/java/org/apache/aurora/scheduler/app/Log4jConfigurator.java
deleted file mode 100644
index 348ff13..0000000
--- a/src/main/java/org/apache/aurora/scheduler/app/Log4jConfigurator.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Licensed 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.
- */
-package org.apache.aurora.scheduler.app;
-
-import java.util.Objects;
-
-import org.apache.aurora.common.logging.RootLogConfig;
-import org.apache.aurora.common.logging.RootLogConfig.Configuration;
-import org.apache.aurora.common.logging.log4j.GlogLayout;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.ConsoleAppender;
-import org.apache.log4j.Level;
-import org.apache.log4j.Logger;
-
-/**
- * Configures log4j logging.
- */
-final class Log4jConfigurator {
-  private static final org.slf4j.Logger LOG =
-      org.slf4j.LoggerFactory.getLogger(Log4jConfigurator.class.getName());
-
-  /**
-   * Configures log4j to log to stderr with a glog format.
-   *
-   * @param glogConfig The glog configuration in effect.
-   */
-  static void configureConsole(Configuration glogConfig) {
-    Objects.requireNonNull(glogConfig);
-
-    BasicConfigurator.configure(
-        new ConsoleAppender(new GlogLayout(), ConsoleAppender.SYSTEM_ERR));
-    Logger.getRootLogger().setLevel(getLevel(glogConfig));
-  }
-
-  private static Level getLevel(RootLogConfig.Configuration logConfig) {
-    switch (logConfig.getVlog()) {
-      case FINEST: // fall through
-      case FINER: // fall through
-      case FINE: // fall through
-      case CONFIG:
-        return Level.TRACE;
-      case INFO:
-        return Level.INFO;
-      case WARNING:
-        return Level.WARN;
-      case SEVERE:
-        return Level.ERROR;
-      default:
-        LOG.warn("Mapping unexpected vlog value of {} to log4j TRACE", logConfig.getVlog());
-        return Level.TRACE;
-    }
-  }
-
-  private Log4jConfigurator() {
-    // Utility class.
-  }
-}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java b/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java
index de018dd..0659c35 100644
--- a/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java
+++ b/src/main/java/org/apache/aurora/scheduler/app/SchedulerMain.java
@@ -15,9 +15,7 @@ package org.apache.aurora.scheduler.app;
 
 import java.net.InetSocketAddress;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicLong;
@@ -44,8 +42,6 @@ import org.apache.aurora.common.args.CmdLine;
 import org.apache.aurora.common.args.constraints.NotEmpty;
 import org.apache.aurora.common.args.constraints.NotNull;
 import org.apache.aurora.common.inject.Bindings;
-import org.apache.aurora.common.logging.RootLogConfig;
-import org.apache.aurora.common.logging.RootLogConfig.LogLevel;
 import org.apache.aurora.common.stats.Stats;
 import org.apache.aurora.common.zookeeper.Group;
 import org.apache.aurora.common.zookeeper.SingletonService;
@@ -72,38 +68,12 @@ import org.apache.aurora.scheduler.zookeeper.guice.client.flagged.FlaggedClientC
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.aurora.common.logging.RootLogConfig.Configuration;
-
 /**
  * Launcher for the aurora scheduler.
  */
 public class SchedulerMain {
   private static final Logger LOG = LoggerFactory.getLogger(SchedulerMain.class);
 
-  @CmdLine(name = "logtostderr", help = "Log messages to stderr instead of logfiles.")
-  private static final Arg<Boolean> LOGTOSTDERR = Arg.create(false);
-
-  @CmdLine(name = "alsologtostderr",
-      help = "Log messages to stderr, in addition to log files. Ignored when --logtostderr")
-  private static final Arg<Boolean> ALSOLOGTOSTDERR = Arg.create(false);
-
-  @CmdLine(name = "vlog",
-      help = "The value is one of the constants in java.util.logging.Level. "
-          + "Shows all messages with level equal or higher "
-          + "than the value of this flag.")
-  private static final Arg<LogLevel> VLOG = Arg.create(LogLevel.INFO);
-
-  @CmdLine(name = "vmodule",
-      help = "Per-class verbose level. The argument has to contain a comma-separated list "
-          + "of <class_name>=<log_level>. <class_name> is the full-qualified name of a "
-          + "class, <log_level> is one of the constants in java.util.logging.Level. "
-          + "<log_level> overrides any value given by --vlog.")
-  private static final Arg<Map<Class<?>, LogLevel>> VMODULE =
-      Arg.<Map<Class<?>, LogLevel>>create(new HashMap<>());
-
-  @CmdLine(name = "use_glog_formatter", help = "True to use the glog formatter exclusively.")
-  private static final Arg<Boolean> USE_GLOG_FORMATTER = Arg.create(true);
-
   @NotNull
   @CmdLine(name = "cluster_name", help = "Name to identify the cluster being served.")
   private static final Arg<String> CLUSTER_NAME = Arg.create();
@@ -145,17 +115,6 @@ public class SchedulerMain {
     Runtime.getRuntime().addShutdownHook(new Thread(SchedulerMain.this::stop, "ShutdownHook"));
     startupServices.awaitHealthy();
 
-    // Setup log4j to match our jul glog config in order to pick up zookeeper logging.
-    Configuration logConfiguration = RootLogConfig.builder()
-        .logToStderr(LOGTOSTDERR.get())
-        .alsoLogToStderr(ALSOLOGTOSTDERR.get())
-        .useGLogFormatter(USE_GLOG_FORMATTER.get())
-        .vlog(VLOG.get())
-        .vmodule(VMODULE.get())
-        .build();
-    logConfiguration.apply();
-    Log4jConfigurator.configureConsole(logConfiguration);
-
     LeadershipListener leaderListener = schedulerLifecycle.prepare();
 
     HostAndPort httpAddress = httpService.getAddress();

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/src/main/java/org/apache/aurora/scheduler/http/JettyServerModule.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/http/JettyServerModule.java b/src/main/java/org/apache/aurora/scheduler/http/JettyServerModule.java
index 6c5654b..df649ff 100644
--- a/src/main/java/org/apache/aurora/scheduler/http/JettyServerModule.java
+++ b/src/main/java/org/apache/aurora/scheduler/http/JettyServerModule.java
@@ -59,7 +59,6 @@ import org.apache.aurora.common.args.CmdLine;
 import org.apache.aurora.common.net.http.handlers.AbortHandler;
 import org.apache.aurora.common.net.http.handlers.ContentionPrinter;
 import org.apache.aurora.common.net.http.handlers.HealthHandler;
-import org.apache.aurora.common.net.http.handlers.LogConfig;
 import org.apache.aurora.common.net.http.handlers.QuitHandler;
 import org.apache.aurora.common.net.http.handlers.ThreadStackPrinter;
 import org.apache.aurora.common.net.http.handlers.TimeSeriesDataSource;

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/src/main/java/org/apache/aurora/scheduler/http/LogConfig.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/http/LogConfig.java b/src/main/java/org/apache/aurora/scheduler/http/LogConfig.java
new file mode 100644
index 0000000..47d1282
--- /dev/null
+++ b/src/main/java/org/apache/aurora/scheduler/http/LogConfig.java
@@ -0,0 +1,126 @@
+/**
+ * Licensed 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.
+ */
+package org.apache.aurora.scheduler.http;
+
+import java.io.StringWriter;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
+
+import org.apache.aurora.common.util.templating.StringTemplateHelper;
+import org.apache.aurora.common.util.templating.StringTemplateHelper.TemplateException;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+
+/**
+ * Servlet that allows for dynamic adjustment of the logging configuration.
+ *
+ * @author William Farner
+ */
+@Path("/logconfig")
+public class LogConfig {
+  private static final List<String> LOG_LEVELS = Lists.newArrayList(
+      Level.OFF.levelStr,
+      Level.ERROR.levelStr,
+      Level.WARN.levelStr,
+      Level.INFO.levelStr,
+      Level.DEBUG.levelStr,
+      Level.TRACE.levelStr,
+      Level.ALL.levelStr,
+      "INHERIT" // Display value for a null level, the logger inherits from its ancestor.
+  );
+
+  private final StringTemplateHelper template =
+      new StringTemplateHelper(getClass(), "logconfig", false);
+
+  @POST
+  @Produces(MediaType.TEXT_HTML)
+  public String post(
+      @FormParam("logger") String loggerName,
+      @FormParam("level") String loggerLevel) throws TemplateException {
+
+    Optional<String> configChange = Optional.empty();
+    if (loggerName != null && loggerLevel != null) {
+      Logger logger = (Logger) LoggerFactory.getLogger(loggerName);
+      Level newLevel = Level.toLevel(loggerLevel, null);
+      logger.setLevel(newLevel);
+
+      configChange = Optional.of(String.format("%s level changed to %s", loggerName, loggerLevel));
+    }
+
+    return displayPage(configChange);
+  }
+
+  @GET
+  @Produces(MediaType.TEXT_HTML)
+  public String get() throws TemplateException {
+    return displayPage(Optional.empty());
+  }
+
+  protected String displayPage(Optional<String> configChange) throws TemplateException {
+    StringWriter writer = new StringWriter();
+
+    template.writeTemplate(writer, stringTemplate -> {
+      if (configChange.isPresent()) {
+        stringTemplate.setAttribute("configChange", configChange.get());
+      }
+
+      LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+
+      Set<LoggerConfig> loggers = FluentIterable.from(context.getLoggerList())
+          .transform(logger -> new LoggerConfig(
+              logger.getName(),
+              Optional.ofNullable(logger.getLevel()).map(l -> l.levelStr).orElse("INHERIT")))
+          .toSortedSet(Ordering.natural().onResultOf(LoggerConfig::getName));
+
+      stringTemplate.setAttribute("loggers", loggers);
+      stringTemplate.setAttribute("levels", LOG_LEVELS);
+    });
+
+    return writer.toString();
+  }
+
+  private static class LoggerConfig {
+    private final String name;
+    private final String level;
+
+    LoggerConfig(String name, String level) {
+      this.name = name;
+      this.level = StringUtils.isBlank(level) ? "INHERIT" : level;
+    }
+
+    public String getName() {
+      return name;
+    }
+
+    public String getLevel() {
+      return level;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/src/main/resources/logback.xml
----------------------------------------------------------------------
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 0000000..faf0dbc
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this work except in compliance with the License.
+You may obtain a copy of the License in the LICENSE file, or 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.
+-->
+<!--
+ According to logback documentation, a file on the classpath named logback.xml will be the last
+ search target before falling back to a default.  As such, we include logback.xml on the classpath
+ to provide a reasonable default, but allow users to override in any format they wish.
+ http://logback.qos.ch/manual/configuration.html
+-->
+<configuration>
+  <appender name="STDERR" class="ch.qos.logback.core.ConsoleAppender">
+    <target>System.err</target>
+    <encoder>
+      <pattern>
+        %.-1level%date{MMdd HH:mm:ss.SSS} [%thread, %class{0}:%line] %message %xThrowable%n
+      </pattern>
+    </encoder>
+  </appender>
+  <root level="info">
+    <appender-ref ref="STDERR" />
+  </root>
+</configuration>

http://git-wip-us.apache.org/repos/asf/aurora/blob/d542bd1d/src/main/resources/org/apache/aurora/scheduler/http/logconfig.st
----------------------------------------------------------------------
diff --git a/src/main/resources/org/apache/aurora/scheduler/http/logconfig.st b/src/main/resources/org/apache/aurora/scheduler/http/logconfig.st
new file mode 100644
index 0000000..02b85c2
--- /dev/null
+++ b/src/main/resources/org/apache/aurora/scheduler/http/logconfig.st
@@ -0,0 +1,44 @@
+<html>
+  <title>Logger Config</title>
+    <head>
+      <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
+    </head>
+    <body>
+      <table border=1 cellpadding=0 cellspacing=0 align=left>
+        <tr>
+          <th>Logger</th>
+          <th>Level</th>
+        </tr>
+        $loggers:{ logger |    
+          <tr>
+            <td>$logger.name$</td>
+            <td>
+              <select id="$logger.name$" name="level"  class="selectlevels" data-loglevel="$logger.level$">
+                $levels:{ level |
+                  <option value='$level$'>$level$</option>	
+                }$
+              </select>
+            </td>
+          </tr>
+        }$
+      </table>
+      <script>
+        \$(document).ready(function() {
+          // For every logger changed the select to match the current level.
+          \$('.selectlevels').each(function() { 
+            \$(this).val(\$(this).data('loglevel')); 
+          });
+          // Every time a logger value is changed post the logger name and new level.        
+          \$('.selectlevels').change(function() { 
+            \$.post("/logconfig", 
+                   { logger : \$(this).attr('id'), level : \$(this).val() },
+                   function() {
+                     // Reload the page so the new logger value is visible.  
+                     location.reload();
+                   }
+            );	
+          });
+        });
+      </script>
+    </body>
+</html>