Merge "Add an option to prevent the disabling of ddms logging"
diff --git a/src/com/android/tradefed/log/BaseLeveledLogOutput.java b/src/com/android/tradefed/log/BaseLeveledLogOutput.java
index c22468d..91219cb 100644
--- a/src/com/android/tradefed/log/BaseLeveledLogOutput.java
+++ b/src/com/android/tradefed/log/BaseLeveledLogOutput.java
@@ -20,6 +20,8 @@
 import com.android.tradefed.config.Option;
 import com.android.tradefed.log.LogUtil.CLog;
 
+import com.google.common.collect.ImmutableMap;
+
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -52,6 +54,15 @@
     )
     private Map<String, LogLevel> mComponentVerbosity = new HashMap<>();
 
+    @Option(
+            name = "force-verbosity-map",
+            description = "Enforce a pre-set verbosity of some component to avoid extreme logging.")
+    private boolean mEnableForcedVerbosity = true;
+
+    // Add components we have less control over (ddmlib for example) to ensure they don't flood
+    // us. This will still write to the log.
+    private Map<String, LogLevel> mForcedVerbosity = ImmutableMap.of("ddms", LogLevel.WARN);
+
     private Map<String, LogLevel> mVerbosityMap = new HashMap<>();
 
     /** Initialize the components filters based on the invocation {@link IConfiguration}. */
@@ -102,12 +113,22 @@
                 receiver.put(objTag, components.get(component));
             }
         }
-        // Add components we have less control over (ddmlib for example) to ensure they don't flood
-        // us. This will still write to the log.
-        mVerbosityMap.put("ddms", LogLevel.WARN);
+        if (shouldForceVerbosity()) {
+            mVerbosityMap.putAll(mForcedVerbosity);
+        }
     }
 
     /** {@inheritDoc} */
     @Override
     public abstract ILeveledLogOutput clone();
+
+    /** Whether or not to enforce the verbosity map. */
+    public boolean shouldForceVerbosity() {
+        return mEnableForcedVerbosity;
+    }
+
+    /** Returns the map of the forced verbosity. */
+    public Map<String, LogLevel> getForcedVerbosityMap() {
+        return mForcedVerbosity;
+    }
 }
diff --git a/src/com/android/tradefed/log/BaseStreamLogger.java b/src/com/android/tradefed/log/BaseStreamLogger.java
index 5027386..ec5adb6 100644
--- a/src/com/android/tradefed/log/BaseStreamLogger.java
+++ b/src/com/android/tradefed/log/BaseStreamLogger.java
@@ -22,22 +22,10 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
 
 /** A {@link ILeveledLogOutput} that directs log messages to an output stream and to stdout. */
 public abstract class BaseStreamLogger<OS extends OutputStream> extends BaseLeveledLogOutput {
 
-    /**
-     * Map of log tag to a level they are forced at for writing to log file purpose. This ensure
-     * that some logs we have less control over can still be regulated.
-     */
-    private static final Map<String, LogLevel> FORCED_LOG_LEVEL = new HashMap<>();
-
-    static {
-        FORCED_LOG_LEVEL.put("ddms", LogLevel.WARN);
-    }
-
     @Option(name = "log-level", description = "the minimum log level to log.")
     private LogLevel mLogLevel = LogLevel.DEBUG;
 
@@ -109,8 +97,8 @@
 
     // Determines whether a message should be written to the output stream.
     private boolean shouldWrite(String tag, LogLevel messageLogLevel, LogLevel invocationLogLevel) {
-        LogLevel forcedLevel = FORCED_LOG_LEVEL.get(tag);
-        if (forcedLevel == null) {
+        LogLevel forcedLevel = getForcedVerbosityMap().get(tag);
+        if (forcedLevel == null || !shouldForceVerbosity()) {
             return true;
         }
         // Use the highest level of our forced and invocation to decide if we should log the