You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by kr...@apache.org on 2022/10/28 15:21:47 UTC

[solr] 06/12: SOLR-16427: Evaluate and fix errorprone rules - CatchAndPrintStackTrace

This is an automated email from the ASF dual-hosted git repository.

krisden pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git

commit 23f3631e25fca93509d7cc49d2bacb2823430632
Author: Kevin Risden <kr...@apache.org>
AuthorDate: Tue Oct 25 15:06:53 2022 -0400

    SOLR-16427: Evaluate and fix errorprone rules - CatchAndPrintStackTrace
---
 gradle/validation/error-prone.gradle                 |  1 -
 .../src/java/org/apache/solr/bench/Docs.java         |  6 +++++-
 .../solr/client/solrj/impl/ConnectionReuseTest.java  |  6 +++++-
 .../ChaosMonkeySafeLeaderWithPullReplicasTest.java   |  3 +--
 .../apache/solr/cloud/ChaosMonkeyShardSplitTest.java |  4 ++--
 .../org/apache/solr/cloud/DeleteReplicaTest.java     |  4 ++--
 .../org/apache/solr/cloud/LeaderElectionTest.java    |  5 ++---
 .../src/test/org/apache/solr/cloud/OverseerTest.java | 14 +++++++-------
 .../test/org/apache/solr/cloud/TestTlogReplica.java  |  3 ++-
 .../solr/cloud/TrollingIndexReaderFactory.java       | 10 +++++++---
 .../test/org/apache/solr/cloud/ZkFailoverTest.java   |  7 ++++++-
 .../test/org/apache/solr/cloud/ZkShardTermsTest.java |  7 ++++++-
 .../collections/TestRequestStatusCollectionAPI.java  | 20 ++++++++++++--------
 .../handler/TestSolrConfigHandlerConcurrent.java     |  2 +-
 .../solr/handler/TestStressIncrementalBackup.java    |  3 ++-
 .../apache/solr/handler/admin/MBeansHandlerTest.java |  8 +++++++-
 .../org/apache/solr/schema/PreAnalyzedFieldTest.java |  6 +++++-
 .../src/test/org/apache/solr/search/TestSolrJ.java   |  9 ++++++---
 .../processor/RoutedAliasUpdateProcessorTest.java    |  7 ++++++-
 .../TimeRoutedAliasUpdateProcessorTest.java          |  2 +-
 .../org/apache/solr/util/OrderedExecutorTest.java    |  3 ++-
 solr/modules/analytics/build.gradle                  |  1 +
 .../legacy/LegacyAbstractAnalyticsTest.java          | 12 ++++++------
 .../apache/solr/hdfs/store/HdfsDirectoryTest.java    |  6 +++++-
 .../solr/hdfs/store/blockcache/BlockCacheTest.java   |  8 ++++++--
 .../hdfs/store/blockcache/BlockDirectoryTest.java    |  6 +++++-
 .../solr/client/solrj/LargeVolumeTestBase.java       |  2 +-
 .../org/apache/solr/client/solrj/StartSolrJetty.java |  7 ++++++-
 .../client/solrj/embedded/SolrExampleJettyTest.java  |  6 +++++-
 .../solrj/impl/ConcurrentUpdateSolrClientTest.java   |  6 +++++-
 .../org/apache/solr/common/params/SolrParamTest.java |  6 +++++-
 .../apache/solr/common/util/TestJavaBinCodec.java    |  6 +++++-
 solr/solrj/src/test/org/noggit/TestJSONParser.java   |  9 ++++++---
 .../cloud/AbstractBasicDistributedZkTestBase.java    |  6 +++---
 .../cloud/AbstractChaosMonkeySafeLeaderTestBase.java |  8 ++++++--
 .../solr/cloud/AbstractFullDistribZkTestBase.java    | 18 ++++--------------
 .../apache/solr/cloud/AbstractSyncSliceTestBase.java |  7 ++++++-
 .../src/java/org/apache/solr/cloud/ChaosMonkey.java  |  8 +++-----
 .../apache/solr/cloud/StoppableIndexingThread.java   | 17 +++++++++--------
 .../org/apache/solr/cloud/StoppableSearchThread.java |  6 ++----
 .../src/java/org/apache/solr/cloud/ZkTestServer.java |  2 +-
 .../collections/AbstractIncrementalBackupTest.java   |  6 +++---
 42 files changed, 180 insertions(+), 103 deletions(-)

