diff --git a/src/java/org/apache/cassandra/db/SSTableImporter.java b/src/java/org/apache/cassandra/db/SSTableImporter.java
index 5949559..83b4e7b 100644
--- a/src/java/org/apache/cassandra/db/SSTableImporter.java
+++ b/src/java/org/apache/cassandra/db/SSTableImporter.java
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.UUID;
 
 import com.google.common.annotations.VisibleForTesting;
 
@@ -69,8 +70,8 @@
     @VisibleForTesting
     synchronized List<String> importNewSSTables(Options options)
     {
-        logger.info("Loading new SSTables for {}/{}: {}",
-                    cfs.keyspace.getName(), cfs.getTableName(), options);
+        UUID importID = UUID.randomUUID();
+        logger.info("[{}] Loading new SSTables for {}/{}: {}", importID, cfs.keyspace.getName(), cfs.getTableName(), options);
 
         List<Pair<Directories.SSTableLister, String>> listers = getSSTableListers(options.srcPaths);
 
@@ -99,12 +100,12 @@
                         {
                             if (dir != null)
                             {
-                                logger.error("Failed verifying sstable {} in directory {}", descriptor, dir, t);
+                                logger.error("[{}] Failed verifying sstable {} in directory {}", importID, descriptor, dir, t);
                                 failedDirectories.add(dir);
                             }
                             else
                             {
-                                logger.error("Failed verifying sstable {}", descriptor, t);
+                                logger.error("[{}] Failed verifying sstable {}", importID, descriptor, t);
                                 throw new RuntimeException("Failed verifying sstable "+descriptor, t);
                             }
                             break;
@@ -144,7 +145,7 @@
                     newSSTablesPerDirectory.forEach(s -> s.selfRef().release());
                     if (dir != null)
                     {
-                        logger.error("Failed importing sstables in directory {}", dir, t);
+                        logger.error("[{}] Failed importing sstables in directory {}", importID, dir, t);
                         failedDirectories.add(dir);
                         if (options.copyData)
                         {
@@ -160,7 +161,7 @@
                     }
                     else
                     {
-                        logger.error("Failed importing sstables from data directory - renamed sstables are: {}", movedSSTables);
+                        logger.error("[{}] Failed importing sstables from data directory - renamed sstables are: {}", importID, movedSSTables);
                         throw new RuntimeException("Failed importing sstables", t);
                     }
                 }
@@ -170,11 +171,13 @@
 
         if (newSSTables.isEmpty())
         {
-            logger.info("No new SSTables were found for {}/{}", cfs.keyspace.getName(), cfs.getTableName());
+            logger.info("[{}] No new SSTables were found for {}/{}", importID, cfs.keyspace.getName(), cfs.getTableName());
             return failedDirectories;
         }
 
-        logger.info("Loading new SSTables and building secondary indexes for {}/{}: {}", cfs.keyspace.getName(), cfs.getTableName(), newSSTables);
+        logger.info("[{}] Loading new SSTables and building secondary indexes for {}/{}: {}", importID, cfs.keyspace.getName(), cfs.getTableName(), newSSTables);
+        if (logger.isTraceEnabled())
+            logLeveling(importID, newSSTables);
 
         try (Refs<SSTableReader> refs = Refs.ref(newSSTables))
         {
@@ -187,10 +190,32 @@
 
         }
 
-        logger.info("Done loading load new SSTables for {}/{}", cfs.keyspace.getName(), cfs.getTableName());
+        logger.info("[{}] Done loading load new SSTables for {}/{}", importID, cfs.keyspace.getName(), cfs.getTableName());
         return failedDirectories;
     }
 
+    private void logLeveling(UUID importID, Set<SSTableReader> newSSTables)
+    {
+        StringBuilder sb = new StringBuilder();
+        for (SSTableReader sstable : cfs.getSSTables(SSTableSet.CANONICAL))
+            sb.append(formatMetadata(sstable));
+        logger.debug("[{}] Current sstables: {}", importID, sb);
+        sb = new StringBuilder();
+        for (SSTableReader sstable : newSSTables)
+            sb.append(formatMetadata(sstable));
+        logger.debug("[{}] New sstables: {}", importID, sb);
+    }
+
+    private static String formatMetadata(SSTableReader sstable)
+    {
+        return String.format("{[%s, %s], %d, %s, %d}",
+                             sstable.first.getToken(),
+                             sstable.last.getToken(),
+                             sstable.getSSTableLevel(),
+                             sstable.isRepaired(),
+                             sstable.onDiskLength());
+    }
+
     /**
      * Opens the sstablereader described by descriptor and figures out the correct directory for it based
      * on the first token
