Attempt to keep record of uncaught Exception

Change-Id: I0da6aae52c758dd14ccd47c8865827e814f05a58
diff --git a/utils/misc/src/main/java/org/onlab/util/Tools.java b/utils/misc/src/main/java/org/onlab/util/Tools.java
index 2b261a6..e908300 100644
--- a/utils/misc/src/main/java/org/onlab/util/Tools.java
+++ b/utils/misc/src/main/java/org/onlab/util/Tools.java
@@ -15,16 +15,21 @@
  */
 package org.onlab.util;
 
+import static org.slf4j.LoggerFactory.getLogger;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.lang.Thread.UncaughtExceptionHandler;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ThreadFactory;
 
+import org.slf4j.Logger;
+
 import com.google.common.base.Strings;
 import com.google.common.primitives.UnsignedLongs;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
@@ -34,6 +39,8 @@
     private Tools() {
     }
 
+    private static final Logger TOOLS_LOG = getLogger(Tools.class);
+
     /**
      * Returns a thread factory that produces threads named according to the
      * supplied name pattern.
@@ -42,7 +49,16 @@
      * @return thread factory
      */
     public static ThreadFactory namedThreads(String pattern) {
-        return new ThreadFactoryBuilder().setNameFormat(pattern).build();
+        return new ThreadFactoryBuilder()
+                .setNameFormat(pattern)
+                // FIXME remove UncaughtExceptionHandler before release
+                .setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+
+                    @Override
+                    public void uncaughtException(Thread t, Throwable e) {
+                        TOOLS_LOG.error("Uncaught exception on {}", t.getName(), e);
+                    }
+                }).build();
     }
 
     /**