diff --git a/gradle/validation/error-prone.gradle b/gradle/validation/error-prone.gradle
index 91af1e2fd0f..64c906442ac 100644
--- a/gradle/validation/error-prone.gradle
+++ b/gradle/validation/error-prone.gradle
@@ -69,7 +69,6 @@ allprojects { prj ->
             '-Xep:UseCorrectAssertInTests:OFF', // and this is a consequence of the above
             '-Xep:CatchFail:OFF', // our code is generally descriptive enough, fix case by case if tests fail
             '-Xep:JUnit4TestNotRun:OFF', // RandomizedRunner finds unannotated test methods no problem
-            '-Xep:CatchAndPrintStackTrace:OFF', // TODO: there's a lot of these but they should be easy to address
             '-Xep:StaticAssignmentInConstructor:OFF', // we assign SolrTestCaseJ4.configString in many tests, difficult to untangle
             '-Xep:ComparableType:OFF', // SolrTestCaseJ4.Doc and Fld are messy
 
diff --git a/solr/benchmark/src/java/org/apache/solr/bench/Docs.java b/solr/benchmark/src/java/org/apache/solr/bench/Docs.java
index eb96ca3c4e3..39efea9ec2f 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/Docs.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/Docs.java
@@ -18,6 +18,7 @@ package org.apache.solr.bench;
 
 import static org.apache.solr.bench.BaseBenchState.log;
 
+import java.lang.invoke.MethodHandles;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -37,6 +38,8 @@ import org.apache.solr.common.util.SolrNamedThreadFactory;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.quicktheories.core.Gen;
 import org.quicktheories.impl.BenchmarkRandomSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A tool to generate controlled random data for a benchmark. {@link SolrInputDocument}s are created
@@ -47,6 +50,7 @@ import org.quicktheories.impl.BenchmarkRandomSource;
  * them via {@link #generatedDocsIterator}.
  */
 public class Docs {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final ThreadLocal<SolrRandomnessSource> random;
   private final Queue<SolrInputDocument> docs = new ConcurrentLinkedQueue<>();
@@ -113,7 +117,7 @@ public class Docs {
               SolrInputDocument doc = Docs.this.inputDocument();
               docs.add(doc);
             } catch (Exception e) {
-              e.printStackTrace();
+              log.error("error adding doc", e);
               executorService.shutdownNow();
               throw new RuntimeException(e);
             }
diff --git a/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java b/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java
index 3faccde0198..837f6015983 100644
--- a/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java
+++ b/solr/core/src/test/org/apache/solr/client/solrj/impl/ConnectionReuseTest.java
@@ -17,6 +17,7 @@
 package org.apache.solr.client.solrj.impl;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.net.URL;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -44,9 +45,12 @@ import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.util.TestInjection;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @SuppressSSL
 public class ConnectionReuseTest extends SolrCloudTestCase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private AtomicInteger id = new AtomicInteger();
   private HttpClientContext context = HttpClientContext.create();
@@ -124,7 +128,7 @@ public class ConnectionReuseTest extends SolrCloudTestCase {
           try {
             client.add(c.solrDoc);
           } catch (Exception e) {
-            e.printStackTrace();
+            log.error("error adding doc", e);
           }
           if (!done
               && i > 0
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java
index 5469fac6ab4..764035dc043 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java
@@ -266,8 +266,7 @@ public class ChaosMonkeySafeLeaderWithPullReplicasTest extends AbstractFullDistr
         del("*:*");
         break;
       } catch (SolrServerException | SolrException e) {
-        // cluster may not be up yet
-        e.printStackTrace();
+        log.error("cluster may not be up yet", e);
       }
       Thread.sleep(100);
     }
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
index edbcd5c15fd..8baa2c5880c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
@@ -191,13 +191,13 @@ public class ChaosMonkeyShardSplitTest extends ShardSplitTest {
               overseerClient.close();
               overseerClient = electNewOverseer(zkAddress);
             } catch (Exception e) {
-              // e.printStackTrace();
+              log.error("error killing overseer", e);
             }
           }
           try {
             Thread.sleep(100);
           } catch (Exception e) {
-            // e.printStackTrace();
+            log.error("error during sleep", e);
           }
         }
       } catch (Exception t) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
index 60a31677adf..e12f9b836a1 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
@@ -394,7 +394,7 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
                   }
                   Thread.sleep(500);
                 } catch (NullPointerException | SolrException e) {
-                  e.printStackTrace();
+                  log.error("error deleting replica", e);
                   Thread.sleep(500);
                 }
               }
@@ -402,7 +402,7 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
                 fail("Timeout for waiting replica get deleted");
               }
             } catch (Exception e) {
-              e.printStackTrace();
+              log.error("Failed to delete replica", e);
               fail("Failed to delete replica");
             } finally {
               // avoiding deadlock
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
index 8dd949c410b..4136c8f8a89 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
@@ -537,12 +537,11 @@ public class LeaderElectionTest extends SolrTestCaseJ4 {
                       server.expire(zk.getSessionId());
                     }
                   } catch (Exception e) {
-                    e.printStackTrace();
+                    log.error("error expiring session", e);
                   }
                   Thread.sleep(500);
-
                 } catch (Exception e) {
-
+                  log.error("error expiring session", e);
                 }
               }
             });
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
index aa9503182ee..039890921c1 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
@@ -1087,13 +1087,13 @@ public class OverseerTest extends SolrTestCaseJ4 {
               overseerClient.close();
               overseerClient = electNewOverseer(zkAddress);
             } catch (Throwable e) {
-              // e.printStackTrace();
+              log.error("error killing overseer", e);
             }
           }
           try {
             Thread.sleep(100);
           } catch (Throwable e) {
-            // e.printStackTrace();
+            log.error("error during sleep", e);
           }
         }
       } catch (Throwable t) {
@@ -1229,7 +1229,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
             q.offer(Utils.toJSON(m));
             break;
           } catch (SolrException | KeeperException | AlreadyClosedException e) {
-            e.printStackTrace();
+            log.error("error updating state", e);
           }
         }
 
@@ -1247,7 +1247,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
                 getOpenOverseer());
             break;
           } catch (SolrException | KeeperException | AlreadyClosedException e) {
-            e.printStackTrace();
+            log.error("error publishing state", e);
           }
         }
 
@@ -1272,7 +1272,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
                 getOpenOverseer());
             break;
           } catch (SolrException | AlreadyClosedException e) {
-            e.printStackTrace();
+            log.error("error publishing state", e);
           }
         }
 
@@ -1292,7 +1292,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
                 getOpenOverseer());
             break;
           } catch (SolrException | AlreadyClosedException e) {
-            e.printStackTrace();
+            log.error("error publishing state", e);
           }
         }
 
@@ -1312,7 +1312,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
                 getOpenOverseer());
             break;
           } catch (SolrException | AlreadyClosedException e) {
-            e.printStackTrace();
+            log.error("error publishing state", e);
           }
         }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
index 6bf85bd7aaf..84ee46e85ae 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
@@ -679,7 +679,8 @@ public class TestTlogReplica extends SolrCloudTestCase {
             waitingForReplay.release();
             waitingForBufferUpdates.acquire();
           } catch (InterruptedException e) {
-            e.printStackTrace();
+            Thread.currentThread().interrupt();
+            log.error("interrupted", e);
             fail("Test interrupted: " + e.getMessage());
           }
         };
diff --git a/solr/core/src/test/org/apache/solr/cloud/TrollingIndexReaderFactory.java b/solr/core/src/test/org/apache/solr/cloud/TrollingIndexReaderFactory.java
index 99e8fe674ae..ff2d715f260 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TrollingIndexReaderFactory.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TrollingIndexReaderFactory.java
@@ -18,6 +18,7 @@ package org.apache.solr.cloud;
 
 import java.io.Closeable;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
 import java.util.Date;
@@ -35,8 +36,11 @@ import org.apache.lucene.store.Directory;
 import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.StandardIndexReaderFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TrollingIndexReaderFactory extends StandardIndexReaderFactory {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static volatile Trap trap;
   private static final BlockingQueue<List<Object>> lastStacktraces =
@@ -191,8 +195,7 @@ public class TrollingIndexReaderFactory extends StandardIndexReaderFactory {
 
   private static void recordStackTrace(StackTraceElement[] stackTrace) {
     // keep the last n limited traces.
-    // e.printStackTrace();
-    ArrayList<Object> stack = new ArrayList<Object>();
+    ArrayList<Object> stack = new ArrayList<>();
     stack.add(
         "" + (new Date().getTime() - startTime) + " (" + Thread.currentThread().getName() + ")");
     for (int l = 2; l < stackTrace.length && l < keepStackTraceLines; l++) {
@@ -204,7 +207,8 @@ public class TrollingIndexReaderFactory extends StandardIndexReaderFactory {
       try {
         lastStacktraces.poll(100, TimeUnit.MILLISECONDS);
       } catch (InterruptedException e1) {
-        e1.printStackTrace();
+        Thread.currentThread().interrupt();
+        log.error("interrupted", e1);
       }
     }
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkFailoverTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkFailoverTest.java
index b295b4f097a..ecdd4f30193 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkFailoverTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkFailoverTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.solr.cloud;
 
+import java.lang.invoke.MethodHandles;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -27,8 +28,12 @@ import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.zookeeper.KeeperException;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ZkFailoverTest extends SolrCloudTestCase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   private ZkTestServer zkTestServer;
 
   @BeforeClass
@@ -82,7 +87,7 @@ public class ZkFailoverTest extends SolrCloudTestCase {
                 try {
                   runner.start();
                 } catch (Exception e) {
-                  e.printStackTrace();
+                  log.error("error starting runner", e);
                 }
               });
       threads[i].start();
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
index 6570a4a87bd..ead1a49e6ea 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
@@ -18,6 +18,7 @@
 package org.apache.solr.cloud;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -35,8 +36,11 @@ import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.util.TimeOut;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ZkShardTermsTest extends SolrCloudTestCase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @BeforeClass
   public static void setupCluster() throws Exception {
@@ -223,7 +227,8 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
                       Thread.sleep(random().nextInt(200));
                       zkShardTerms.setTermEqualsToLeader(replica);
                     } catch (InterruptedException e) {
-                      e.printStackTrace();
+                      Thread.currentThread().interrupt();
+                      log.error("interrupted", e);
                     }
                   }
                 }
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java
index 543d53b9f04..36e1e4e81f6 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestRequestStatusCollectionAPI.java
@@ -17,6 +17,7 @@
 package org.apache.solr.cloud.api.collections;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.Arrays;
 import java.util.Map;
 import org.apache.solr.client.solrj.SolrClient;
@@ -30,8 +31,11 @@ import org.apache.solr.common.params.CommonAdminParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public static final int MAX_WAIT_TIMEOUT_SECONDS = 90;
 
@@ -55,7 +59,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
     try {
       sendRequest(params);
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     // Check for the request to be completed.
@@ -74,7 +78,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
       createResponse = sendStatusRequestWithRetry(params, MAX_WAIT_TIMEOUT_SECONDS);
       message = (String) createResponse.findRecursive("status", "msg");
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     assertEquals("found [1000] in completed tasks", message);
@@ -92,7 +96,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
       status = (NamedList<?>) r.get("status");
       message = (String) status.get("msg");
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     assertEquals("Did not find [9999999] in any tasks queue", message);
@@ -105,7 +109,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
     try {
       sendRequest(params);
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     // Check for the request to be completed.
@@ -117,7 +121,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
       splitResponse = sendStatusRequestWithRetry(params, MAX_WAIT_TIMEOUT_SECONDS);
       message = (String) splitResponse.findRecursive("status", "msg");
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     assertEquals("found [1001] in completed tasks", message);
@@ -137,7 +141,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
     try {
       sendRequest(params);
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     params = new ModifiableSolrParams();
@@ -149,7 +153,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
       NamedList<Object> response = sendStatusRequestWithRetry(params, MAX_WAIT_TIMEOUT_SECONDS);
       message = (String) response.findRecursive("status", "msg");
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     assertEquals("found [1002] in failed tasks", message);
@@ -164,7 +168,7 @@ public class TestRequestStatusCollectionAPI extends BasicDistributedZkTest {
     try {
       r = sendRequest(params);
     } catch (SolrServerException | IOException e) {
-      e.printStackTrace();
+      log.error("error sending request", e);
     }
 
     assertEquals("Task with the same requestid already exists. (1002)", r.get("error"));
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java
index ff824632b31..91cc9685062 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerConcurrent.java
@@ -74,7 +74,7 @@ public class TestSolrConfigHandlerConcurrent extends AbstractFullDistribZkTestBa
                   try {
                     invokeBulkCall((String) e.getKey(), errs);
                   } catch (Exception e1) {
-                    e1.printStackTrace();
+                    log.error("error invoking bulk call", e1);
                   }
                 });
         threads.add(t);
diff --git a/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java b/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java
index 3b34120953e..58286fec3de 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java
@@ -181,7 +181,8 @@ public class TestStressIncrementalBackup extends SolrCloudTestCase {
         RequestStatusState state = backup.processAndWait(cluster.getSolrClient(), 1000);
         assertEquals(RequestStatusState.COMPLETED, state);
       } catch (InterruptedException e) {
-        e.printStackTrace();
+        Thread.currentThread().interrupt();
+        log.error("interrupted", e);
       }
     } else {
       CollectionAdminResponse rsp = backup.process(cluster.getSolrClient());
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
index b074f84da43..c4fa6c35e2e 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.handler.admin;
 
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -33,8 +34,11 @@ import org.apache.solr.metrics.SolrMetricsContext;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class MBeansHandlerTest extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @BeforeClass
   public static void beforeClass() throws Exception {
@@ -203,12 +207,14 @@ public class MBeansHandlerTest extends SolrTestCaseJ4 {
                   bean.getSolrMetricsContext().getMetricsSnapshot();
                 } catch (Exception e) {
                   runSnapshots = false;
-                  e.printStackTrace();
+                  log.error("Exception getting metrics snapshot", e);
                   fail("Exception getting metrics snapshot: " + e);
                 }
                 try {
                   Thread.sleep(53);
                 } catch (InterruptedException e) {
+                  Thread.currentThread().interrupt();
+                  log.error("interrupted", e);
                   runSnapshots = false;
                   break;
                 }
diff --git a/solr/core/src/test/org/apache/solr/schema/PreAnalyzedFieldTest.java b/solr/core/src/test/org/apache/solr/schema/PreAnalyzedFieldTest.java
index 69d7b19a51b..f7e40cd575b 100644
--- a/solr/core/src/test/org/apache/solr/schema/PreAnalyzedFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/PreAnalyzedFieldTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.schema;
 
+import java.lang.invoke.MethodHandles;
 import java.util.Collections;
 import java.util.HashMap;
 import org.apache.lucene.analysis.Analyzer;
@@ -26,8 +27,11 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.schema.PreAnalyzedField.PreAnalyzedParser;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class PreAnalyzedFieldTest extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static final String[] valid = {
     "1 one two three", // simple parsing
@@ -112,7 +116,7 @@ public class PreAnalyzedFieldTest extends SolrTestCaseJ4 {
         // System.out.println(" - toString: '" + sb.toString() + "'");
         assertEquals(validParsed[i], parser.toFormattedString(f));
       } catch (Exception e) {
-        e.printStackTrace();
+        log.error("Should pass: '{}', exception", s, e);
         fail("Should pass: '" + s + "', exception: " + e);
       }
     }
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolrJ.java b/solr/core/src/test/org/apache/solr/search/TestSolrJ.java
index 398329ea641..c131f075813 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolrJ.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolrJ.java
@@ -17,6 +17,7 @@
 package org.apache.solr.search;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -27,8 +28,11 @@ import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.util.RTimer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TestSolrJ extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public void testSolrJ() {
     // docs, producers, connections, sleep_time
@@ -76,8 +80,7 @@ public class TestSolrJ extends SolrTestCaseJ4 {
               try {
                 indexDocs(base, docsPerThread, maxSleep);
               } catch (Exception e) {
-                System.out.println("###############################CAUGHT EXCEPTION");
-                e.printStackTrace();
+                log.error("###############################CAUGHT EXCEPTION", e);
                 ex = e;
               }
             }
@@ -154,7 +157,7 @@ public class TestSolrJ extends SolrTestCaseJ4 {
           Thread.sleep(sleep);
         } catch (InterruptedException e) {
           Thread.currentThread().interrupt();
-          e.printStackTrace();
+          log.error("interrupted", e);
           throw new RuntimeException(e);
         }
       }
diff --git a/solr/core/src/test/org/apache/solr/update/processor/RoutedAliasUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/RoutedAliasUpdateProcessorTest.java
index 6f3f08efb48..3e6e328e9fe 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/RoutedAliasUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/RoutedAliasUpdateProcessorTest.java
@@ -20,6 +20,7 @@ package org.apache.solr.update.processor;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -59,11 +60,14 @@ import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.UpdateCommand;
 import org.junit.Ignore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix(
     bugUrl = "https://issues.apache.org/jira/browse/SOLR-13696")
 @Ignore // don't try to run abstract base class
 public abstract class RoutedAliasUpdateProcessorTest extends SolrCloudTestCase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static final String intField = "integer_i";
 
@@ -267,7 +271,8 @@ public abstract class RoutedAliasUpdateProcessorTest extends SolrCloudTestCase {
         try {
           Thread.sleep(500);
         } catch (InterruptedException e) {
-          e.printStackTrace();
+          Thread.currentThread().interrupt();
+          log.error("interrupted", e);
           fail(e.getMessage());
         }
       }
diff --git a/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
index 06985502b97..32fb14dbf20 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
@@ -807,7 +807,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
       try {
         solrClient.query(col, params("q", "*:*", "rows", "10"));
       } catch (SolrException e) {
-        e.printStackTrace();
+        log.error("Unable to query ", e);
         fail("Unable to query " + col);
       }
     }
diff --git a/solr/core/src/test/org/apache/solr/util/OrderedExecutorTest.java b/solr/core/src/test/org/apache/solr/util/OrderedExecutorTest.java
index f3731645856..4b49baa6e01 100644
--- a/solr/core/src/test/org/apache/solr/util/OrderedExecutorTest.java
+++ b/solr/core/src/test/org/apache/solr/util/OrderedExecutorTest.java
@@ -247,7 +247,8 @@ public class OrderedExecutorTest extends SolrTestCase {
               isRunning.countDown();
               blockingLatch.await();
             } catch (InterruptedException e) {
-              e.printStackTrace();
+              Thread.currentThread().interrupt();
+              log.error("interrupted", e);
             }
           });
 
diff --git a/solr/modules/analytics/build.gradle b/solr/modules/analytics/build.gradle
index ffcbbb478a1..8289a94b9fe 100644
--- a/solr/modules/analytics/build.gradle
+++ b/solr/modules/analytics/build.gradle
@@ -33,4 +33,5 @@ dependencies {
   testImplementation project(':solr:test-framework')
   testImplementation 'com.carrotsearch.randomizedtesting:randomizedtesting-runner'
   testImplementation 'junit:junit'
+  testImplementation 'org.slf4j:slf4j-api'
 }
diff --git a/solr/modules/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java b/solr/modules/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java
index 2b90e139e31..5a75adc982b 100644
--- a/solr/modules/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java
+++ b/solr/modules/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java
@@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -41,11 +42,14 @@ import org.apache.solr.analytics.util.OrdinalCalculator;
 import org.apache.solr.request.SolrQueryRequest;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
 public class LegacyAbstractAnalyticsTest extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   protected static final String[] BASEPARMS =
       new String[] {"q", "*:*", "indent", "true", "olap", "true", "rows", "0"};
@@ -140,12 +144,8 @@ public class LegacyAbstractAnalyticsTest extends SolrTestCaseJ4 {
           return val;
       }
     } catch (Exception e) {
-      e.printStackTrace();
-      fail(
-          "Caught exception in getStatResult, xPath = "
-              + sb.toString()
-              + " \nraw data: "
-              + rawResponse);
+      log.error("Caught exception in getStatResult", e);
+      fail("Caught exception in getStatResult, xPath = " + sb + " \nraw data: " + rawResponse);
     }
     fail("Unknown type used in getStatResult");
     return null; // Really can't get here, but the compiler thinks we can!
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/HdfsDirectoryTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/HdfsDirectoryTest.java
index 780d4c566e4..0a0b9aad759 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/HdfsDirectoryTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/HdfsDirectoryTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.hdfs.store;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.nio.file.FileAlreadyExistsException;
 import java.util.HashSet;
 import java.util.Random;
@@ -41,6 +42,8 @@ import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @ThreadLeakFilters(
     defaultFilters = true,
@@ -52,6 +55,7 @@ import org.junit.Test;
 @ThreadLeakLingering(
     linger = 1000) // Wait at least 1 second for Netty GlobalEventExecutor to shutdown
 public class HdfsDirectoryTest extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static final int MAX_NUMBER_OF_WRITES = 10000;
   private static final int MIN_FILE_SIZE = 100;
@@ -190,7 +194,7 @@ public class HdfsDirectoryTest extends SolrTestCaseJ4 {
         fsDir.close();
       }
     } catch (Exception e) {
-      e.printStackTrace();
+      log.error("Test failed on pass [{}]", i, e);
       fail("Test failed on pass [" + i + "]");
     }
   }
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockCacheTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockCacheTest.java
index 248e5666887..d4ea63140bb 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockCacheTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockCacheTest.java
@@ -19,13 +19,17 @@ package org.apache.solr.hdfs.store.blockcache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.RemovalCause;
 import com.github.benmanes.caffeine.cache.RemovalListener;
+import java.lang.invoke.MethodHandles;
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.solr.SolrTestCase;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class BlockCacheTest extends SolrTestCase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @Test
   public void testBlockCache() {
@@ -158,7 +162,7 @@ public class BlockCacheTest extends SolrTestCase {
 
               } catch (Throwable e) {
                 failed.set(true);
-                e.printStackTrace();
+                log.error("failure", e);
               }
             }
 
@@ -321,7 +325,7 @@ public class BlockCacheTest extends SolrTestCase {
                 test(readsPerThread);
               } catch (Throwable e) {
                 failed.set(true);
-                e.printStackTrace();
+                log.error("failure", e);
               }
             }
 
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockDirectoryTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockDirectoryTest.java
index 6c2db998113..de3fef8f11c 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockDirectoryTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/store/blockcache/BlockDirectoryTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.hdfs.store.blockcache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import java.io.File;
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.Map;
 import java.util.Random;
 import org.apache.lucene.store.Directory;
@@ -32,8 +33,11 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class BlockDirectoryTest extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static class MapperCache implements Cache {
     public Map<String, byte[]> map =
@@ -172,7 +176,7 @@ public class BlockDirectoryTest extends SolrTestCaseJ4 {
         assertInputsEquals(name, fsDir, directory);
       }
     } catch (Exception e) {
-      e.printStackTrace();
+      log.error("Test failed on pass [{}]", i, e);
       fail("Test failed on pass [" + i + "]");
     }
     long t2 = System.nanoTime();
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/LargeVolumeTestBase.java b/solr/solrj/src/test/org/apache/solr/client/solrj/LargeVolumeTestBase.java
index 9edddebacec..748353b28f0 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/LargeVolumeTestBase.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/LargeVolumeTestBase.java
@@ -124,7 +124,7 @@ public abstract class LargeVolumeTestBase extends EmbeddedSolrServerTestBase {
         }
 
       } catch (Exception e) {
-        e.printStackTrace();
+        log.error("{} failed", getName(), e);
         fail(getName() + "---" + e.getMessage());
       }
     }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java b/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
index 4e48d0f7e15..ad308589d34 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/StartSolrJetty.java
@@ -16,16 +16,21 @@
  */
 package org.apache.solr.client.solrj;
 
+import java.lang.invoke.MethodHandles;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.webapp.WebAppContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @since solr 1.3
  */
 public class StartSolrJetty {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   public static void main(String[] args) {
     // System.setProperty("solr.solr.home", "../../../example/solr");
 
@@ -60,7 +65,7 @@ public class StartSolrJetty {
       server.stop();
       server.join();
     } catch (Exception e) {
-      e.printStackTrace();
+      log.error("failed to start", e);
       System.exit(100);
     }
   }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
index 611f756ab3d..57a026546f6 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleJettyTest.java
@@ -21,6 +21,7 @@ import static org.apache.solr.common.util.Utils.fromJSONString;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
@@ -46,6 +47,8 @@ import org.apache.solr.common.util.NamedList;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * TODO? perhaps use: http://docs.codehaus.org/display/JETTY/ServletTester rather then open a real
@@ -53,6 +56,7 @@ import org.junit.Test;
  */
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class SolrExampleJettyTest extends SolrExampleTests {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @BeforeClass
   public static void beforeTest() throws Exception {
@@ -158,7 +162,7 @@ public class SolrExampleJettyTest extends SolrExampleTests {
             try {
               IOUtils.skip(body, 1024 * 1000);
             } catch (IOException e) {
-              e.printStackTrace();
+              log.error("error skipping body", e);
             }
             return rsp.getResponse();
           }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClientTest.java
index 23354a6b870..67d265568c2 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClientTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.client.solrj.impl;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
@@ -43,8 +44,11 @@ import org.apache.solr.common.util.SolrNamedThreadFactory;
 import org.eclipse.jetty.servlet.ServletHolder;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ConcurrentUpdateSolrClientTest extends SolrJettyTestBase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   /** Mock endpoint where the CUSS being tested in this class sends requests. */
   public static class TestServlet extends HttpServlet
@@ -320,7 +324,7 @@ public class ConcurrentUpdateSolrClientTest extends SolrJettyTestBase {
           if (this.collection == null) cuss.request(req);
           else cuss.request(req, this.collection);
         } catch (Throwable t) {
-          t.printStackTrace();
+          log.error("error making request", t);
         }
       }
     }
diff --git a/solr/solrj/src/test/org/apache/solr/common/params/SolrParamTest.java b/solr/solrj/src/test/org/apache/solr/common/params/SolrParamTest.java
index 9d8e332b8b5..6ae0e3edd4f 100644
--- a/solr/solrj/src/test/org/apache/solr/common/params/SolrParamTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/params/SolrParamTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.common.params;
 
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -23,9 +24,12 @@ import java.util.List;
 import java.util.Map;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.common.SolrException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** */
 public class SolrParamTest extends SolrTestCase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   public void testParamIterators() {
 
@@ -301,7 +305,7 @@ public class SolrParamTest extends SolrTestCase {
     } catch (SolrException sx) {
       return sx.code();
     } catch (Exception ex) {
-      ex.printStackTrace();
+      log.error("error running", ex);
       return 500;
     }
     return 200;
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
index 545552d40f4..9ce1b6a2f14 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -42,8 +43,11 @@ import org.apache.solr.util.ConcurrentLRUCache;
 import org.apache.solr.util.RTimer;
 import org.junit.Test;
 import org.noggit.CharArr;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TestJavaBinCodec extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static final String SOLRJ_JAVABIN_BACKCOMPAT_BIN = "/solrj/javabin_backcompat.bin";
   private static final String BIN_FILE_LOCATION =
@@ -627,7 +631,7 @@ public class TestJavaBinCodec extends SolrTestCaseJ4 {
             try {
               doDecode(buffers, iter, stringCache);
             } catch (IOException e) {
-              e.printStackTrace();
+              log.error("exception decoding", e);
             }
           });
     }
diff --git a/solr/solrj/src/test/org/noggit/TestJSONParser.java b/solr/solrj/src/test/org/noggit/TestJSONParser.java
index e718e90e361..3a6d475256a 100644
--- a/solr/solrj/src/test/org/noggit/TestJSONParser.java
+++ b/solr/solrj/src/test/org/noggit/TestJSONParser.java
@@ -19,10 +19,14 @@ package org.noggit;
 
 import java.io.IOException;
 import java.io.StringReader;
+import java.lang.invoke.MethodHandles;
 import org.apache.solr.SolrTestCaseJ4;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TestJSONParser extends SolrTestCaseJ4 {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   // these are to aid in debugging if an unexpected error occurs
   static int parserType;
@@ -277,12 +281,11 @@ public class TestJSONParser extends SolrTestCaseJ4 {
         }
       } catch (IOException ex) {
         // shouldn't happen
-        System.out.println(ret); // use ret
+        log.error(String.valueOf(ret)); // use ret
       } catch (JSONParser.ParseException ex) {
         // OK
       } catch (Throwable ex) {
-        ex.printStackTrace();
-        System.out.println(lastParser());
+        log.error(lastParser(), ex);
         throw new RuntimeException(ex);
       }
     }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java
index eb5ace81685..e384672c834 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java
@@ -1562,7 +1562,7 @@ public abstract class AbstractBasicDistributedZkTestBase extends AbstractFullDis
             }
             client.request(createCmd);
           } catch (Exception e) {
-            e.printStackTrace();
+            log.error("error creating core", e);
             // fail
           }
           return null;
@@ -1669,7 +1669,7 @@ public abstract class AbstractBasicDistributedZkTestBase extends AbstractFullDis
               .process(cloudClient)
               .getStatus());
     } catch (Exception e) {
-      e.printStackTrace();
+      log.error("error creating collection", e);
       // fails
     }
     final List<SolrClient> collectionClients = new ArrayList<>();
@@ -1688,7 +1688,7 @@ public abstract class AbstractBasicDistributedZkTestBase extends AbstractFullDis
                       .process(cloudClient)
                       .isSuccess());
             } catch (Exception e) {
-              e.printStackTrace();
+              log.error("error adding replica", e);
               // fails
             }
             return null;
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java
index 981c5c717f0..ab765d32699 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java
@@ -17,6 +17,7 @@
 
 package org.apache.solr.cloud;
 
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -28,9 +29,13 @@ import org.apache.solr.common.SolrInputDocument;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @LuceneTestCase.Nightly
 public abstract class AbstractChaosMonkeySafeLeaderTestBase extends AbstractFullDistribZkTestBase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   private static final Integer RUN_LENGTH =
       Integer.parseInt(System.getProperty("solr.tests.cloud.cm.runlength", "-1"));
 
@@ -209,8 +214,7 @@ public abstract class AbstractChaosMonkeySafeLeaderTestBase extends AbstractFull
         del("*:*");
         break;
       } catch (SolrServerException e) {
-        // cluster may not be up yet
-        e.printStackTrace();
+        log.error("cluster may not be up yet", e);
       }
       Thread.sleep(100);
     }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
index 43f8376fac7..4a3c47474eb 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
@@ -495,11 +495,8 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
                   SolrClient client = createNewSolrClient(j.getLocalPort());
                   clients.add(client);
 
-                } catch (IOException e) {
-                  e.printStackTrace();
-                  throw new RuntimeException(e);
                 } catch (Exception e) {
-                  e.printStackTrace();
+                  log.error("error creating jetty", e);
                   throw new RuntimeException(e);
                 }
               });
@@ -537,11 +534,8 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
                   coreClients.add(createNewSolrClient(coreName, j.getLocalPort()));
                   SolrClient client = createNewSolrClient(j.getLocalPort());
                   clients.add(client);
-                } catch (IOException e) {
-                  e.printStackTrace();
-                  throw new RuntimeException(e);
                 } catch (Exception e) {
-                  e.printStackTrace();
+                  log.error("error creating jetty", e);
                   throw new RuntimeException(e);
                 }
               });
@@ -577,11 +571,8 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
                 coreClients.add(createNewSolrClient(coreName, j.getLocalPort()));
                 SolrClient client = createNewSolrClient(j.getLocalPort());
                 clients.add(client);
-              } catch (IOException e) {
-                e.printStackTrace();
-                throw new RuntimeException(e);
               } catch (Exception e) {
-                e.printStackTrace();
+                log.error("error creating jetty", e);
                 throw new RuntimeException(e);
               }
             });
@@ -1925,8 +1916,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
       try {
         commit();
       } catch (Throwable t) {
-        t.printStackTrace();
-        // we don't care if this commit fails on some nodes
+        log.error("we don't care if this commit fails on some nodes", t);
       }
 
       updateMappingsFromZk(jettys, clients);
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
index 1b00e68b396..6efa386ff38 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
@@ -17,6 +17,7 @@
 package org.apache.solr.cloud;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -38,10 +39,14 @@ import org.apache.solr.common.params.CollectionParams.CollectionAction;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.util.LogLevel;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Test sync phase that occurs when Leader goes down and a new Leader is elected. */
 @LogLevel("org.apache.solr.update.processor.DistributedZkUpdateProcessor=WARN")
 public abstract class AbstractSyncSliceTestBase extends AbstractFullDistribZkTestBase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   private boolean success = false;
 
   @Override
@@ -236,7 +241,7 @@ public abstract class AbstractSyncSliceTestBase extends AbstractFullDistribZkTes
     try {
       commit();
     } catch (Throwable t) {
-      t.printStackTrace();
+      log.error("commit error", t);
     }
     if (shardFailMessage == null) {
       // try again
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java b/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java
index e0f2e6d1fd1..2a5e91115eb 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/ChaosMonkey.java
@@ -535,16 +535,14 @@ public class ChaosMonkey {
             () -> {
               while (!stop) {
                 try {
-
                   Thread.sleep(chaosRandom.nextInt(roundPauseUpperLimit));
 
                   causeSomeChaos();
-
                 } catch (InterruptedException e) {
-                  //
+                  Thread.currentThread().interrupt();
+                  log.error("interrupted", e);
                 } catch (Exception e) {
-                  // TODO Auto-generated catch block
-                  e.printStackTrace();
+                  log.error("error causing some chaos", e);
                 }
               }
               monkeyLog("finished");
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/StoppableIndexingThread.java b/solr/test-framework/src/java/org/apache/solr/cloud/StoppableIndexingThread.java
index 3b100cf1245..355f6e38c2f 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/StoppableIndexingThread.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/StoppableIndexingThread.java
@@ -17,6 +17,7 @@
 package org.apache.solr.cloud;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -25,8 +26,12 @@ import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrInputDocument;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class StoppableIndexingThread extends AbstractFullDistribZkTestBase.StoppableThread {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   static String t1 = "a_t";
   static String i1 = "a_i";
   private volatile boolean stop = false;
@@ -99,11 +104,9 @@ public class StoppableIndexingThread extends AbstractFullDistribZkTestBase.Stopp
 
           cloudClient.deleteById(deleteId);
         } catch (Exception e) {
-          System.err.println("REQUEST FAILED for id=" + deleteId);
-          e.printStackTrace();
+          log.error("REQUEST FAILED for id={}", deleteId, e);
           if (e instanceof SolrServerException) {
-            System.err.println("ROOT CAUSE for id=" + deleteId);
-            ((SolrServerException) e).getRootCause().printStackTrace();
+            log.error("ROOT CAUSE for id={}", deleteId, ((SolrServerException) e).getRootCause());
           }
           deleteFails.add(deleteId);
         }
@@ -123,11 +126,9 @@ public class StoppableIndexingThread extends AbstractFullDistribZkTestBase.Stopp
         }
       } catch (Exception e) {
         addFailed = true;
-        System.err.println("REQUEST FAILED for id=" + id);
-        e.printStackTrace();
+        log.error("REQUEST FAILED for id={}", id, e);
         if (e instanceof SolrServerException) {
-          System.err.println("ROOT CAUSE for id=" + id);
-          ((SolrServerException) e).getRootCause().printStackTrace();
+          log.error("ROOT CAUSE for id={}", id, ((SolrServerException) e).getRootCause());
         }
         addFails.add(id);
       }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java b/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java
index ca0d40f8065..972b56085f9 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/StoppableSearchThread.java
@@ -51,11 +51,9 @@ class StoppableSearchThread extends AbstractFullDistribZkTestBase.StoppableThrea
         // to come to the aid of their country.
         cloudClient.query(new SolrQuery(QUERIES[random.nextInt(QUERIES.length)]));
       } catch (Exception e) {
-        System.err.println("QUERY REQUEST FAILED:");
-        e.printStackTrace();
+        log.error("QUERY REQUEST FAILED:", e);
         if (e instanceof SolrServerException) {
-          System.err.println("ROOT CAUSE:");
-          ((SolrServerException) e).getRootCause().printStackTrace();
+          log.error("ROOT CAUSE:", ((SolrServerException) e).getRootCause());
         }
         queryFails.incrementAndGet();
       }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java b/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
index a83b95178ba..9bd2fd73ccf 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
@@ -487,7 +487,7 @@ public class ZkTestServer {
     try (SolrZkClient client = new SolrZkClient(getZkHost(), 10000)) {
       client.makePath(path, null, CreateMode.PERSISTENT, null, false, true, 0);
     } catch (InterruptedException | KeeperException e) {
-      e.printStackTrace();
+      log.error("Error checking path {}", path, e);
       throw new IOException("Error checking path " + path, SolrZkClient.checkInterrupted(e));
     }
   }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
index acd101985cd..c719d4988bf 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
@@ -344,8 +344,7 @@ public abstract class AbstractIncrementalBackupTest extends SolrCloudTestCase {
           fail("This backup should be failed");
         }
       } catch (Exception e) {
-        // expected
-        e.printStackTrace();
+        log.error("expected", e);
       }
     }
   }
@@ -507,7 +506,8 @@ public abstract class AbstractIncrementalBackupTest extends SolrCloudTestCase {
           RequestStatusState state = backup.processAndWait(cluster.getSolrClient(), 1000);
           assertEquals(RequestStatusState.COMPLETED, state);
         } catch (InterruptedException e) {
-          e.printStackTrace();
+          Thread.currentThread().interrupt();
+          log.error("interrupted", e);
         }
         numBackup++;
       } else {