Consolidate CHECK and LOG implementations.

Suggested reviewing order:

1. New macro definitions in common/logging.h
2. Everything else: updating use sites to use new logging/CHECK macros

PiperOrigin-RevId: 759666044
diff --git a/centipede/BUILD b/centipede/BUILD
index 6366036..ef5c270 100644
--- a/centipede/BUILD
+++ b/centipede/BUILD
@@ -63,8 +63,7 @@
         ":util",
         "@abseil-cpp//absl/base:nullability",
         "@abseil-cpp//absl/flags:flag",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
     ],
 )
@@ -77,8 +76,6 @@
         ":rusage_profiler",
         "@abseil-cpp//absl/base:nullability",
         "@abseil-cpp//absl/flags:flag",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
@@ -132,8 +129,6 @@
         ":thread_pool",
         ":util",
         "@abseil-cpp//absl/container:node_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/types:span",
         "@com_google_fuzztest//common:logging",
@@ -168,9 +163,9 @@
     hdrs = ["pc_info.h"],
     visibility = PUBLIC_API_VISIBILITY,
     deps = [
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/types:span",
         "@com_google_fuzztest//common:defs",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -211,7 +206,6 @@
         ":feature",
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/base:nullability",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/synchronization",
@@ -264,8 +258,6 @@
         "@abseil-cpp//absl/flags:flag",
         "@abseil-cpp//absl/flags:parse",
         "@abseil-cpp//absl/flags:reflection",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
@@ -290,10 +282,10 @@
     visibility = ["//visibility:public"],
     deps = [
         "@abseil-cpp//absl/base:nullability",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -307,12 +299,11 @@
         ":rusage_stats",
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/base:nullability",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/synchronization",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -323,12 +314,11 @@
     deps = [
         ":rusage_stats",
         "@abseil-cpp//absl/base:core_headers",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/synchronization",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -360,8 +350,6 @@
         "@abseil-cpp//absl/base:nullability",
         "@abseil-cpp//absl/container:btree",
         "@abseil-cpp//absl/container:flat_hash_map",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
@@ -385,8 +373,6 @@
         ":util",
         ":workdir",
         "@abseil-cpp//absl/base:core_headers",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/synchronization",
         "@com_google_fuzztest//common:defs",
         "@com_google_fuzztest//common:hash",
@@ -410,8 +396,6 @@
         ":workdir",
         "@abseil-cpp//absl/container:flat_hash_map",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@com_google_fuzztest//common:defs",
         "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
@@ -519,9 +503,9 @@
         ":symbol_table",
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/synchronization",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
         "@com_google_fuzztest//common:status_macros",
     ],
@@ -544,8 +528,6 @@
         ":util",
         "@abseil-cpp//absl/container:flat_hash_map",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@com_google_fuzztest//common:defs",
         "@com_google_fuzztest//common:logging",
@@ -569,7 +551,6 @@
         ":pc_info",
         "@abseil-cpp//absl/container:flat_hash_map",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log:check",
         "@com_google_fuzztest//common:logging",
     ],
 )
@@ -582,8 +563,6 @@
         ":control_flow",
         ":feature",
         ":util",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@com_google_fuzztest//common:logging",
     ],
@@ -602,8 +581,6 @@
         ":feature",
         ":feature_set",
         ":util",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@com_google_fuzztest//common:defs",
         "@com_google_fuzztest//common:logging",
@@ -621,8 +598,6 @@
         ":stop",
         ":util",
         "@abseil-cpp//absl/base:core_headers",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
@@ -647,9 +622,8 @@
         ":pc_info",
         ":symbol_table",
         ":util",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
     ],
 )
@@ -677,8 +651,6 @@
         ":util",
         ":workdir",
         "@abseil-cpp//absl/base:nullability",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
@@ -697,8 +669,6 @@
         ":feature",
         ":rusage_profiler",
         ":util",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/time",
         "@abseil-cpp//absl/types:span",
@@ -737,8 +707,6 @@
         ":centipede_flags",
         ":environment",
         "@abseil-cpp//absl/flags:flag",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
         "@com_google_fuzztest//common:logging",
@@ -783,8 +751,6 @@
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/base:nullability",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
@@ -830,8 +796,6 @@
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/cleanup",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
@@ -870,8 +834,6 @@
         "@abseil-cpp//absl/base:no_destructor",
         "@abseil-cpp//absl/container:flat_hash_map",
         "@abseil-cpp//absl/flags:marshalling",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
         "@com_google_fuzztest//common:defs",
@@ -900,8 +862,6 @@
         ":workdir",
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/synchronization",
         "@abseil-cpp//absl/time",
@@ -925,8 +885,6 @@
         ":mutation_input",
         ":runner_result",
         ":stop",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@com_google_fuzztest//common:defs",
@@ -1151,8 +1109,6 @@
         ":util",
         ":workdir",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/random",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
@@ -1176,7 +1132,6 @@
         ":seed_corpus_config_cc_proto",
         ":seed_corpus_maker_lib",
         ":workdir",
-        "@abseil-cpp//absl/log",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
@@ -1206,8 +1161,6 @@
     visibility = PUBLIC_API_VISIBILITY,
     deps = [
         ":environment",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@com_google_fuzztest//common:logging",
@@ -1227,7 +1180,6 @@
         ":mutation_input",
         ":runner_result",
         ":util",
-        "@abseil-cpp//absl/log:check",
         "@com_google_fuzztest//common:defs",
     ],
 )
@@ -1264,8 +1216,8 @@
     srcs = ["environment_test.cc"],
     deps = [
         ":environment",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:configuration",
         "@googletest//:gtest_main",
     ],
@@ -1318,9 +1270,9 @@
         ":thread_pool",
         ":util",
         "@abseil-cpp//absl/container:flat_hash_map",
-        "@abseil-cpp//absl/log",
         "@com_google_fuzztest//common:defs",
         "@com_google_fuzztest//common:hash",
+        "@com_google_fuzztest//common:logging",
         "@googletest//:gtest_main",
     ],
 )
@@ -1360,7 +1312,6 @@
         ":thread_pool",
         "@abseil-cpp//absl/base:nullability",
         "@abseil-cpp//absl/flags:flag",
-        "@abseil-cpp//absl/log",
         "@abseil-cpp//absl/synchronization",
         "@abseil-cpp//absl/time",
         "@com_google_fuzztest//common:logging",
@@ -1379,9 +1330,9 @@
         ":util",
         ":workdir",
         "@abseil-cpp//absl/flags:reflection",
-        "@abseil-cpp//absl/log:check",
         "@com_google_fuzztest//common:blob_file",
         "@com_google_fuzztest//common:defs",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:test_util",
         "@googletest//:gtest_main",
     ],
@@ -1397,8 +1348,8 @@
         ":rusage_profiler",
         ":rusage_stats",
         "@abseil-cpp//absl/flags:flag",
-        "@abseil-cpp//absl/log",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
         "@googletest//:gtest_main",
     ],
 )
@@ -1410,7 +1361,6 @@
         ":environment",
         ":stats",
         ":util",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/log:log_entry",
         "@abseil-cpp//absl/log:log_sink",
         "@abseil-cpp//absl/log:log_sink_registry",
@@ -1453,8 +1403,7 @@
         ":environment",
         ":symbol_table",
         ":test_coverage_util",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
         "@com_google_fuzztest//common:test_util",
         "@googletest//:gtest_main",
@@ -1606,10 +1555,10 @@
         ":feature",
         ":util",
         ":workdir",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/types:span",
         "@com_google_fuzztest//common:blob_file",
         "@com_google_fuzztest//common:defs",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:test_util",
         "@googletest//:gtest_main",
     ],
@@ -1650,9 +1599,9 @@
         ":command",
         ":stop",
         ":util",
-        "@abseil-cpp//absl/log",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:test_util",
         "@googletest//:gtest_main",
     ],
@@ -1683,8 +1632,6 @@
         ":symbol_table",
         ":thread_pool",
         "@abseil-cpp//absl/container:flat_hash_map",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:test_util",
         "@googletest//:gtest_main",
@@ -1720,7 +1667,6 @@
         ":feature",
         ":seed_corpus_maker_lib",
         ":workdir",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@com_google_fuzztest//common:defs",
         "@com_google_fuzztest//common:logging",
@@ -1778,7 +1724,6 @@
         ":resource_pool",
         ":rusage_stats",
         ":thread_pool",
-        "@abseil-cpp//absl/log",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/time",
         "@com_google_fuzztest//common:logging",
@@ -1871,8 +1816,6 @@
         ":workdir",
         "@abseil-cpp//absl/base:nullability",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
         "@com_google_fuzztest//common:defs",
diff --git a/centipede/analyze_corpora.cc b/centipede/analyze_corpora.cc
index 56e75c7..0216d83 100644
--- a/centipede/analyze_corpora.cc
+++ b/centipede/analyze_corpora.cc
@@ -24,8 +24,6 @@
 
 #include "absl/container/flat_hash_map.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "./centipede/binary_info.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/corpus.h"
@@ -48,17 +46,17 @@
   WorkDir workdir(std::string(workdir_path), std::string(binary_name),
                   std::string(binary_hash), /*my_shard_index=*/0);
   std::vector<std::string> corpus_paths;
-  CHECK_OK(
+  FUZZTEST_CHECK_OK(
       RemoteGlobMatch(workdir.CorpusFilePaths().AllShardsGlob(), corpus_paths));
   std::vector<std::string> features_paths;
-  CHECK_OK(RemoteGlobMatch(workdir.FeaturesFilePaths().AllShardsGlob(),
-                           features_paths));
+  FUZZTEST_CHECK_OK(RemoteGlobMatch(workdir.FeaturesFilePaths().AllShardsGlob(),
+                                    features_paths));
 
-  CHECK_EQ(corpus_paths.size(), features_paths.size());
+  FUZZTEST_CHECK_EQ(corpus_paths.size(), features_paths.size());
   std::vector<CorpusRecord> corpus;
   for (int i = 0; i < corpus_paths.size(); ++i) {
-    LOG(INFO) << "Reading corpus at: " << corpus_paths[i];
-    LOG(INFO) << "Reading features at: " << features_paths[i];
+    FUZZTEST_LOG(INFO) << "Reading corpus at: " << corpus_paths[i];
+    FUZZTEST_LOG(INFO) << "Reading features at: " << features_paths[i];
     ReadShard(corpus_paths[i], features_paths[i],
               [&corpus](ByteArray input, FeatureVec features) {
                 corpus.push_back({std::move(input), std::move(features)});
@@ -126,9 +124,10 @@
       a_only_pcs.insert(pc);
     }
   }
-  LOG(INFO) << VV(a.size()) << VV(b.size()) << VV(a_pcs.size())
-            << VV(a_only_pcs.size()) << VV(b_only_pcs.size())
-            << VV(b_shared_indices.size()) << VV(b_unique_indices.size());
+  FUZZTEST_LOG(INFO) << VV(a.size()) << VV(b.size()) << VV(a_pcs.size())
+                     << VV(a_only_pcs.size()) << VV(b_only_pcs.size())
+                     << VV(b_shared_indices.size())
+                     << VV(b_unique_indices.size());
 
   // Sort PCs to put them in the canonical order, as in pc_table.
   AnalyzeCorporaResults ret;
@@ -178,7 +177,7 @@
 
 void DumpCoverageReport(const CoverageResults &coverage_results,
                         std::string_view coverage_report_path) {
-  LOG(INFO) << "Dump coverage to file: " << coverage_report_path;
+  FUZZTEST_LOG(INFO) << "Dump coverage to file: " << coverage_report_path;
 
   const fuzztest::internal::PCTable &pc_table =
       coverage_results.binary_info.pc_table;
@@ -187,7 +186,7 @@
 
   fuzztest::internal::SymbolTable coverage_symbol_table;
   for (const PCIndex pc : coverage_results.pcs) {
-    CHECK_LE(pc, symbols.size());
+    FUZZTEST_CHECK_LE(pc, symbols.size());
     if (!pc_table[pc].has_flag(fuzztest::internal::PCInfo::kFuncEntry))
       continue;
     const SymbolTable::Entry entry = symbols.entry(pc);
@@ -197,7 +196,7 @@
   std::ostringstream symbol_table_stream;
   coverage_symbol_table.WriteToLLVMSymbolizer(symbol_table_stream);
 
-  CHECK_OK(
+  FUZZTEST_CHECK_OK(
       RemoteFileSetContents(coverage_report_path, symbol_table_stream.str()));
 }
 
@@ -210,8 +209,9 @@
   BinaryInfo binary_info_b =
       ReadBinaryInfo(binary_name, binary_hash, workdir_b);
 
-  CHECK_EQ(binary_info_a.pc_table.size(), binary_info_b.pc_table.size());
-  CHECK_EQ(binary_info_a.symbols.size(), binary_info_b.symbols.size());
+  FUZZTEST_CHECK_EQ(binary_info_a.pc_table.size(),
+                    binary_info_b.pc_table.size());
+  FUZZTEST_CHECK_EQ(binary_info_a.symbols.size(), binary_info_b.symbols.size());
 
   const std::vector<CorpusRecord> a =
       ReadCorpora(binary_name, binary_hash, workdir_a);
@@ -235,26 +235,26 @@
   CoverageLogger coverage_logger(pc_table, symbols);
 
   // TODO(kcc): use frontier_a to show the most interesting b-only PCs.
-  // TODO(kcc): these cause a CHECK-fail
+  // TODO(kcc): these cause a FUZZTEST_CHECK-fail
   // CoverageFrontier frontier_a(results.binary_info);
   // frontier_a.Compute(a);
 
   // First, print the newly covered functions (including partially covered).
-  LOG(INFO) << "B-only new functions:";
+  FUZZTEST_LOG(INFO) << "B-only new functions:";
   absl::flat_hash_set<std::string_view> b_only_new_functions;
   for (const auto pc : results.b_only_pcs) {
     if (!pc_table[pc].has_flag(PCInfo::kFuncEntry)) continue;
     auto str = coverage_logger.ObserveAndDescribeIfNew(pc);
-    if (!str.empty()) LOG(INFO).NoPrefix() << str;
+    if (!str.empty()) FUZZTEST_LOG(INFO).NoPrefix() << str;
     b_only_new_functions.insert(symbols.func(pc));
   }
 
   // Now, print newly covered edges in functions that were covered in `a`.
-  LOG(INFO) << "B-only new edges:";
+  FUZZTEST_LOG(INFO) << "B-only new edges:";
   for (const auto pc : results.b_only_pcs) {
     if (b_only_new_functions.contains(symbols.func(pc))) continue;
     auto str = coverage_logger.ObserveAndDescribeIfNew(pc);
-    if (!str.empty()) LOG(INFO).NoPrefix() << str;
+    if (!str.empty()) FUZZTEST_LOG(INFO).NoPrefix() << str;
   }
 }
 
diff --git a/centipede/analyze_corpora.h b/centipede/analyze_corpora.h
index 3343e05..d1731b8 100644
--- a/centipede/analyze_corpora.h
+++ b/centipede/analyze_corpora.h
@@ -62,7 +62,7 @@
                                      std::string_view workdir_a,
                                      std::string_view workdir_b);
 
-// Same as above but `LOG`s the results for human consumption.
+// Same as above but `FUZZTEST_LOG`s the results for human consumption.
 void AnalyzeCorporaToLog(std::string_view binary_name,
                          std::string_view binary_hash,
                          std::string_view workdir_a,
diff --git a/centipede/analyze_corpora_test.cc b/centipede/analyze_corpora_test.cc
index f65106d..cf00c54 100644
--- a/centipede/analyze_corpora_test.cc
+++ b/centipede/analyze_corpora_test.cc
@@ -24,12 +24,11 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "./centipede/binary_info.h"
 #include "./centipede/environment.h"
 #include "./centipede/symbol_table.h"
 #include "./centipede/test_coverage_util.h"
+#include "./common/logging.h"
 #include "./common/remote_file.h"
 #include "./common/test_util.h"
 
@@ -47,7 +46,7 @@
 }
 
 // TODO(ussuri): Implement.
-TEST(AnalyzeCorpora, AnalyzeCorpora) { LOG(INFO) << "Unimplemented"; }
+TEST(AnalyzeCorpora, AnalyzeCorpora) { FUZZTEST_LOG(INFO) << "Unimplemented"; }
 
 TEST(GetCoverage, SimpleCoverageResults) {
   Environment env;
diff --git a/centipede/binary_info.cc b/centipede/binary_info.cc
index d604be3..227bb88 100644
--- a/centipede/binary_info.cc
+++ b/centipede/binary_info.cc
@@ -22,14 +22,13 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_split.h"
 #include "./centipede/command.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/pc_info.h"
 #include "./centipede/util.h"
+#include "./common/logging.h"
 #include "./common/remote_file.h"
 
 namespace fuzztest::internal {
@@ -45,18 +44,18 @@
     std::string_view symbolizer_path, std::string_view tmp_dir_path) {
   if (binary_path_with_args.empty()) {
     // This usually happens in tests.
-    LOG(INFO) << __func__ << ": binary_path_with_args is empty";
+    FUZZTEST_LOG(INFO) << __func__ << ": binary_path_with_args is empty";
     return;
   }
   // Compute names for temp files.
   const std::filesystem::path tmp_dir = tmp_dir_path;
-  CHECK(std::filesystem::exists(tmp_dir) &&
-        std::filesystem::is_directory(tmp_dir));
+  FUZZTEST_CHECK(std::filesystem::exists(tmp_dir) &&
+                 std::filesystem::is_directory(tmp_dir));
   ScopedFile pc_table_path(tmp_dir_path, "pc_table_tmp");
   ScopedFile cf_table_path(tmp_dir_path, "cf_table_tmp");
   ScopedFile dso_table_path(tmp_dir_path, "dso_table_tmp");
   ScopedFile log_path(tmp_dir_path, "binary_info_log_tmp");
-  LOG(INFO) << __func__ << ": tmp_dir: " << tmp_dir;
+  FUZZTEST_LOG(INFO) << __func__ << ": tmp_dir: " << tmp_dir;
 
   Command::Options cmd_options;
   cmd_options.env_add = {absl::StrCat(
@@ -66,7 +65,7 @@
   Command cmd{binary_path_with_args, std::move(cmd_options)};
   int exit_code = cmd.Execute();
   if (exit_code != EXIT_SUCCESS) {
-    LOG(INFO) << __func__ << ": exit_code: " << exit_code;
+    FUZZTEST_LOG(INFO) << __func__ << ": exit_code: " << exit_code;
   }
 
   // Load PC Table.
@@ -80,24 +79,25 @@
   dso_table = ReadDsoTableFromFile(dso_table_path.path());
 
   if (pc_table.empty()) {
-    CHECK(dso_table.empty());
+    FUZZTEST_CHECK(dso_table.empty());
     // Fallback to GetPcTableFromBinaryWithTracePC().
-    LOG(WARNING)
+    FUZZTEST_LOG(WARNING)
         << "Failed to dump PC table directly from binary using linked-in "
            "runner; see target execution logs above; falling back to legacy PC "
            "table extraction using trace-pc and objdump";
     pc_table = GetPcTableFromBinaryWithTracePC(
         binary_path_with_args, objdump_path, pc_table_path.path());
     if (pc_table.empty()) {
-      LOG(ERROR) << "Failed to extract PC table from binary using objdump; see "
-                    "objdump execution logs above";
+      FUZZTEST_LOG(ERROR)
+          << "Failed to extract PC table from binary using objdump; see "
+             "objdump execution logs above";
     }
     // For the legacy trace-pc instrumentation, set the dso_table
     // to 1-element array consisting of the binary name
     const std::vector<std::string> args =
         absl::StrSplit(binary_path_with_args, absl::ByAnyChar{" \t\n"},
                        absl::SkipWhitespace{});
-    CHECK(!args.empty());
+    FUZZTEST_CHECK(!args.empty());
     dso_table.push_back({args[0], pc_table.size()});
     uses_legacy_trace_pc_instrumentation = true;
   } else {
@@ -110,7 +110,7 @@
     for (const auto& dso : dso_table) {
       num_instrumened_pcs_in_all_dsos += dso.num_instrumented_pcs;
     }
-    CHECK_EQ(num_instrumened_pcs_in_all_dsos, pc_table.size());
+    FUZZTEST_CHECK_EQ(num_instrumened_pcs_in_all_dsos, pc_table.size());
   }
 
   // Load symbols, if there is a PC table.
@@ -125,14 +125,14 @@
 void BinaryInfo::Read(std::string_view dir) {
   std::string symbol_table_contents;
   // TODO(b/295978603): move calculation of paths into WorkDir class.
-  CHECK_OK(RemoteFileGetContents(
+  FUZZTEST_CHECK_OK(RemoteFileGetContents(
       (std::filesystem::path(dir) / kSymbolTableFileName).c_str(),
       symbol_table_contents));
   std::istringstream symbol_table_stream(symbol_table_contents);
   symbols.ReadFromLLVMSymbolizer(symbol_table_stream);
 
   std::string pc_table_contents;
-  CHECK_OK(RemoteFileGetContents(
+  FUZZTEST_CHECK_OK(RemoteFileGetContents(
       (std::filesystem::path(dir) / kPCTableFileName).c_str(),
       pc_table_contents));
   std::istringstream pc_table_stream(pc_table_contents);
@@ -146,19 +146,19 @@
   std::ostringstream symbol_table_stream;
   symbols.WriteToLLVMSymbolizer(symbol_table_stream);
   // TODO(b/295978603): move calculation of paths into WorkDir class.
-  CHECK_OK(RemoteFileSetContents(
+  FUZZTEST_CHECK_OK(RemoteFileSetContents(
       (std::filesystem::path(dir) / kSymbolTableFileName).c_str(),
       symbol_table_stream.str()));
 
   std::ostringstream pc_table_stream;
   WritePcTable(pc_table, pc_table_stream);
-  CHECK_OK(RemoteFileSetContents(
+  FUZZTEST_CHECK_OK(RemoteFileSetContents(
       (std::filesystem::path(dir) / kPCTableFileName).c_str(),
       pc_table_stream.str()));
 
   std::ostringstream cf_table_stream;
   WriteCfTable(cf_table, cf_table_stream);
-  CHECK_OK(RemoteFileSetContents(
+  FUZZTEST_CHECK_OK(RemoteFileSetContents(
       (std::filesystem::path(dir) / kCfTableFileName).c_str(),
       cf_table_stream.str()));
 }
diff --git a/centipede/blob_file_converter.cc b/centipede/blob_file_converter.cc
index de21421..e9cb69b 100644
--- a/centipede/blob_file_converter.cc
+++ b/centipede/blob_file_converter.cc
@@ -19,8 +19,6 @@
 
 #include "absl/base/nullability.h"
 #include "absl/flags/flag.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_format.h"
 #include "absl/time/clock.h"
@@ -59,11 +57,11 @@
     const std::string stats = absl::StrFormat(
         "blobs: %9lld | blobs/s: %5.0f | bytes: %12lld | bytes/s: %8.0f",
         num_blobs_, num_blobs_ / secs, num_bytes_, num_bytes_ / secs);
-    if (ABSL_VLOG_IS_ON(3)) {
+    if (FUZZTEST_VLOG_IS_ON(3)) {
       const RUsageProfiler::Snapshot& snapshot = RPROF_SNAPSHOT(stats);
-      LOG(INFO) << stats << " | " << snapshot.memory.ShortStr();
+      FUZZTEST_LOG(INFO) << stats << " | " << snapshot.memory.ShortStr();
     } else {
-      LOG(INFO) << stats;
+      FUZZTEST_LOG(INFO) << stats;
     }
   }
 
@@ -90,45 +88,49 @@
 void Convert(               //
     const std::string& in,  //
     const std::string& out, const std::string& out_format) {
-  RPROF_THIS_FUNCTION_WITH_REPORT(/*enable=*/ABSL_VLOG_IS_ON(1));
+  RPROF_THIS_FUNCTION_WITH_REPORT(/*enable=*/FUZZTEST_VLOG_IS_ON(1));
 
-  LOG(INFO) << "Converting:\n" << VV(in) << "\n" << VV(out) << VV(out_format);
+  FUZZTEST_LOG(INFO) << "Converting:\n"
+                     << VV(in) << "\n"
+                     << VV(out) << VV(out_format);
 
   const bool out_is_riegeli = out_format == "riegeli";
 
   // Verify and prepare source and destination.
 
-  CHECK(RemotePathExists(in)) << VV(in);
-  CHECK_OK(RemoteMkdir(std::filesystem::path{out}.parent_path().c_str()));
+  FUZZTEST_CHECK(RemotePathExists(in)) << VV(in);
+  FUZZTEST_CHECK_OK(
+      RemoteMkdir(std::filesystem::path{out}.parent_path().c_str()));
 
   // Open blob file reader and writer.
 
   RPROF_START_TIMELAPSE(  //
-      absl::Seconds(20), /*also_log=*/ABSL_VLOG_IS_ON(3), "Opening --in");
+      absl::Seconds(20), /*also_log=*/FUZZTEST_VLOG_IS_ON(3), "Opening --in");
   const auto in_reader = DefaultBlobFileReaderFactory();
-  CHECK_OK(in_reader->Open(in)) << VV(in);
+  FUZZTEST_CHECK_OK(in_reader->Open(in)) << VV(in);
   RPROF_STOP_TIMELAPSE();
-  RPROF_SNAPSHOT_AND_LOG("Opened --in; opening --out");
+  RPROF_SNAPSHOT_AND_FUZZTEST_LOG("Opened --in; opening --out");
   const auto out_writer = DefaultBlobFileWriterFactory(out_is_riegeli);
-  CHECK_OK(out_writer->Open(out, "w")) << VV(out);
-  RPROF_SNAPSHOT_AND_LOG("Opened --out");
+  FUZZTEST_CHECK_OK(out_writer->Open(out, "w")) << VV(out);
+  RPROF_SNAPSHOT_AND_FUZZTEST_LOG("Opened --out");
 
   // Read and write blobs one-by-one.
 
   ByteSpan blob;
   absl::Status read_status = absl::OkStatus();
   StatsLogger stats_logger{
-      absl::Seconds(ABSL_VLOG_IS_ON(1) ? 20 : 60),
+      absl::Seconds(FUZZTEST_VLOG_IS_ON(1) ? 20 : 60),
       FUNCTION_LEVEL_RPROF_NAME,
   };
   while ((read_status = in_reader->Read(blob)).ok()) {
-    CHECK_OK(out_writer->Write(blob));
+    FUZZTEST_CHECK_OK(out_writer->Write(blob));
     stats_logger.UpdateStats(blob);
     stats_logger.MaybeLogIfTime();
   }
   stats_logger.Log();
-  CHECK(read_status.ok() || absl::IsOutOfRange(read_status)) << VV(read_status);
-  CHECK_OK(out_writer->Close()) << VV(out);
+  FUZZTEST_CHECK(read_status.ok() || absl::IsOutOfRange(read_status))
+      << VV(read_status);
+  FUZZTEST_CHECK_OK(out_writer->Close()) << VV(out);
 }
 
 }  // namespace
@@ -138,11 +140,12 @@
   (void)fuzztest::internal::InitRuntime(argc, argv);
 
   const std::string in = absl::GetFlag(FLAGS_in);
-  QCHECK(!in.empty());
+  FUZZTEST_QCHECK(!in.empty());
   const std::string out = absl::GetFlag(FLAGS_out);
-  QCHECK(!out.empty());
+  FUZZTEST_QCHECK(!out.empty());
   const std::string out_format = absl::GetFlag(FLAGS_out_format);
-  QCHECK(out_format == "legacy" || out_format == "riegeli") << VV(out_format);
+  FUZZTEST_QCHECK(out_format == "legacy" || out_format == "riegeli")
+      << VV(out_format);
 
   fuzztest::internal::Convert(in, out, out_format);
 
diff --git a/centipede/call_graph.cc b/centipede/call_graph.cc
index 9121557..b78c37f 100644
--- a/centipede/call_graph.cc
+++ b/centipede/call_graph.cc
@@ -18,9 +18,9 @@
 #include <cstdint>
 #include <vector>
 
-#include "absl/log/check.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/pc_info.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -54,7 +54,7 @@
       ++j;
     }
     ++j;  // Step over the delimeter.
-    CHECK_LE(j, cf_table.size());
+    FUZZTEST_CHECK_LE(j, cf_table.size());
 
     if (current_callees.empty()) continue;
     basic_block_callees_[current_pc] = current_callees;
@@ -64,7 +64,7 @@
         current_callees.end());
   }
   // This should stay empty.
-  CHECK(empty_.empty());
+  FUZZTEST_CHECK(empty_.empty());
 }
 
 }  // namespace fuzztest::internal
diff --git a/centipede/call_graph.h b/centipede/call_graph.h
index 3e3c03b..2377e36 100644
--- a/centipede/call_graph.h
+++ b/centipede/call_graph.h
@@ -20,7 +20,6 @@
 
 #include "absl/container/flat_hash_map.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/pc_info.h"
 #include "./common/logging.h"
@@ -34,13 +33,15 @@
   void InitializeCallGraph(const CFTable& cf_table, const PCTable& pc_table);
 
   const std::vector<uintptr_t>& GetFunctionCallees(uintptr_t pc) const {
-    CHECK(IsFunctionEntry(pc)) << VV(pc) << " is not a function entry.";
+    FUZZTEST_CHECK(IsFunctionEntry(pc))
+        << VV(pc) << " is not a function entry.";
     const auto it = call_graph_.find(pc);
     if (it == call_graph_.cend()) return empty_;
     return it->second;
   }
   const std::vector<uintptr_t>& GetBasicBlockCallees(uintptr_t pc) const {
-    CHECK(basic_blocks_.contains(pc)) << VV(pc) << " is not a basic block.";
+    FUZZTEST_CHECK(basic_blocks_.contains(pc))
+        << VV(pc) << " is not a basic block.";
     const auto it = basic_block_callees_.find(pc);
     if (it == basic_block_callees_.cend()) return empty_;
     return it->second;
diff --git a/centipede/centipede.cc b/centipede/centipede.cc
index 84490e4..d366c75 100644
--- a/centipede/centipede.cc
+++ b/centipede/centipede.cc
@@ -64,8 +64,6 @@
 #include "absl/base/const_init.h"  // NOLINT
 #include "absl/base/nullability.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/strings/ascii.h"
 #include "absl/strings/str_cat.h"
@@ -132,15 +130,15 @@
           /*raii_actions=*/RUsageProfiler::kRaiiOff,
           /*location=*/{__FILE__, __LINE__},
           /*description=*/"Engine") {
-  CHECK(env_.seed) << "env_.seed must not be zero";
+  FUZZTEST_CHECK(env_.seed) << "env_.seed must not be zero";
   if (!env_.input_filter.empty() && env_.fork_server)
     input_filter_cmd_.StartForkServer(TemporaryLocalDirPath(), "input_filter");
 }
 
 void Centipede::CorpusToFiles(const Environment &env, std::string_view dir) {
   std::vector<std::string> sharded_corpus_files;
-  CHECK_OK(RemoteGlobMatch(WorkDir{env}.CorpusFilePaths().AllShardsGlob(),
-                           sharded_corpus_files));
+  FUZZTEST_CHECK_OK(RemoteGlobMatch(
+      WorkDir{env}.CorpusFilePaths().AllShardsGlob(), sharded_corpus_files));
   ExportCorpus(sharded_corpus_files, dir);
 }
 
@@ -161,7 +159,7 @@
   // If the destination `workdir` is specified (note that empty means "use the
   // current directory"), we might need to create it.
   if (!env.workdir.empty()) {
-    CHECK_OK(RemoteMkdir(env.workdir));
+    FUZZTEST_CHECK_OK(RemoteMkdir(env.workdir));
   }
 
   // Iterate over all shards, adding inputs to the current shard.
@@ -184,23 +182,23 @@
     }
     // Add inputs to the current shard, if the shard doesn't have them already.
     auto appender = DefaultBlobFileWriterFactory(env.riegeli);
-    CHECK_OK(appender->Open(corpus_file_path, "a"))
+    FUZZTEST_CHECK_OK(appender->Open(corpus_file_path, "a"))
         << "Failed to open corpus file: " << corpus_file_path;
     ByteArray shard_data;
     for (const auto &path : sharded_paths[shard]) {
       std::string input;
-      CHECK_OK(RemoteFileGetContents(path, input));
+      FUZZTEST_CHECK_OK(RemoteFileGetContents(path, input));
       if (input.empty() || existing_hashes.contains(Hash(input))) {
         ++inputs_ignored;
         continue;
       }
-      CHECK_OK(appender->Write(ByteArray{input.begin(), input.end()}));
+      FUZZTEST_CHECK_OK(appender->Write(ByteArray{input.begin(), input.end()}));
       ++inputs_added;
     }
-    LOG(INFO) << VV(shard) << VV(inputs_added) << VV(inputs_ignored)
-              << VV(num_shard_bytes) << VV(shard_data.size());
+    FUZZTEST_LOG(INFO) << VV(shard) << VV(inputs_added) << VV(inputs_ignored)
+                       << VV(num_shard_bytes) << VV(shard_data.size());
   }
-  CHECK_EQ(total_paths, inputs_added + inputs_ignored);
+  FUZZTEST_CHECK_EQ(total_paths, inputs_added + inputs_ignored);
 }
 
 absl::Status Centipede::CrashesToFiles(const Environment &env,
@@ -228,7 +226,7 @@
           (std::filesystem::path{dir} / absl::StrCat(id, ".data")).string()));
       const auto shard_index = wd.CrashReproducerDirPaths().GetShardIndex(
           std::filesystem::path{reproducer_path}.parent_path().string());
-      CHECK(shard_index.has_value());
+      FUZZTEST_CHECK(shard_index.has_value());
       const auto metadata_dir = wd.CrashMetadataDirPaths().Shard(*shard_index);
       const auto description_filename = absl::StrCat(id, ".desc");
       const auto signature_filename = absl::StrCat(id, ".sig");
@@ -339,7 +337,7 @@
   os << " exec/s: "
      << (execs_per_sec < 1.0 ? execs_per_sec : std::round(execs_per_sec));
   os << " mb: " << (rusage_memory.mem_rss >> 20);
-  LOG(INFO) << os.str();
+  FUZZTEST_LOG(INFO) << os.str();
 }
 
 void Centipede::LogFeaturesAsSymbols(const FeatureVec &fv) {
@@ -349,7 +347,7 @@
     PCIndex pc_index = ConvertPCFeatureToPcIndex(feature);
     auto description = coverage_logger_.ObserveAndDescribeIfNew(pc_index);
     if (description.empty()) continue;
-    LOG(INFO) << description;
+    FUZZTEST_LOG(INFO) << description;
   }
 }
 
@@ -417,7 +415,7 @@
     BlobFileWriter *absl_nullable unconditional_features_file) {
   BatchResult batch_result;
   bool success = ExecuteAndReportCrash(env_.binary, input_vec, batch_result);
-  CHECK_EQ(input_vec.size(), batch_result.results().size());
+  FUZZTEST_CHECK_EQ(input_vec.size(), batch_result.results().size());
 
   for (const auto &extra_binary : env_.extra_binaries) {
     if (ShouldStop()) break;
@@ -428,11 +426,11 @@
   }
   if (EarlyStopRequested()) return false;
   if (!success && env_.exit_on_crash) {
-    LOG(INFO) << "--exit_on_crash is enabled; exiting soon";
+    FUZZTEST_LOG(INFO) << "--exit_on_crash is enabled; exiting soon";
     RequestEarlyStop(EXIT_FAILURE);
     return false;
   }
-  CHECK_EQ(batch_result.results().size(), input_vec.size());
+  FUZZTEST_CHECK_EQ(batch_result.results().size(), input_vec.size());
   num_runs_ += input_vec.size();
   bool batch_gained_new_coverage = false;
   for (size_t i = 0; i < input_vec.size(); i++) {
@@ -443,7 +441,7 @@
     if (env_.use_pcpair_features && AddPcPairFeatures(fv) != 0)
       input_gained_new_coverage = true;
     if (unconditional_features_file != nullptr) {
-      CHECK_OK(unconditional_features_file->Write(
+      FUZZTEST_CHECK_OK(unconditional_features_file->Write(
           PackFeaturesAndHash(input_vec[i], fv)));
     }
     if (input_gained_new_coverage) {
@@ -452,19 +450,20 @@
       fs_.IncrementFrequencies(fv);
       LogFeaturesAsSymbols(fv);
       batch_gained_new_coverage = true;
-      CHECK_GT(fv.size(), 0UL);
+      FUZZTEST_CHECK_GT(fv.size(), 0UL);
       if (function_filter_passed) {
         corpus_.Add(input_vec[i], fv, batch_result.results()[i].metadata(), fs_,
                     coverage_frontier_);
       }
       if (corpus_file != nullptr) {
-        CHECK_OK(corpus_file->Write(input_vec[i]));
+        FUZZTEST_CHECK_OK(corpus_file->Write(input_vec[i]));
       }
       if (!env_.corpus_dir.empty() && !env_.corpus_dir[0].empty()) {
         WriteToLocalHashedFileInDir(env_.corpus_dir[0], input_vec[i]);
       }
       if (features_file != nullptr) {
-        CHECK_OK(features_file->Write(PackFeaturesAndHash(input_vec[i], fv)));
+        FUZZTEST_CHECK_OK(
+            features_file->Write(PackFeaturesAndHash(input_vec[i], fv)));
       }
     }
   }
@@ -474,8 +473,8 @@
 // TODO(kcc): [impl] don't reread the same corpus twice.
 void Centipede::LoadShard(const Environment &load_env, size_t shard_index,
                           bool rerun) {
-  VLOG(1) << "Loading shard " << shard_index
-          << (rerun ? " with rerunning" : " without rerunning");
+  FUZZTEST_VLOG(1) << "Loading shard " << shard_index
+                   << (rerun ? " with rerunning" : " without rerunning");
   size_t num_added_inputs = 0;
   size_t num_skipped_inputs = 0;
   std::vector<ByteArray> inputs_to_rerun;
@@ -491,14 +490,14 @@
       const auto num_new_features =
           fs_.PruneFeaturesAndCountUnseen(input_features);
       if (num_new_features != 0) {
-        VLOG(10) << "Adding input " << Hash(input)
-                 << "; new features: " << num_new_features;
+        FUZZTEST_VLOG(10) << "Adding input " << Hash(input)
+                          << "; new features: " << num_new_features;
         fs_.IncrementFrequencies(input_features);
         // TODO(kcc): cmp_args are currently not saved to disk and not reloaded.
         corpus_.Add(input, input_features, {}, fs_, coverage_frontier_);
         ++num_added_inputs;
       } else {
-        VLOG(10) << "Skipping input: " << Hash(input);
+        FUZZTEST_VLOG(10) << "Skipping input: " << Hash(input);
         ++num_skipped_inputs;
       }
     }
@@ -517,8 +516,9 @@
     ReadShard(corpus_path, features_path, input_features_callback);
   }
 
-  VLOG(1) << "Loaded shard " << shard_index << ": added " << num_added_inputs
-          << " / skipped " << num_skipped_inputs << " inputs";
+  FUZZTEST_VLOG(1) << "Loaded shard " << shard_index << ": added "
+                   << num_added_inputs << " / skipped " << num_skipped_inputs
+                   << " inputs";
 
   if (num_added_inputs > 0) UpdateAndMaybeLogStats("load-shard", 1);
   if (!inputs_to_rerun.empty()) Rerun(inputs_to_rerun);
@@ -536,7 +536,8 @@
   for (size_t shard_idx : shard_idxs) {
     const bool rerun = rerun_my_shard && shard_idx == env_.my_shard_index;
     LoadShard(load_env, shard_idx, rerun);
-    LOG_IF(INFO, (++num_shards_loaded % 100) == 0) << VV(num_shards_loaded);
+    FUZZTEST_LOG_IF(INFO, (++num_shards_loaded % 100) == 0)
+        << VV(num_shards_loaded);
   }
 }
 
@@ -544,9 +545,9 @@
   if (to_rerun.empty()) return;
   auto features_file_path = wd_.FeaturesFilePaths().Shard(env_.my_shard_index);
   auto features_file = DefaultBlobFileWriterFactory(env_.riegeli);
-  CHECK_OK(features_file->Open(features_file_path, "a"));
+  FUZZTEST_CHECK_OK(features_file->Open(features_file_path, "a"));
 
-  LOG(INFO) << to_rerun.size() << " inputs to rerun";
+  FUZZTEST_LOG(INFO) << to_rerun.size() << " inputs to rerun";
   // Re-run all inputs for which we don't know their features.
   // Run in batches of at most env_.batch_size inputs each.
   while (!to_rerun.empty()) {
@@ -565,8 +566,8 @@
   if (pc_table_.empty()) return;
 
   auto coverage_path = wd_.CoverageReportPath(filename_annotation);
-  LOG(INFO) << "Generate coverage report [" << description << "]; "
-            << VV(coverage_path);
+  FUZZTEST_LOG(INFO) << "Generate coverage report [" << description << "]; "
+                     << VV(coverage_path);
   auto pci_vec = fs_.ToCoveragePCs();
   Coverage coverage(pc_table_, pci_vec);
   coverage.DumpReportToFile(symbols_, coverage_path, description);
@@ -575,8 +576,8 @@
 void Centipede::GenerateCorpusStats(std::string_view filename_annotation,
                                     std::string_view description) {
   auto stats_path = wd_.CorpusStatsPath(filename_annotation);
-  LOG(INFO) << "Generate corpus stats [" << description << "]; "
-            << VV(stats_path);
+  FUZZTEST_LOG(INFO) << "Generate corpus stats [" << description << "]; "
+                     << VV(stats_path);
   corpus_.DumpStatsToFile(fs_, stats_path, description);
 }
 
@@ -586,14 +587,14 @@
   if (env_.clang_coverage_binary.empty()) return;
 
   auto report_path = wd_.SourceBasedCoverageReportPath(filename_annotation);
-  LOG(INFO) << "Generate source based coverage report [" << description << "]; "
-            << VV(report_path);
-  CHECK_OK(RemoteMkdir(report_path));
+  FUZZTEST_LOG(INFO) << "Generate source based coverage report [" << description
+                     << "]; " << VV(report_path);
+  FUZZTEST_CHECK_OK(RemoteMkdir(report_path));
 
   std::vector<std::string> raw_profiles = wd_.EnumerateRawCoverageProfiles();
 
   if (raw_profiles.empty()) {
-    LOG(ERROR) << "No raw profiles found for coverage report";
+    FUZZTEST_LOG(ERROR) << "No raw profiles found for coverage report";
     return;
   }
 
@@ -610,7 +611,7 @@
   merge_cmd_options.args = std::move(merge_arguments);
   Command merge_command{"llvm-profdata", std::move(merge_cmd_options)};
   if (merge_command.Execute() != EXIT_SUCCESS) {
-    LOG(ERROR) << "Failed to run command " << merge_command.ToString();
+    FUZZTEST_LOG(ERROR) << "Failed to run command " << merge_command.ToString();
     return;
   }
 
@@ -622,8 +623,8 @@
   Command generate_report_command{"llvm-cov",
                                   std::move(generate_report_cmd_options)};
   if (generate_report_command.Execute() != EXIT_SUCCESS) {
-    LOG(ERROR) << "Failed to run command "
-               << generate_report_command.ToString();
+    FUZZTEST_LOG(ERROR) << "Failed to run command "
+                        << generate_report_command.ToString();
     return;
   }
 }
@@ -634,15 +635,16 @@
    public:
     explicit ReportDumper(std::string_view path)
         : file_{*RemoteFileOpen(path, "w")} {
-      CHECK(file_ != nullptr) << VV(path);
-      CHECK_OK(RemoteFileSetWriteBufferSize(file_, 10UL * 1024 * 1024));
+      FUZZTEST_CHECK(file_ != nullptr) << VV(path);
+      FUZZTEST_CHECK_OK(
+          RemoteFileSetWriteBufferSize(file_, 10UL * 1024 * 1024));
     }
 
-    ~ReportDumper() override { CHECK_OK(RemoteFileClose(file_)); }
+    ~ReportDumper() override { FUZZTEST_CHECK_OK(RemoteFileClose(file_)); }
 
     ReportDumper &operator<<(std::string_view fragment) override {
-      CHECK_OK(RemoteFileAppend(file_,
-                                ByteArray{fragment.cbegin(), fragment.cend()}));
+      FUZZTEST_CHECK_OK(RemoteFileAppend(
+          file_, ByteArray{fragment.cbegin(), fragment.cend()}));
       return *this;
     }
 
@@ -652,10 +654,11 @@
 
   const auto &snapshot = rusage_profiler_.TakeSnapshot(
       {__FILE__, __LINE__}, std::string{description});
-  VLOG(1) << "Rusage @ " << description << ": " << snapshot.ShortMetricsStr();
+  FUZZTEST_VLOG(1) << "Rusage @ " << description << ": "
+                   << snapshot.ShortMetricsStr();
   auto path = wd_.RUsageReportPath(filename_annotation);
-  LOG(INFO) << "Generate rusage report [" << description << "]; "
-            << VV(env_.my_shard_index) << VV(path);
+  FUZZTEST_LOG(INFO) << "Generate rusage report [" << description << "]; "
+                     << VV(env_.my_shard_index) << VV(path);
   ReportDumper dumper{path};
   rusage_profiler_.GenerateReport(&dumper);
 }
@@ -682,22 +685,23 @@
 
 void Centipede::MergeFromOtherCorpus(std::string_view merge_from_dir,
                                      size_t shard_index_to_merge) {
-  LOG(INFO) << __func__ << ": " << merge_from_dir;
+  FUZZTEST_LOG(INFO) << __func__ << ": " << merge_from_dir;
   Environment merge_from_env = env_;
   merge_from_env.workdir = merge_from_dir;
   size_t initial_corpus_size = corpus_.NumActive();
   LoadShard(merge_from_env, shard_index_to_merge, /*rerun=*/true);
   size_t new_corpus_size = corpus_.NumActive();
-  CHECK_GE(new_corpus_size, initial_corpus_size);  // Corpus can't shrink here.
+  FUZZTEST_CHECK_GE(new_corpus_size,
+                    initial_corpus_size);  // Corpus can't shrink here.
   if (new_corpus_size > initial_corpus_size) {
     auto appender = DefaultBlobFileWriterFactory(env_.riegeli);
-    CHECK_OK(
+    FUZZTEST_CHECK_OK(
         appender->Open(wd_.CorpusFilePaths().Shard(env_.my_shard_index), "a"));
     for (size_t idx = initial_corpus_size; idx < new_corpus_size; ++idx) {
-      CHECK_OK(appender->Write(corpus_.Get(idx)));
+      FUZZTEST_CHECK_OK(appender->Write(corpus_.Get(idx)));
     }
-    LOG(INFO) << "Merge: " << (new_corpus_size - initial_corpus_size)
-              << " new inputs added";
+    FUZZTEST_LOG(INFO) << "Merge: " << (new_corpus_size - initial_corpus_size)
+                       << " new inputs added";
   }
 }
 
@@ -712,16 +716,16 @@
   // Save the distilled corpus to a file in workdir and possibly to a hashed
   // file in the first corpus dir passed in `--corpus_dir`.
   const auto distill_to_path = wd_.DistilledCorpusFilePaths().MyShard();
-  LOG(INFO) << "Distilling: shard: " << env_.my_shard_index
-            << " output: " << distill_to_path << " "
-            << " distilled size: " << corpus_.NumActive();
+  FUZZTEST_LOG(INFO) << "Distilling: shard: " << env_.my_shard_index
+                     << " output: " << distill_to_path << " "
+                     << " distilled size: " << corpus_.NumActive();
   const auto appender = DefaultBlobFileWriterFactory(env_.riegeli);
   // NOTE: Always overwrite distilled corpus files -- never append, unlike
   // "regular", per-shard corpus files.
-  CHECK_OK(appender->Open(distill_to_path, "w"));
+  FUZZTEST_CHECK_OK(appender->Open(distill_to_path, "w"));
   for (size_t i = 0; i < corpus_.NumActive(); ++i) {
     const ByteArray &input = corpus_.Get(i);
-    CHECK_OK(appender->Write(input));
+    FUZZTEST_CHECK_OK(appender->Write(input));
     if (!env_.corpus_dir.empty() && !env_.corpus_dir[0].empty()) {
       WriteToLocalHashedFileInDir(env_.corpus_dir[0], input);
     }
@@ -734,21 +738,22 @@
   const size_t num_seeds_available =
       user_callbacks_.GetSeeds(env_.batch_size, seed_inputs);
   if (num_seeds_available > env_.batch_size) {
-    LOG(WARNING) << "More seeds available than requested: "
-                 << num_seeds_available << " > " << env_.batch_size;
+    FUZZTEST_LOG(WARNING) << "More seeds available than requested: "
+                          << num_seeds_available << " > " << env_.batch_size;
   }
   if (seed_inputs.empty()) {
-    QCHECK(!env_.require_seeds)
+    FUZZTEST_QCHECK(!env_.require_seeds)
         << "No seeds returned and --require_seeds=true, exiting early.";
-    LOG(WARNING)
+    FUZZTEST_LOG(WARNING)
         << "No seeds returned - will use the default seed of single byte {0}";
     seed_inputs.push_back({0});
   }
 
   RunBatch(seed_inputs, corpus_file, features_file,
            /*unconditional_features_file=*/nullptr);
-  LOG(INFO) << "Number of input seeds available: " << num_seeds_available
-            << ", number included in corpus: " << corpus_.NumTotal();
+  FUZZTEST_LOG(INFO) << "Number of input seeds available: "
+                     << num_seeds_available
+                     << ", number included in corpus: " << corpus_.NumTotal();
 
   // Forcely add all seed inputs to avoid empty corpus if none of them increased
   // coverage and passed the filters.
@@ -759,9 +764,10 @@
 }
 
 void Centipede::FuzzingLoop() {
-  LOG(INFO) << "Shard: " << env_.my_shard_index << "/" << env_.total_shards
-            << " " << TemporaryLocalDirPath() << " "
-            << "seed: " << env_.seed << "\n\n\n";
+  FUZZTEST_LOG(INFO) << "Shard: " << env_.my_shard_index << "/"
+                     << env_.total_shards << " " << TemporaryLocalDirPath()
+                     << " "
+                     << "seed: " << env_.seed << "\n\n\n";
 
   UpdateAndMaybeLogStats("begin-fuzz", 0);
 
@@ -780,10 +786,10 @@
 
   auto corpus_path = wd_.CorpusFilePaths().Shard(env_.my_shard_index);
   auto corpus_file = DefaultBlobFileWriterFactory(env_.riegeli);
-  CHECK_OK(corpus_file->Open(corpus_path, "a"));
+  FUZZTEST_CHECK_OK(corpus_file->Open(corpus_path, "a"));
   auto features_path = wd_.FeaturesFilePaths().Shard(env_.my_shard_index);
   auto features_file = DefaultBlobFileWriterFactory(env_.riegeli);
-  CHECK_OK(features_file->Open(features_path, "a"));
+  FUZZTEST_CHECK_OK(features_file->Open(features_path, "a"));
 
   LoadSeedInputs(corpus_file.get(), features_file.get());
 
@@ -809,7 +815,7 @@
   size_t corpus_size_at_last_prune = corpus_.NumActive();
   for (size_t batch_index = 0; batch_index < number_of_batches; batch_index++) {
     if (ShouldStop()) break;
-    CHECK_LT(new_runs, env_.num_runs);
+    FUZZTEST_CHECK_LT(new_runs, env_.num_runs);
     auto remaining_runs = env_.num_runs - new_runs;
     auto batch_size = std::min(env_.batch_size, remaining_runs);
     std::vector<MutationInputRef> mutation_inputs;
@@ -846,7 +852,7 @@
       size_t rand = rng_() % (env_.total_shards - 1);
       size_t other_shard_index =
           (env_.my_shard_index + 1 + rand) % env_.total_shards;
-      CHECK_NE(other_shard_index, env_.my_shard_index);
+      FUZZTEST_CHECK_NE(other_shard_index, env_.my_shard_index);
       LoadShard(env_, other_shard_index, /*rerun=*/false);
     }
 
@@ -870,49 +876,49 @@
 void Centipede::ReportCrash(std::string_view binary,
                             const std::vector<ByteArray> &input_vec,
                             const BatchResult &batch_result) {
-  CHECK_EQ(input_vec.size(), batch_result.results().size());
+  FUZZTEST_CHECK_EQ(input_vec.size(), batch_result.results().size());
 
   const size_t suspect_input_idx = std::clamp<size_t>(
       batch_result.num_outputs_read(), 0, input_vec.size() - 1);
   auto log_execution_failure = [&](std::string_view log_prefix) {
-    LOG(INFO) << log_prefix << "Batch execution failed:"
-              << "\nBinary               : " << binary
-              << "\nExit code            : " << batch_result.exit_code()
-              << "\nFailure              : "
-              << batch_result.failure_description()
-              << "\nSignature            : "
-              << AsPrintableString(AsByteSpan(batch_result.failure_signature()),
-                                   /*max_len=*/32)
-              << "\nNumber of inputs     : " << input_vec.size()
-              << "\nNumber of inputs read: " << batch_result.num_outputs_read()
-              << (batch_result.IsSetupFailure()
-                      ? ""
-                      : absl::StrCat("\nSuspect input index  : ",
-                                     suspect_input_idx))
-              << "\nCrash log            :\n\n";
+    FUZZTEST_LOG(INFO)
+        << log_prefix << "Batch execution failed:"
+        << "\nBinary               : " << binary
+        << "\nExit code            : " << batch_result.exit_code()
+        << "\nFailure              : " << batch_result.failure_description()
+        << "\nSignature            : "
+        << AsPrintableString(AsByteSpan(batch_result.failure_signature()),
+                             /*max_len=*/32)
+        << "\nNumber of inputs     : " << input_vec.size()
+        << "\nNumber of inputs read: " << batch_result.num_outputs_read()
+        << (batch_result.IsSetupFailure()
+                ? ""
+                : absl::StrCat("\nSuspect input index  : ", suspect_input_idx))
+        << "\nCrash log            :\n\n";
     for (const auto &log_line :
          absl::StrSplit(absl::StripAsciiWhitespace(batch_result.log()), '\n')) {
-      LOG(INFO).NoPrefix() << "CRASH LOG: " << log_line;
+      FUZZTEST_LOG(INFO).NoPrefix() << "CRASH LOG: " << log_line;
     }
-    LOG(INFO).NoPrefix() << "\n";
+    FUZZTEST_LOG(INFO).NoPrefix() << "\n";
   };
 
   if (batch_result.IsIgnoredFailure()) {
-    LOG(INFO) << "Skip further processing of "
-              << batch_result.failure_description();
+    FUZZTEST_LOG(INFO) << "Skip further processing of "
+                       << batch_result.failure_description();
     return;
   }
 
   if (batch_result.IsSkippedTest()) {
     log_execution_failure("Skipped Test: ");
-    LOG(INFO) << "Requesting early stop due to skipped test.";
+    FUZZTEST_LOG(INFO) << "Requesting early stop due to skipped test.";
     RequestEarlyStop(EXIT_SUCCESS);
     return;
   }
 
   if (batch_result.IsSetupFailure()) {
     log_execution_failure("Test Setup Failure: ");
-    LOG(INFO) << "Requesting early stop due to setup failure in the test.";
+    FUZZTEST_LOG(INFO)
+        << "Requesting early stop due to setup failure in the test.";
     RequestEarlyStop(EXIT_FAILURE);
     return;
   }
@@ -927,14 +933,15 @@
       absl::StrCat("ReportCrash[", num_crashes_, "]: ");
   log_execution_failure(log_prefix);
 
-  LOG_IF(INFO, num_crashes_ == env_.max_num_crash_reports)
+  FUZZTEST_LOG_IF(INFO, num_crashes_ == env_.max_num_crash_reports)
       << log_prefix
       << "Reached --max_num_crash_reports: further reports will be suppressed";
 
   if (batch_result.failure_description() == kExecutionFailurePerBatchTimeout) {
-    LOG(INFO) << log_prefix
-              << "Failure applies to entire batch: not executing inputs "
-                 "one-by-one, trying to find the reproducer";
+    FUZZTEST_LOG(INFO)
+        << log_prefix
+        << "Failure applies to entire batch: not executing inputs "
+           "one-by-one, trying to find the reproducer";
     return;
   }
 
@@ -952,14 +959,15 @@
     // primed for a crash by the sequence of inputs that preceded the crasher.
     std::iota(input_idxs_to_try.begin() + 1, input_idxs_to_try.end(), 0);
   } else {
-    LOG(INFO)
+    FUZZTEST_LOG(INFO)
         << log_prefix
         << "Skip finding the reproducer from the inputs other than the suspect";
   }
 
   // Try inputs one-by-one in the determined order.
-  LOG(INFO) << log_prefix
-            << "Executing inputs one-by-one, trying to find the reproducer";
+  FUZZTEST_LOG(INFO)
+      << log_prefix
+      << "Executing inputs one-by-one, trying to find the reproducer";
   for (auto input_idx : input_idxs_to_try) {
     if (ShouldStop()) return;
     const auto &one_input = input_vec[input_idx];
@@ -967,38 +975,38 @@
     if (!user_callbacks_.Execute(binary, {one_input}, one_input_batch_result)) {
       auto hash = Hash(one_input);
       auto crash_dir = wd_.CrashReproducerDirPaths().MyShard();
-      CHECK_OK(RemoteMkdir(crash_dir));
+      FUZZTEST_CHECK_OK(RemoteMkdir(crash_dir));
       std::string input_file_path = std::filesystem::path(crash_dir) / hash;
       auto crash_metadata_dir = wd_.CrashMetadataDirPaths().MyShard();
-      CHECK_OK(RemoteMkdir(crash_metadata_dir));
+      FUZZTEST_CHECK_OK(RemoteMkdir(crash_metadata_dir));
       std::string crash_metadata_path_prefix =
           std::filesystem::path(crash_metadata_dir) / hash;
-      LOG(INFO) << log_prefix << "Detected crash-reproducing input:"
-                << "\nInput index    : " << input_idx << "\nInput bytes    : "
-                << AsPrintableString(one_input, /*max_len=*/32)
-                << "\nExit code      : " << one_input_batch_result.exit_code()
-                << "\nFailure        : "
-                << one_input_batch_result.failure_description()
-                << "\nSignature      : "
-                << AsPrintableString(
-                       AsByteSpan(one_input_batch_result.failure_signature()),
-                       /*max_len=*/32)
-                << "\nSaving input to: " << input_file_path
-                << "\nSaving crash"  //
-                << "\nmetadata to    : " << crash_metadata_path_prefix << ".*";
-      CHECK_OK(RemoteFileSetContents(input_file_path, one_input));
-      CHECK_OK(RemoteFileSetContents(
+      FUZZTEST_LOG(INFO)
+          << log_prefix << "Detected crash-reproducing input:"
+          << "\nInput index    : " << input_idx << "\nInput bytes    : "
+          << AsPrintableString(one_input, /*max_len=*/32)
+          << "\nExit code      : " << one_input_batch_result.exit_code()
+          << "\nFailure        : "
+          << one_input_batch_result.failure_description()
+          << "\nSignature      : "
+          << AsPrintableString(
+                 AsByteSpan(one_input_batch_result.failure_signature()),
+                 /*max_len=*/32)
+          << "\nSaving input to: " << input_file_path << "\nSaving crash"  //
+          << "\nmetadata to    : " << crash_metadata_path_prefix << ".*";
+      FUZZTEST_CHECK_OK(RemoteFileSetContents(input_file_path, one_input));
+      FUZZTEST_CHECK_OK(RemoteFileSetContents(
           absl::StrCat(crash_metadata_path_prefix, ".desc"),
           one_input_batch_result.failure_description()));
-      CHECK_OK(RemoteFileSetContents(
+      FUZZTEST_CHECK_OK(RemoteFileSetContents(
           absl::StrCat(crash_metadata_path_prefix, ".sig"),
           one_input_batch_result.failure_signature()));
       return;
     }
   }
 
-  LOG(INFO) << log_prefix
-            << "Crash was not observed when running inputs one-by-one";
+  FUZZTEST_LOG(INFO) << log_prefix
+                     << "Crash was not observed when running inputs one-by-one";
 
   // There will be cases when several inputs collectively cause a crash, but no
   // single input does. Handle this by writing out the inputs from the batch
@@ -1011,27 +1019,28 @@
   const auto &suspect_input = input_vec[suspect_input_idx];
   auto suspect_hash = Hash(suspect_input);
   auto crash_dir = wd_.CrashReproducerDirPaths().MyShard();
-  CHECK_OK(RemoteMkdir(crash_dir));
+  FUZZTEST_CHECK_OK(RemoteMkdir(crash_dir));
   std::string crashing_batch_name =
       absl::StrCat("crashing_batch-", suspect_hash);
   std::string save_dir = std::filesystem::path(crash_dir) / crashing_batch_name;
-  CHECK_OK(RemoteMkdir(save_dir));
-  LOG(INFO) << log_prefix << "Saving used inputs from batch to: " << save_dir;
+  FUZZTEST_CHECK_OK(RemoteMkdir(save_dir));
+  FUZZTEST_LOG(INFO) << log_prefix
+                     << "Saving used inputs from batch to: " << save_dir;
   for (int i = 0; i <= suspect_input_idx; ++i) {
     const auto &one_input = input_vec[i];
     auto hash = Hash(one_input);
     std::string file_path = std::filesystem::path(save_dir).append(
         absl::StrFormat("input-%010d-%s", i, hash));
-    CHECK_OK(RemoteFileSetContents(file_path, one_input));
+    FUZZTEST_CHECK_OK(RemoteFileSetContents(file_path, one_input));
   }
   auto crash_metadata_dir = wd_.CrashMetadataDirPaths().MyShard();
-  CHECK_OK(RemoteMkdir(crash_metadata_dir));
+  FUZZTEST_CHECK_OK(RemoteMkdir(crash_metadata_dir));
   std::string crash_metadata_file_path =
       std::filesystem::path(crash_metadata_dir) / crashing_batch_name;
-  LOG(INFO) << log_prefix
-            << "Saving crash metadata to: " << crash_metadata_file_path;
-  CHECK_OK(RemoteFileSetContents(crash_metadata_file_path,
-                                 batch_result.failure_description()));
+  FUZZTEST_LOG(INFO) << log_prefix << "Saving crash metadata to: "
+                     << crash_metadata_file_path;
+  FUZZTEST_CHECK_OK(RemoteFileSetContents(crash_metadata_file_path,
+                                          batch_result.failure_description()));
 }
 
 }  // namespace fuzztest::internal
diff --git a/centipede/centipede_callbacks.cc b/centipede/centipede_callbacks.cc
index 8a2ec0c..5b010b4 100644
--- a/centipede/centipede_callbacks.cc
+++ b/centipede/centipede_callbacks.cc
@@ -24,8 +24,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/ascii.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_join.h"
@@ -81,17 +79,18 @@
   // Check the PC table.
   if (binary_info.pc_table.empty()) {
     if (env_.require_pc_table) {
-      LOG(ERROR) << "Could not get PC table; exiting (override with "
-                    "--require_pc_table=false)";
+      FUZZTEST_LOG(ERROR) << "Could not get PC table; exiting (override with "
+                             "--require_pc_table=false)";
       exit(EXIT_FAILURE);
     }
-    LOG(WARNING) << "Could not get PC table; CF table and debug symbols will "
-                    "not be used";
+    FUZZTEST_LOG(WARNING)
+        << "Could not get PC table; CF table and debug symbols will "
+           "not be used";
     return;
   }
   // Check CF table.
   if (binary_info.cf_table.empty()) {
-    LOG(WARNING)
+    FUZZTEST_LOG(WARNING)
         << "Could not get CF table; binary should be built with Clang 16 (or "
            "later) and with -fsanitize-coverage=control-flow flag";
   } else {
@@ -197,7 +196,7 @@
   size_t num_inputs_written = 0;
 
   if (env_.has_input_wildcards) {
-    CHECK_EQ(inputs.size(), 1);
+    FUZZTEST_CHECK_EQ(inputs.size(), 1);
     WriteToLocalFile(temp_input_file_path_, inputs[0]);
     num_inputs_written = 1;
   } else {
@@ -206,9 +205,9 @@
   }
 
   if (num_inputs_written != inputs.size()) {
-    LOG(INFO) << "Wrote " << num_inputs_written << "/" << inputs.size()
-              << " inputs; shmem_size_mb might be too small: "
-              << env_.shmem_size_mb;
+    FUZZTEST_LOG(INFO) << "Wrote " << num_inputs_written << "/" << inputs.size()
+                       << " inputs; shmem_size_mb might be too small: "
+                       << env_.shmem_size_mb;
   }
 
   // Run.
@@ -219,7 +218,7 @@
   // Get results.
   batch_result.exit_code() = retval;
   const bool read_success = batch_result.Read(outputs_blobseq_);
-  LOG_IF(ERROR, !read_success) << "Failed to read batch result!";
+  FUZZTEST_LOG_IF(ERROR, !read_success) << "Failed to read batch result!";
   outputs_blobseq_.ReleaseSharedMemory();  // Outputs are already consumed.
 
   // We may have fewer feature blobs than inputs if
@@ -231,10 +230,10 @@
   //   * Logged by the following code.
   if (retval == 0 && read_success &&
       batch_result.num_outputs_read() != num_inputs_written) {
-    LOG(INFO) << "Read " << batch_result.num_outputs_read() << "/"
-              << num_inputs_written
-              << " outputs; shmem_size_mb might be too small: "
-              << env_.shmem_size_mb;
+    FUZZTEST_LOG(INFO) << "Read " << batch_result.num_outputs_read() << "/"
+                       << num_inputs_written
+                       << " outputs; shmem_size_mb might be too small: "
+                       << env_.shmem_size_mb;
   }
 
   if (env_.print_runner_log) PrintExecutionLog();
@@ -256,7 +255,7 @@
     std::filesystem::remove(failure_description_path_);
     std::filesystem::remove(failure_signature_path_);
   }
-  VLOG(1) << __FUNCTION__ << " took " << (absl::Now() - start_time);
+  FUZZTEST_VLOG(1) << __FUNCTION__ << " took " << (absl::Now() - start_time);
   return retval;
 }
 
@@ -266,8 +265,8 @@
     std::vector<ByteArray> &seeds) {
   const auto output_dir = std::filesystem::path{temp_dir_} / "seed_inputs";
   std::error_code error;
-  CHECK(std::filesystem::create_directories(output_dir, error));
-  CHECK(!error);
+  FUZZTEST_CHECK(std::filesystem::create_directories(output_dir, error));
+  FUZZTEST_CHECK(!error);
 
   std::string centipede_runner_flags = absl::StrCat(
       "CENTIPEDE_RUNNER_FLAGS=:dump_seed_inputs:test=", env_.test_name,
@@ -286,7 +285,8 @@
   const int retval = cmd.Execute();
 
   if (env_.print_runner_log) {
-    LOG(INFO) << "Getting seeds via external binary returns " << retval;
+    FUZZTEST_LOG(INFO) << "Getting seeds via external binary returns "
+                       << retval;
     PrintExecutionLog();
   }
 
@@ -344,7 +344,7 @@
   }
   std::error_code error;
   std::filesystem::remove(config_file_path, error);
-  CHECK(!error);
+  FUZZTEST_CHECK(!error);
 
   return is_success;
 }
@@ -353,7 +353,7 @@
 MutationResult CentipedeCallbacks::MutateViaExternalBinary(
     std::string_view binary, const std::vector<MutationInputRef> &inputs,
     size_t num_mutants) {
-  CHECK(!env_.has_input_wildcards)
+  FUZZTEST_CHECK(!env_.has_input_wildcards)
       << "Standalone binary does not support custom mutator";
 
   auto start_time = absl::Now();
@@ -362,7 +362,7 @@
 
   size_t num_inputs_written =
       RequestMutation(num_mutants, inputs, inputs_blobseq_);
-  LOG_IF(INFO, num_inputs_written != inputs.size())
+  FUZZTEST_LOG_IF(INFO, num_inputs_written != inputs.size())
       << VV(num_inputs_written) << VV(inputs.size());
 
   // Execute.
@@ -371,7 +371,7 @@
   inputs_blobseq_.ReleaseSharedMemory();  // Inputs are already consumed.
 
   if (retval != EXIT_SUCCESS) {
-    LOG(WARNING) << "Custom mutator failed with exit code: " << retval;
+    FUZZTEST_LOG(WARNING) << "Custom mutator failed with exit code: " << retval;
   }
   if (env_.print_runner_log || retval != EXIT_SUCCESS) {
     PrintExecutionLog();
@@ -382,7 +382,7 @@
   result.Read(num_mutants, outputs_blobseq_);
   outputs_blobseq_.ReleaseSharedMemory();  // Outputs are already consumed.
 
-  VLOG(1) << __FUNCTION__ << " took " << (absl::Now() - start_time);
+  FUZZTEST_VLOG(1) << __FUNCTION__ << " took " << (absl::Now() - start_time);
   return result;
 }
 
@@ -398,43 +398,44 @@
     env_.use_legacy_default_mutator
         ? byte_array_mutator_.AddToDictionary(entries)
         : fuzztest_mutator_.AddToDictionary(entries);
-    LOG(INFO) << "Loaded " << entries.size()
-              << " dictionary entries from AFL/libFuzzer dictionary "
-              << dictionary_path;
+    FUZZTEST_LOG(INFO) << "Loaded " << entries.size()
+                       << " dictionary entries from AFL/libFuzzer dictionary "
+                       << dictionary_path;
     return entries.size();
   }
   // Didn't parse as plain text. Assume encoded corpus format.
   auto reader = DefaultBlobFileReaderFactory();
-  CHECK_OK(reader->Open(dictionary_path))
+  FUZZTEST_CHECK_OK(reader->Open(dictionary_path))
       << "Error in opening dictionary file: " << dictionary_path;
   std::vector<ByteArray> unpacked_dictionary;
   ByteSpan blob;
   while (reader->Read(blob).ok()) {
     unpacked_dictionary.emplace_back(blob.begin(), blob.end());
   }
-  CHECK_OK(reader->Close())
+  FUZZTEST_CHECK_OK(reader->Close())
       << "Error in closing dictionary file: " << dictionary_path;
-  CHECK(!unpacked_dictionary.empty())
+  FUZZTEST_CHECK(!unpacked_dictionary.empty())
       << "Empty or corrupt dictionary file: " << dictionary_path;
   env_.use_legacy_default_mutator
       ? byte_array_mutator_.AddToDictionary(unpacked_dictionary)
       : fuzztest_mutator_.AddToDictionary(unpacked_dictionary);
-  LOG(INFO) << "Loaded " << unpacked_dictionary.size()
-            << " dictionary entries from " << dictionary_path;
+  FUZZTEST_LOG(INFO) << "Loaded " << unpacked_dictionary.size()
+                     << " dictionary entries from " << dictionary_path;
   return unpacked_dictionary.size();
 }
 
 void CentipedeCallbacks::PrintExecutionLog() const {
   if (!std::filesystem::exists(execute_log_path_)) {
-    LOG(WARNING) << "Log file for the last executed binary does not exist: "
-                 << execute_log_path_;
+    FUZZTEST_LOG(WARNING)
+        << "Log file for the last executed binary does not exist: "
+        << execute_log_path_;
     return;
   }
   std::string log_text;
   ReadFromLocalFile(execute_log_path_, log_text);
   for (const auto &log_line :
        absl::StrSplit(absl::StripAsciiWhitespace(log_text), '\n')) {
-    LOG(INFO).NoPrefix() << "LOG: " << log_line;
+    FUZZTEST_LOG(INFO).NoPrefix() << "FUZZTEST_LOG: " << log_line;
   }
 }
 
diff --git a/centipede/centipede_callbacks.h b/centipede/centipede_callbacks.h
index 57b9aab..94d8ec5 100644
--- a/centipede/centipede_callbacks.h
+++ b/centipede/centipede_callbacks.h
@@ -22,7 +22,6 @@
 #include <vector>
 
 #include "absl/base/nullability.h"
-#include "absl/log/check.h"
 #include "absl/status/statusor.h"
 #include "./centipede/binary_info.h"
 #include "./centipede/byte_array_mutator.h"
@@ -54,9 +53,9 @@
         outputs_blobseq_(shmem_name2_.c_str(), env.shmem_size_mb << 20,
                          env.use_posix_shmem) {
     if (env.use_legacy_default_mutator)
-      CHECK(byte_array_mutator_.set_max_len(env.max_len));
+      FUZZTEST_CHECK(byte_array_mutator_.set_max_len(env.max_len));
     else
-      CHECK(fuzztest_mutator_.set_max_len(env.max_len));
+      FUZZTEST_CHECK(fuzztest_mutator_.set_max_len(env.max_len));
   }
   virtual ~CentipedeCallbacks() {}
 
diff --git a/centipede/centipede_default_callbacks.cc b/centipede/centipede_default_callbacks.cc
index 20b2efa..ee54c2a 100644
--- a/centipede/centipede_default_callbacks.cc
+++ b/centipede/centipede_default_callbacks.cc
@@ -21,8 +21,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "./centipede/centipede_callbacks.h"
@@ -42,7 +40,7 @@
   }
 
   if (env_.has_input_wildcards) {
-    LOG(INFO) << "Disabling custom mutator for standalone target";
+    FUZZTEST_LOG(INFO) << "Disabling custom mutator for standalone target";
     custom_mutator_is_usable_ = false;
   }
 }
@@ -85,29 +83,33 @@
       if (!custom_mutator_is_usable_.has_value()) {
         custom_mutator_is_usable_ = result.has_custom_mutator();
         if (*custom_mutator_is_usable_) {
-          LOG(INFO) << "Custom mutator detected; will use it.";
+          FUZZTEST_LOG(INFO) << "Custom mutator detected; will use it.";
         } else {
-          LOG(INFO) << "Custom mutator not detected; falling back to the "
-                       "built-in mutator.";
+          FUZZTEST_LOG(INFO)
+              << "Custom mutator not detected; falling back to the "
+                 "built-in mutator.";
         }
       }
       if (*custom_mutator_is_usable_) {
         // TODO(b/398261908): Exit with failure instead of crashing.
-        CHECK(result.has_custom_mutator())
+        FUZZTEST_CHECK(result.has_custom_mutator())
             << "Test binary no longer has a custom mutator, even though it was "
                "previously detected.";
         if (!result.mutants().empty()) return std::move(result).mutants();
-        LOG_FIRST_N(WARNING, 5) << "Custom mutator returned no mutants; will "
-                                   "generate some using the built-in mutator.";
+        FUZZTEST_LOG_FIRST_N(WARNING, 5)
+            << "Custom mutator returned no mutants; will "
+               "generate some using the built-in mutator.";
       }
     } else if (ShouldStop()) {
-      LOG(WARNING) << "Custom mutator failed, but ignored since the stop "
-                      "condition it met. Possibly what triggered the stop "
-                      "condition also interrupted the mutator.";
+      FUZZTEST_LOG(WARNING)
+          << "Custom mutator failed, but ignored since the stop "
+             "condition it met. Possibly what triggered the stop "
+             "condition also interrupted the mutator.";
       // Returning whatever mutants we got before the failure.
       return std::move(result).mutants();
     } else {
-      LOG(ERROR) << "Test binary failed when asked to mutate inputs - exiting.";
+      FUZZTEST_LOG(ERROR)
+          << "Test binary failed when asked to mutate inputs - exiting.";
       RequestEarlyStop(EXIT_FAILURE);
       return {};
     }
diff --git a/centipede/centipede_interface.cc b/centipede/centipede_interface.cc
index 77b7a2d..1e74b45 100644
--- a/centipede/centipede_interface.cc
+++ b/centipede/centipede_interface.cc
@@ -33,8 +33,6 @@
 #include "absl/base/optimization.h"
 #include "absl/cleanup/cleanup.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "absl/strings/ascii.h"
@@ -85,7 +83,7 @@
   sigact.sa_flags = SA_ONSTACK;
   sigact.sa_handler = [](int received_signum) {
     if (received_signum == SIGINT) {
-      LOG(INFO) << "Ctrl-C pressed: winding down";
+      FUZZTEST_LOG(INFO) << "Ctrl-C pressed: winding down";
       RequestEarlyStop(EXIT_FAILURE);
       return;
     }
@@ -102,11 +100,11 @@
   std::string tmpfile = std::filesystem::path(tmpdir).append("t");
 
   for (const auto &arg : env.args) {
-    LOG(INFO) << "Running '" << env.for_each_blob << "' on " << arg;
+    FUZZTEST_LOG(INFO) << "Running '" << env.for_each_blob << "' on " << arg;
     auto blob_reader = DefaultBlobFileReaderFactory();
     absl::Status open_status = blob_reader->Open(arg);
     if (!open_status.ok()) {
-      LOG(INFO) << "Failed to open " << arg << ": " << open_status;
+      FUZZTEST_LOG(INFO) << "Failed to open " << arg << ": " << open_status;
       return EXIT_FAILURE;
     }
     ByteSpan blob;
@@ -132,8 +130,8 @@
 // provided, analyzes differences. If there is one arg provided, reports the
 // function coverage. Returns EXIT_SUCCESS on success, EXIT_FAILURE otherwise.
 int Analyze(const Environment &env) {
-  LOG(INFO) << "Analyze " << absl::StrJoin(env.args, ",");
-  CHECK(!env.binary.empty()) << "--binary must be used";
+  FUZZTEST_LOG(INFO) << "Analyze " << absl::StrJoin(env.args, ",");
+  FUZZTEST_CHECK(!env.binary.empty()) << "--binary must be used";
   if (env.args.size() == 1) {
     const CoverageResults coverage_results =
         GetCoverage(env.binary_name, env.binary_hash, env.args[0]);
@@ -145,8 +143,9 @@
     AnalyzeCorporaToLog(env.binary_name, env.binary_hash, env.args[0],
                         env.args[1]);
   } else {
-    LOG(FATAL) << "for now, --analyze supports only 1 or 2 work dirs; got "
-               << env.args.size();
+    FUZZTEST_LOG(FATAL)
+        << "for now, --analyze supports only 1 or 2 work dirs; got "
+        << env.args.size();
   }
   return EXIT_SUCCESS;
 }
@@ -167,8 +166,8 @@
   }
   if (env.save_binary_info) {
     const std::string binary_info_dir = WorkDir{env}.BinaryInfoDirPath();
-    CHECK_OK(RemoteMkdir(binary_info_dir));
-    LOG(INFO) << "Serializing binary info to: " << binary_info_dir;
+    FUZZTEST_CHECK_OK(RemoteMkdir(binary_info_dir));
+    FUZZTEST_LOG(INFO) << "Serializing binary info to: " << binary_info_dir;
     binary_info.Write(binary_info_dir);
   }
   if (binary_info.uses_legacy_trace_pc_instrumentation) {
@@ -176,7 +175,7 @@
     SavePCTableToFile(binary_info.pc_table, pcs_file_path);
   }
   if (env.use_pcpair_features) {
-    CHECK(!binary_info.pc_table.empty())
+    FUZZTEST_CHECK(!binary_info.pc_table.empty())
         << "--use_pcpair_features requires non-empty pc_table";
   }
   return binary_info;
@@ -215,7 +214,7 @@
             return absl::Minutes(std::clamp(iteration, 0UL, 10UL));
           },
       });
-  if (!envs.front().experiment.empty() || ABSL_VLOG_IS_ON(1)) {
+  if (!envs.front().experiment.empty() || FUZZTEST_VLOG_IS_ON(1)) {
     stats_reporters.emplace_back(
         [logger = StatsLogger{stats_vec, envs}]() mutable {
           logger.ReportCurrStats();
@@ -303,7 +302,8 @@
 
   for (const std::string &crashing_input_file : crashing_input_files) {
     ByteArray crashing_input;
-    CHECK_OK(RemoteFileGetContents(crashing_input_file, crashing_input));
+    FUZZTEST_CHECK_OK(
+        RemoteFileGetContents(crashing_input_file, crashing_input));
     const bool is_reproducible = !scoped_callbacks.callbacks()->Execute(
         env.binary, {crashing_input}, batch_result);
     const bool is_duplicate =
@@ -311,9 +311,10 @@
         !remaining_crash_signatures.insert(batch_result.failure_signature())
              .second;
     if (!is_reproducible || batch_result.IsSetupFailure() || is_duplicate) {
-      CHECK_OK(RemotePathDelete(crashing_input_file, /*recursively=*/false));
+      FUZZTEST_CHECK_OK(
+          RemotePathDelete(crashing_input_file, /*recursively=*/false));
     } else {
-      CHECK_OK(RemotePathTouchExistingFile(crashing_input_file));
+      FUZZTEST_CHECK_OK(RemotePathTouchExistingFile(crashing_input_file));
     }
   }
   return remaining_crash_signatures;
@@ -334,7 +335,7 @@
     const std::filesystem::path crash_metadata_dir =
         workdir.CrashMetadataDirPaths().Shard(shard_idx);
 
-    CHECK_OK(RemoteMkdir(crashing_dir.c_str()));
+    FUZZTEST_CHECK_OK(RemoteMkdir(crashing_dir.c_str()));
     for (const std::string &crashing_input_file : new_crashing_input_files) {
       const std::string crashing_input_file_name =
           std::filesystem::path(crashing_input_file).filename();
@@ -344,15 +345,15 @@
       const absl::Status status =
           RemoteFileGetContents(crash_signature_path, new_crash_signature);
       if (!status.ok()) {
-        LOG(WARNING) << "Ignoring crashing input " << crashing_input_file_name
-                     << " due to failure to read the crash signature: "
-                     << status;
+        FUZZTEST_LOG(WARNING)
+            << "Ignoring crashing input " << crashing_input_file_name
+            << " due to failure to read the crash signature: " << status;
         continue;
       }
       const bool is_duplicate =
           !crash_signatures.insert(new_crash_signature).second;
       if (is_duplicate) continue;
-      CHECK_OK(
+      FUZZTEST_CHECK_OK(
           RemoteFileRename(crashing_input_file,
                            (crashing_dir / crashing_input_file_name).c_str()));
     }
@@ -401,12 +402,13 @@
 
 absl::Duration ReadFuzzingTime(std::string_view fuzzing_time_file) {
   std::string fuzzing_time_str;
-  CHECK_OK(RemoteFileGetContents(fuzzing_time_file, fuzzing_time_str));
+  FUZZTEST_CHECK_OK(RemoteFileGetContents(fuzzing_time_file, fuzzing_time_str));
   absl::Duration fuzzing_time;
   if (!absl::ParseDuration(absl::StripAsciiWhitespace(fuzzing_time_str),
                            &fuzzing_time)) {
-    LOG(WARNING) << "Failed to parse fuzzing time of a resuming fuzz test: '"
-                 << fuzzing_time_str << "'. Assuming no fuzzing time so far.";
+    FUZZTEST_LOG(WARNING)
+        << "Failed to parse fuzzing time of a resuming fuzz test: '"
+        << fuzzing_time_str << "'. Assuming no fuzzing time so far.";
     return absl::ZeroDuration();
   }
   return fuzzing_time;
@@ -418,7 +420,7 @@
             absl::Status status = RemoteFileSetContents(
                 fuzzing_time_file,
                 absl::FormatDuration(absl::Now() - start_time));
-            LOG_IF(WARNING, !status.ok())
+            FUZZTEST_LOG_IF(WARNING, !status.ok())
                 << "Failed to write fuzzing time: " << status;
           },
           PeriodicAction::ZeroDelayConstInterval(absl::Seconds(15))};
@@ -431,9 +433,10 @@
   env.UpdateWithTargetConfig(fuzztest_config);
 
   absl::Time start_time = absl::Now();
-  LOG(INFO) << "Starting the update of the corpus database for fuzz tests:"
-            << "\nBinary: " << env.binary
-            << "\nCorpus database: " << fuzztest_config.corpus_database;
+  FUZZTEST_LOG(INFO)
+      << "Starting the update of the corpus database for fuzz tests:"
+      << "\nBinary: " << env.binary
+      << "\nCorpus database: " << fuzztest_config.corpus_database;
 
   // Step 1: Preliminary set up of test sharding, binary info, etc.
   const auto [test_shard_index, total_test_shards] = SetUpTestSharding();
@@ -457,7 +460,7 @@
   }();
   std::vector<std::string> fuzz_tests_to_run;
   if (env.fuzztest_single_test_mode) {
-    CHECK(fuzztest_config.fuzz_tests_in_current_shard.size() == 1)
+    FUZZTEST_CHECK(fuzztest_config.fuzz_tests_in_current_shard.size() == 1)
         << "Must select exactly one fuzz test when running in the single test "
            "mode";
     fuzz_tests_to_run = fuzztest_config.fuzz_tests_in_current_shard;
@@ -468,10 +471,11 @@
       }
     }
   }
-  LOG(INFO) << "Fuzz tests to run:" << absl::StrJoin(fuzz_tests_to_run, ", ");
+  FUZZTEST_LOG(INFO) << "Fuzz tests to run:"
+                     << absl::StrJoin(fuzz_tests_to_run, ", ");
 
   const bool is_workdir_specified = !env.workdir.empty();
-  CHECK(!is_workdir_specified || env.fuzztest_single_test_mode);
+  FUZZTEST_CHECK(!is_workdir_specified || env.fuzztest_single_test_mode);
   // When env.workdir is empty, the full workdir paths will be formed by
   // appending the fuzz test names to the base workdir path. We use different
   // path when only replaying to avoid replaying an unfinished fuzzing sessions.
@@ -489,8 +493,8 @@
   BinaryInfo binary_info = PopulateBinaryInfoAndSavePCsIfNecessary(
       env, callbacks_factory, pcs_file_path);
 
-  LOG(INFO) << "Test shard index: " << test_shard_index
-            << " Total test shards: " << total_test_shards;
+  FUZZTEST_LOG(INFO) << "Test shard index: " << test_shard_index
+                     << " Total test shards: " << total_test_shards;
 
   // Step 2: Iterate over the fuzz tests and run them.
   const std::string binary = env.binary;
@@ -504,7 +508,7 @@
       const absl::Status has_enough_time = VerifyBazelHasEnoughTimeToRunTest(
           start_time, test_time_limit,
           /*executed_tests_in_shard=*/i, fuzztest_config.fuzz_tests.size());
-      CHECK_OK(has_enough_time)
+      FUZZTEST_CHECK_OK(has_enough_time)
           << "Not enough time for running the fuzz test "
           << fuzz_tests_to_run[i] << " for " << test_time_limit;
     }
@@ -521,39 +525,41 @@
       // Use the execution IDs to resume or skip tests.
       const bool execution_id_matched = [&] {
         if (!RemotePathExists(execution_id_path)) return false;
-        CHECK(!RemotePathIsDirectory(execution_id_path));
+        FUZZTEST_CHECK(!RemotePathIsDirectory(execution_id_path));
         std::string prev_execution_id;
-        CHECK_OK(RemoteFileGetContents(execution_id_path, prev_execution_id));
+        FUZZTEST_CHECK_OK(
+            RemoteFileGetContents(execution_id_path, prev_execution_id));
         return prev_execution_id == *fuzztest_config.execution_id;
       }();
       if (execution_id_matched) {
         // If execution IDs match but the previous coverage is missing, it means
         // the test was previously finished, and we skip running for the test.
         if (!RemotePathExists(WorkDir{env}.CoverageDirPath())) {
-          LOG(INFO) << "Skipping running the fuzz test "
-                    << fuzz_tests_to_run[i];
+          FUZZTEST_LOG(INFO)
+              << "Skipping running the fuzz test " << fuzz_tests_to_run[i];
           continue;
         }
         // If execution IDs match and the previous coverage exists, it means
         // the same workflow got interrupted when running the test. So we resume
         // the test.
         is_resuming = true;
-        LOG(INFO) << "Resuming running the fuzz test " << fuzz_tests_to_run[i];
+        FUZZTEST_LOG(INFO) << "Resuming running the fuzz test "
+                           << fuzz_tests_to_run[i];
       } else {
         // If the execution IDs mismatch, we start a new run.
         is_resuming = false;
-        LOG(INFO) << "Starting a new run of the fuzz test "
-                  << fuzz_tests_to_run[i];
+        FUZZTEST_LOG(INFO) << "Starting a new run of the fuzz test "
+                           << fuzz_tests_to_run[i];
       }
     }
     if (RemotePathExists(env.workdir) && !is_resuming) {
       // This could be a workdir from a failed run that used a different version
       // of the binary. We delete it so that we don't have to deal with
       // the assumptions under which it is safe to reuse an old workdir.
-      CHECK_OK(RemotePathDelete(env.workdir, /*recursively=*/true));
+      FUZZTEST_CHECK_OK(RemotePathDelete(env.workdir, /*recursively=*/true));
     }
     const WorkDir workdir{env};
-    CHECK_OK(RemoteMkdir(
+    FUZZTEST_CHECK_OK(RemoteMkdir(
         workdir.CoverageDirPath()));  // Implicitly creates the workdir
 
     // Updating execution ID must be after creating the coverage dir. Otherwise
@@ -561,13 +567,13 @@
     // attempt would skip this test.
     if (!is_workdir_specified && fuzztest_config.execution_id.has_value() &&
         !is_resuming) {
-      CHECK_OK(RemoteFileSetContents(execution_id_path,
-                                     *fuzztest_config.execution_id));
+      FUZZTEST_CHECK_OK(RemoteFileSetContents(execution_id_path,
+                                              *fuzztest_config.execution_id));
     }
 
     absl::Cleanup clean_up_workdir = [is_workdir_specified, &env] {
       if (!is_workdir_specified && !EarlyStopRequested()) {
-        CHECK_OK(RemotePathDelete(env.workdir, /*recursively=*/true));
+        FUZZTEST_CHECK_OK(RemotePathDelete(env.workdir, /*recursively=*/true));
       }
     };
 
@@ -580,7 +586,7 @@
     // Seed the fuzzing session with the latest coverage corpus and regression
     // inputs from the previous fuzzing session.
     if (!is_resuming) {
-      CHECK_OK(GenerateSeedCorpusFromConfig(
+      FUZZTEST_CHECK_OK(GenerateSeedCorpusFromConfig(
           GetSeedCorpusConfig(env, regression_dir.c_str(),
                               fuzztest_config.replay_coverage_inputs
                                   ? coverage_dir.c_str()
@@ -612,14 +618,15 @@
     is_resuming = false;
 
     if (EarlyStopRequested()) {
-      LOG(INFO) << "Skipping test " << fuzz_tests_to_run[i]
-                << " because early stop requested.";
+      FUZZTEST_LOG(INFO) << "Skipping test " << fuzz_tests_to_run[i]
+                         << " because early stop requested.";
       continue;
     }
 
-    LOG(INFO) << (fuzztest_config.only_replay ? "Replaying " : "Fuzzing ")
-              << fuzz_tests_to_run[i] << " for " << time_limit
-              << "\n\tTest binary: " << env.binary;
+    FUZZTEST_LOG(INFO) << (fuzztest_config.only_replay ? "Replaying "
+                                                       : "Fuzzing ")
+                       << fuzz_tests_to_run[i] << " for " << time_limit
+                       << "\n\tTest binary: " << env.binary;
 
     const absl::Time start_time = absl::Now();
     ClearEarlyStopRequestAndSetStopTime(/*stop_time=*/start_time + time_limit);
@@ -631,15 +638,16 @@
 
     if (!stats_root_path.empty()) {
       const auto stats_dir = stats_root_path / fuzz_tests_to_run[i];
-      CHECK_OK(RemoteMkdir(stats_dir.c_str()));
-      CHECK_OK(RemoteFileRename(
+      FUZZTEST_CHECK_OK(RemoteMkdir(stats_dir.c_str()));
+      FUZZTEST_CHECK_OK(RemoteFileRename(
           workdir.FuzzingStatsPath(),
           (stats_dir / absl::StrCat("fuzzing_stats_", execution_stamp))
               .c_str()));
     }
 
     if (EarlyStopRequested()) {
-      LOG(INFO) << "Skip updating corpus database due to early stop requested.";
+      FUZZTEST_LOG(INFO)
+          << "Skip updating corpus database due to early stop requested.";
       continue;
     }
 
@@ -652,16 +660,18 @@
     if (RemotePathExists(coverage_dir.c_str())) {
       // In the future, we will store k latest coverage corpora for some k, but
       // for now we only keep the latest one.
-      CHECK_OK(RemotePathDelete(coverage_dir.c_str(), /*recursively=*/true));
+      FUZZTEST_CHECK_OK(
+          RemotePathDelete(coverage_dir.c_str(), /*recursively=*/true));
     }
-    CHECK_OK(RemoteMkdir(coverage_dir.c_str()));
+    FUZZTEST_CHECK_OK(RemoteMkdir(coverage_dir.c_str()));
     std::vector<std::string> distilled_corpus_files;
-    CHECK_OK(RemoteGlobMatch(workdir.DistilledCorpusFilePaths().AllShardsGlob(),
-                             distilled_corpus_files));
+    FUZZTEST_CHECK_OK(
+        RemoteGlobMatch(workdir.DistilledCorpusFilePaths().AllShardsGlob(),
+                        distilled_corpus_files));
     for (const std::string &corpus_file : distilled_corpus_files) {
       const std::string file_name =
           std::filesystem::path(corpus_file).filename();
-      CHECK_OK(
+      FUZZTEST_CHECK_OK(
           RemoteFileRename(corpus_file, (coverage_dir / file_name).c_str()));
     }
 
@@ -679,9 +689,9 @@
 
 int ListCrashIds(const Environment &env,
                  const fuzztest::internal::Configuration &target_config) {
-  CHECK(!env.list_crash_ids_file.empty())
+  FUZZTEST_CHECK(!env.list_crash_ids_file.empty())
       << "Need list_crash_ids_file to be set for listing crash IDs";
-  CHECK_EQ(target_config.fuzz_tests_in_current_shard.size(), 1);
+  FUZZTEST_CHECK_EQ(target_config.fuzz_tests_in_current_shard.size(), 1);
   std::vector<std::string> crash_paths;
   // TODO: b/406003594 - move the path construction to a library.
   const auto crash_dir = std::filesystem::path(target_config.corpus_database) /
@@ -689,7 +699,7 @@
                          target_config.fuzz_tests_in_current_shard[0] /
                          "crashing";
   if (RemotePathExists(crash_dir.string())) {
-    CHECK(RemotePathIsDirectory(crash_dir.string()))
+    FUZZTEST_CHECK(RemotePathIsDirectory(crash_dir.string()))
         << "Crash dir " << crash_dir << " in the corpus database "
         << target_config.corpus_database << " is not a directory";
     crash_paths =
@@ -701,16 +711,17 @@
     std::string crash_id = std::filesystem::path{crash_path}.filename();
     results.push_back(std::move(crash_id));
   }
-  CHECK_OK(RemoteFileSetContents(env.list_crash_ids_file,
-                                 absl::StrJoin(results, "\n")));
+  FUZZTEST_CHECK_OK(RemoteFileSetContents(env.list_crash_ids_file,
+                                          absl::StrJoin(results, "\n")));
   return EXIT_SUCCESS;
 }
 
 int ReplayCrash(const Environment &env,
                 const fuzztest::internal::Configuration &target_config,
                 CentipedeCallbacksFactory &callbacks_factory) {
-  CHECK(!env.crash_id.empty()) << "Need crash_id to be set for replay a crash";
-  CHECK(target_config.fuzz_tests_in_current_shard.size() == 1)
+  FUZZTEST_CHECK(!env.crash_id.empty())
+      << "Need crash_id to be set for replay a crash";
+  FUZZTEST_CHECK(target_config.fuzz_tests_in_current_shard.size() == 1)
       << "Expecting exactly one test for replay_crash";
   // TODO: b/406003594 - move the path construction to a library.
   const auto crash_dir = std::filesystem::path(target_config.corpus_database) /
@@ -732,8 +743,8 @@
               .filename(),
           /*shard_index_digits=*/WorkDir::kDigitsInShardIndex,
           /*num_shards=*/1}};
-  CHECK_OK(GenerateSeedCorpusFromConfig(crash_corpus_config, env.binary_name,
-                                        env.binary_hash));
+  FUZZTEST_CHECK_OK(GenerateSeedCorpusFromConfig(
+      crash_corpus_config, env.binary_name, env.binary_hash));
   Environment run_crash_env = env;
   run_crash_env.load_shards_only = true;
   return Fuzz(run_crash_env, {}, "", callbacks_factory);
@@ -741,11 +752,11 @@
 
 int ExportCrash(const Environment &env,
                 const fuzztest::internal::Configuration &target_config) {
-  CHECK(!env.crash_id.empty())
+  FUZZTEST_CHECK(!env.crash_id.empty())
       << "Need crash_id to be set for exporting a crash";
-  CHECK(!env.export_crash_file.empty())
+  FUZZTEST_CHECK(!env.export_crash_file.empty())
       << "Need export_crash_file to be set for exporting a crash";
-  CHECK(target_config.fuzz_tests_in_current_shard.size() == 1)
+  FUZZTEST_CHECK(target_config.fuzz_tests_in_current_shard.size() == 1)
       << "Expecting exactly one test for exporting a crash";
   // TODO: b/406003594 - move the path construction to a library.
   const auto crash_dir = std::filesystem::path(target_config.corpus_database) /
@@ -756,15 +767,15 @@
   const auto read_status =
       RemoteFileGetContents((crash_dir / env.crash_id).c_str(), crash_contents);
   if (!read_status.ok()) {
-    LOG(ERROR) << "Failed reading the crash " << env.crash_id << " from "
-               << crash_dir.c_str() << ": " << read_status;
+    FUZZTEST_LOG(ERROR) << "Failed reading the crash " << env.crash_id
+                        << " from " << crash_dir.c_str() << ": " << read_status;
     return EXIT_FAILURE;
   }
   const auto write_status =
       RemoteFileSetContents(env.export_crash_file, crash_contents);
   if (!write_status.ok()) {
-    LOG(ERROR) << "Failed write the crash " << env.crash_id << " to "
-               << env.export_crash_file << ": " << write_status;
+    FUZZTEST_LOG(ERROR) << "Failed write the crash " << env.crash_id << " to "
+                        << env.export_crash_file << ": " << write_status;
     return EXIT_FAILURE;
   }
   return EXIT_SUCCESS;
@@ -785,7 +796,8 @@
   if (!env.crashes_to_files.empty()) {
     const auto status = Centipede::CrashesToFiles(env, env.crashes_to_files);
     if (status.ok()) return EXIT_SUCCESS;
-    LOG(ERROR) << "Got error when exporting crashes to files: " << status;
+    FUZZTEST_LOG(ERROR) << "Got error when exporting crashes to files: "
+                        << status;
     return EXIT_FAILURE;
   }
 
@@ -830,21 +842,22 @@
       // to the unified execution model.
       if (!env.fuzztest_configuration.empty()) {
         std::string result;
-        CHECK(absl::WebSafeBase64Unescape(env.fuzztest_configuration, &result));
+        FUZZTEST_CHECK(
+            absl::WebSafeBase64Unescape(env.fuzztest_configuration, &result));
         return result;
       }
       ScopedCentipedeCallbacks scoped_callbacks(callbacks_factory, env);
       return scoped_callbacks.callbacks()->GetSerializedTargetConfig();
     }();
-    CHECK_OK(serialized_target_config.status());
+    FUZZTEST_CHECK_OK(serialized_target_config.status());
     if (!serialized_target_config->empty()) {
       const auto target_config = fuzztest::internal::Configuration::Deserialize(
           *serialized_target_config);
-      CHECK_OK(target_config.status())
+      FUZZTEST_CHECK_OK(target_config.status())
           << "Failed to deserialize target configuration";
       if (!target_config->corpus_database.empty()) {
-        LOG_IF(FATAL,
-               env.list_crash_ids + env.replay_crash + env.export_crash > 1)
+        FUZZTEST_LOG_IF(
+            FATAL, env.list_crash_ids + env.replay_crash + env.export_crash > 1)
             << "At most one of list_crash_ids/replay_crash/export_crash can "
                "be set, but seeing list_crash_ids: "
             << env.list_crash_ids << ", replay_crash: " << env.replay_crash
@@ -860,11 +873,11 @@
         }
 
         const auto time_limit_per_test = target_config->GetTimeLimitPerTest();
-        CHECK(target_config->only_replay ||
-              time_limit_per_test < absl::InfiniteDuration())
+        FUZZTEST_CHECK(target_config->only_replay ||
+                       time_limit_per_test < absl::InfiniteDuration())
             << "Updating corpus database requires specifying time limit per "
                "fuzz test.";
-        CHECK(time_limit_per_test >= absl::Seconds(1))
+        FUZZTEST_CHECK(time_limit_per_test >= absl::Seconds(1))
             << "Time limit per fuzz test must be at least 1 second.";
         return UpdateCorpusDatabaseForFuzzTests(env, *target_config,
                                                 callbacks_factory);
@@ -874,9 +887,9 @@
 
   // Create the remote coverage dirs once, before creating any threads.
   const auto coverage_dir = WorkDir{env}.CoverageDirPath();
-  CHECK_OK(RemoteMkdir(coverage_dir));
-  LOG(INFO) << "Coverage dir: " << coverage_dir
-            << "; temporary dir: " << tmpdir;
+  FUZZTEST_CHECK_OK(RemoteMkdir(coverage_dir));
+  FUZZTEST_LOG(INFO) << "Coverage dir: " << coverage_dir
+                     << "; temporary dir: " << tmpdir;
 
   std::string pcs_file_path;
   BinaryInfo binary_info = PopulateBinaryInfoAndSavePCsIfNecessary(
diff --git a/centipede/centipede_test.cc b/centipede/centipede_test.cc
index c66e7ab..b048e6e 100644
--- a/centipede/centipede_test.cc
+++ b/centipede/centipede_test.cc
@@ -31,8 +31,6 @@
 #include "gtest/gtest.h"
 #include "absl/base/nullability.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/time/time.h"
 #include "./centipede/centipede_callbacks.h"
@@ -360,14 +358,14 @@
   // Will not be called.
   bool Execute(std::string_view binary, const std::vector<ByteArray> &inputs,
                BatchResult &batch_result) override {
-    CHECK(false);
+    FUZZTEST_CHECK(false);
     return false;
   }
 
   // Will not be called.
   std::vector<ByteArray> Mutate(const std::vector<MutationInputRef> &inputs,
                                 size_t num_mutants) override {
-    CHECK(false);
+    FUZZTEST_CHECK(false);
   }
 
   // Redeclare a protected member function as public so the tests can call it.
@@ -505,7 +503,7 @@
                BatchResult &batch_result) override {
     batch_result.results().resize(inputs.size());
     for (size_t i = 0, n = inputs.size(); i < n; ++i) {
-      CHECK_EQ(inputs[i].size(), 1);
+      FUZZTEST_CHECK_EQ(inputs[i].size(), 1);
       batch_result.results()[i].mutable_features() = {inputs[i][0]};
     }
     return true;
@@ -582,8 +580,10 @@
       : CentipedeCallbacks(env) {
     std::vector<ByteArray> seed_inputs;
     const size_t num_seeds_available = GetSeeds(/*num_seeds=*/1, seed_inputs);
-    CHECK_EQ(num_seeds_available, 1) << "Default seeds must have size one.";
-    CHECK_EQ(seed_inputs.size(), 1) << "Default seeds must have size one.";
+    FUZZTEST_CHECK_EQ(num_seeds_available, 1)
+        << "Default seeds must have size one.";
+    FUZZTEST_CHECK_EQ(seed_inputs.size(), 1)
+        << "Default seeds must have size one.";
     seed_inputs_.insert(seed_inputs.begin(), seed_inputs.end());
   }
 
@@ -646,7 +646,7 @@
   FunctionFilterMock mock(env);
   MockFactory factory(mock);
   CentipedeMain(env, factory);
-  LOG(INFO) << mock.observed_inputs_.size();
+  FUZZTEST_LOG(INFO) << mock.observed_inputs_.size();
   std::vector<ByteArray> res(mock.observed_inputs_.begin(),
                              mock.observed_inputs_.end());
   std::sort(res.begin(), res.end());
@@ -808,7 +808,7 @@
   explicit UndetectedCrashingInputMock(const Environment &env,
                                        size_t crashing_input_idx)
       : CentipedeCallbacks{env}, crashing_input_idx_{crashing_input_idx} {
-    CHECK_LE(crashing_input_idx_, std::numeric_limits<uint8_t>::max());
+    FUZZTEST_CHECK_LE(crashing_input_idx_, std::numeric_limits<uint8_t>::max());
   }
 
   // Doesn't execute anything.
@@ -822,7 +822,7 @@
       num_inputs_triaged_ += inputs.size();
     }
     for (const auto &input : inputs) {
-      CHECK_EQ(input.size(), 1);  // By construction in `Mutate()`.
+      FUZZTEST_CHECK_EQ(input.size(), 1);  // By construction in `Mutate()`.
       // The contents of each mutant is its sequential number.
       if (input[0] == crashing_input_idx_) {
         if (first_pass_) {
@@ -881,8 +881,8 @@
   constexpr size_t kCrashingInputIdx =
       (kNumBatches / 2) * kBatchSize + kCrashingInputIdxInBatch;
 
-  LOG(INFO) << VV(kNumBatches) << VV(kBatchSize)
-            << VV(kCrashingInputIdxInBatch) VV(kCrashingInputIdx);
+  FUZZTEST_LOG(INFO) << VV(kNumBatches) << VV(kBatchSize)
+                     << VV(kCrashingInputIdxInBatch) VV(kCrashingInputIdx);
 
   TempDir temp_dir{test_info_->name()};
   Environment env;
diff --git a/centipede/command.cc b/centipede/command.cc
index d533bde..c5d7fd8 100644
--- a/centipede/command.cc
+++ b/centipede/command.cc
@@ -37,8 +37,6 @@
 #include <vector>
 
 #include "absl/base/const_init.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "absl/strings/match.h"
@@ -125,13 +123,14 @@
   ~ForkServerProps() {
     for (int i = 0; i < 2; ++i) {
       if (pipe_[i] >= 0 && close(pipe_[i]) != 0) {
-        LOG(ERROR) << "Failed to close fork server pipe for " << fifo_path_[i];
+        FUZZTEST_LOG(ERROR)
+            << "Failed to close fork server pipe for " << fifo_path_[i];
       }
       std::error_code ec;
       if (!fifo_path_[i].empty() &&
           !std::filesystem::remove(fifo_path_[i], ec)) {
-        LOG(ERROR) << "Failed to remove fork server pipe file " << fifo_path_[i]
-                   << ": " << ec;
+        FUZZTEST_LOG(ERROR) << "Failed to remove fork server pipe file "
+                            << fifo_path_[i] << ": " << ec;
       }
     }
   }
@@ -171,7 +170,7 @@
   // Replace @@ with temp_file_path_.
   constexpr std::string_view kTempFileWildCard = "@@";
   if (absl::StrContains(path, kTempFileWildCard)) {
-    CHECK(!options_.temp_file_path.empty());
+    FUZZTEST_CHECK(!options_.temp_file_path.empty());
     path = absl::StrReplaceAll(path,
                                {{kTempFileWildCard, options_.temp_file_path}});
   }
@@ -198,10 +197,10 @@
 bool Command::StartForkServer(std::string_view temp_dir_path,
                               std::string_view prefix) {
   if (absl::StartsWith(path_, kNoForkServerRequestPrefix)) {
-    VLOG(2) << "Fork server disabled for " << path();
+    FUZZTEST_VLOG(2) << "Fork server disabled for " << path();
     return false;
   }
-  VLOG(2) << "Starting fork server for " << path();
+  FUZZTEST_VLOG(2) << "Starting fork server for " << path();
 
   fork_server_.reset(new ForkServerProps);
   fork_server_->fifo_path_[0] = std::filesystem::path(temp_dir_path)
@@ -212,7 +211,7 @@
       std::filesystem::path(temp_dir_path).append("pid");
   (void)std::filesystem::create_directory(temp_dir_path);  // it may not exist.
   for (int i = 0; i < 2; ++i) {
-    PCHECK(mkfifo(fork_server_->fifo_path_[i].c_str(), 0600) == 0)
+    FUZZTEST_PCHECK(mkfifo(fork_server_->fifo_path_[i].c_str(), 0600) == 0)
         << VV(i) << VV(fork_server_->fifo_path_[i]);
   }
 
@@ -231,7 +230,7 @@
   const std::string fork_server_command = absl::StrFormat(
       kForkServerCommandStub, fork_server_->fifo_path_[0],
       fork_server_->fifo_path_[1], command_line_, pid_file_path);
-  VLOG(2) << "Fork server command:" << fork_server_command;
+  FUZZTEST_VLOG(2) << "Fork server command:" << fork_server_command;
 
   const int exit_code = system(fork_server_command.c_str());
 
@@ -267,7 +266,7 @@
 
   std::string pid_str;
   ReadFromLocalFile(pid_file_path, pid_str);
-  CHECK(absl::SimpleAtoi(pid_str, &fork_server_->pid_)) << VV(pid_str);
+  FUZZTEST_CHECK(absl::SimpleAtoi(pid_str, &fork_server_->pid_)) << VV(pid_str);
   auto creation_stamp = GetProcessCreationStamp(fork_server_->pid_);
   if (!creation_stamp.ok()) {
     LogProblemInfo(
@@ -285,9 +284,10 @@
   // Preconditions: the callers (`Execute()`) should call us only when the fork
   // server is presumed to be running (`fork_server_pid_` >= 0). If it is, the
   // comms pipes are guaranteed to be opened by `StartForkServer()`.
-  CHECK(fork_server_ != nullptr) << "Fork server wasn't started";
-  CHECK(fork_server_->pid_ >= 0) << "Fork server process failed to start";
-  CHECK(fork_server_->pipe_[0] >= 0 && fork_server_->pipe_[1] >= 0)
+  FUZZTEST_CHECK(fork_server_ != nullptr) << "Fork server wasn't started";
+  FUZZTEST_CHECK(fork_server_->pid_ >= 0)
+      << "Fork server process failed to start";
+  FUZZTEST_CHECK(fork_server_->pipe_[0] >= 0 && fork_server_->pipe_[1] >= 0)
       << "Failed to connect to fork server";
 
   // A process with the fork server PID exists (_some_ process, possibly with a
@@ -309,13 +309,13 @@
 }
 
 int Command::Execute() {
-  VLOG(1) << "Executing command '" << command_line_ << "'...";
+  FUZZTEST_VLOG(1) << "Executing command '" << command_line_ << "'...";
 
   int exit_code = EXIT_SUCCESS;
 
   if (fork_server_ != nullptr) {
-    VLOG(1) << "Sending execution request to fork server: "
-            << VV(options_.timeout);
+    FUZZTEST_VLOG(1) << "Sending execution request to fork server: "
+                     << VV(options_.timeout);
 
     if (const auto status = VerifyForkServerIsHealthy(); !status.ok()) {
       LogProblemInfo(absl::StrCat("Fork server should be running, but isn't: ",
@@ -325,7 +325,7 @@
 
     // Wake up the fork server.
     char x = ' ';
-    CHECK_EQ(1, write(fork_server_->pipe_[0], &x, 1));
+    FUZZTEST_CHECK_EQ(1, write(fork_server_->pipe_[0], &x, 1));
 
     // The fork server forks, the child is running. Block until some readable
     // data appears in the pipe (that is, after the fork server writes the
@@ -361,10 +361,10 @@
     }
 
     // The fork server wrote the execution result to the pipe: read it.
-    CHECK_EQ(sizeof(exit_code),
-             read(fork_server_->pipe_[1], &exit_code, sizeof(exit_code)));
+    FUZZTEST_CHECK_EQ(sizeof(exit_code), read(fork_server_->pipe_[1],
+                                              &exit_code, sizeof(exit_code)));
   } else {
-    VLOG(1) << "Fork server disabled - executing command directly";
+    FUZZTEST_VLOG(1) << "Fork server disabled - executing command directly";
     // No fork server, use system().
     exit_code = system(command_line_.c_str());
   }
@@ -454,21 +454,21 @@
   static absl::Mutex mu{absl::kConstInit};
   absl::MutexLock lock(&mu);
 
-  LOG(ERROR) << message;
-  LOG(ERROR).NoPrefix() << "=== COMMAND ===";
-  LOG(ERROR).NoPrefix() << command_line_;
-  LOG(ERROR).NoPrefix() << "=== STDOUT ===";
+  FUZZTEST_LOG(ERROR) << message;
+  FUZZTEST_LOG(ERROR).NoPrefix() << "=== COMMAND ===";
+  FUZZTEST_LOG(ERROR).NoPrefix() << command_line_;
+  FUZZTEST_LOG(ERROR).NoPrefix() << "=== STDOUT ===";
   for (const auto &line : absl::StrSplit(ReadRedirectedStdout(), '\n')) {
-    LOG(ERROR).NoPrefix() << line;
+    FUZZTEST_LOG(ERROR).NoPrefix() << line;
   }
-  LOG(ERROR).NoPrefix() << "=== STDERR ===";
+  FUZZTEST_LOG(ERROR).NoPrefix() << "=== STDERR ===";
   for (const auto &line : absl::StrSplit(ReadRedirectedStderr(), '\n')) {
-    LOG(ERROR).NoPrefix() << line;
+    FUZZTEST_LOG(ERROR).NoPrefix() << line;
   }
 }
 
 void Command::VlogProblemInfo(std::string_view message, int vlog_level) const {
-  if (ABSL_VLOG_IS_ON(vlog_level)) LogProblemInfo(message);
+  if (FUZZTEST_VLOG_IS_ON(vlog_level)) LogProblemInfo(message);
 }
 
 }  // namespace fuzztest::internal
diff --git a/centipede/command.h b/centipede/command.h
index 80c7877..66095a6 100644
--- a/centipede/command.h
+++ b/centipede/command.h
@@ -101,8 +101,8 @@
   // by the the command line, followed by the redirected stdout and stderr read
   // from `options_.out` and `options_.err` files, if any.
   void LogProblemInfo(std::string_view message) const;
-  // Just as `LogCrashInfo()`, but logging occurs only when the VLOG level (set
-  // via `--v` or its equivalents) is >= `min_vlog`.
+  // Just as `LogCrashInfo()`, but logging occurs only when the FUZZTEST_VLOG
+  // level (set via `--v` or its equivalents) is >= `min_vlog`.
   void VlogProblemInfo(std::string_view message, int vlog_level) const;
 
   const std::string path_;
diff --git a/centipede/command_test.cc b/centipede/command_test.cc
index 3129a41..bd75068 100644
--- a/centipede/command_test.cc
+++ b/centipede/command_test.cc
@@ -24,11 +24,11 @@
 #include <utility>
 
 #include "gtest/gtest.h"
-#include "absl/log/log.h"
 #include "absl/strings/substitute.h"
 #include "absl/time/time.h"
 #include "./centipede/stop.h"
 #include "./centipede/util.h"
+#include "./common/logging.h"
 #include "./common/test_util.h"
 
 namespace fuzztest::internal {
@@ -96,7 +96,7 @@
     Command self_sigint{"bash -c 'kill -SIGINT $$'"};
     self_sigint.Execute();
     if (ShouldStop()) {
-      LOG(INFO) << "Early stop requested";
+      FUZZTEST_LOG(INFO) << "Early stop requested";
       exit(ExitCode());
     }
   };
diff --git a/centipede/concurrent_bitset.h b/centipede/concurrent_bitset.h
index 09d1aa1..2e38d79 100644
--- a/centipede/concurrent_bitset.h
+++ b/centipede/concurrent_bitset.h
@@ -22,7 +22,7 @@
 //
 // This library must not depend on anything other than libc so that fuzz targets
 // using it doesn't gain redundant coverage. For the same reason this library
-// uses raw __builtin_trap instead of CHECKs.
+// uses raw __builtin_trap instead of FUZZTEST_CHECKs.
 // We make an exception for <algorithm> for std::sort/std::unique,
 // since <algorithm> is very lightweight.
 // This library is also header-only, with all functions defined as inline.
diff --git a/centipede/config_file.cc b/centipede/config_file.cc
index 2b288f1..89c0613 100644
--- a/centipede/config_file.cc
+++ b/centipede/config_file.cc
@@ -29,8 +29,6 @@
 #include "absl/flags/flag.h"
 #include "absl/flags/parse.h"
 #include "absl/flags/reflection.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_join.h"
@@ -116,7 +114,9 @@
     const std::string& new_arg = argv_.emplace_back(
         absl::StrReplaceAll(flag_replaced_arg.value_or(old_arg), replacements));
     if (new_arg != old_arg) {
-      VLOG(1) << "Augmented argv arg:\n" << VV(old_arg) << "\n" << VV(new_arg);
+      FUZZTEST_VLOG(1) << "Augmented argv arg:\n"
+                       << VV(old_arg) << "\n"
+                       << VV(new_arg);
       was_augmented_ = true;
     }
   }
@@ -147,7 +147,7 @@
   const std::filesystem::path path = absl::GetFlag(FLAGS_config);
 
   if (!path.empty()) {
-    CHECK_NE(path, absl::GetFlag(FLAGS_save_config))
+    FUZZTEST_CHECK_NE(path, absl::GetFlag(FLAGS_save_config))
         << "To update config in place, use " << DASHED_FLAG_NAME(update_config);
   }
 
@@ -162,15 +162,16 @@
   if (!path.empty() && !std::filesystem::exists(path)) {  // assume remote
     // Read the remote file.
     std::string contents;
-    CHECK_OK(RemoteFileGetContents(path.c_str(), contents));
+    FUZZTEST_CHECK_OK(RemoteFileGetContents(path.c_str(), contents));
 
     // Save a temporary local copy.
     const std::filesystem::path tmp_dir = TemporaryLocalDirPath();
     const std::filesystem::path local_path = tmp_dir / path.filename();
-    LOG(INFO) << "Localizing remote config: " << VV(path) << VV(local_path);
+    FUZZTEST_LOG(INFO) << "Localizing remote config: " << VV(path)
+                       << VV(local_path);
     // NOTE: Ignore "Remote" in the API names here: the paths are always local.
-    CHECK_OK(RemoteMkdir(tmp_dir.c_str()));
-    CHECK_OK(RemoteFileSetContents(local_path.c_str(), contents));
+    FUZZTEST_CHECK_OK(RemoteMkdir(tmp_dir.c_str()));
+    FUZZTEST_CHECK_OK(RemoteFileSetContents(local_path.c_str(), contents));
 
     // Augment the argv to point at the local copy and ensure it is cleaned up.
     replacements.emplace_back(path.c_str(), local_path.c_str());
@@ -188,16 +189,16 @@
   // Initialize `path` if --save_config or --update_config is passed.
   if (!absl::GetFlag(FLAGS_save_config).empty()) {
     path = absl::GetFlag(FLAGS_save_config);
-    CHECK_NE(path, absl::GetFlag(FLAGS_config))
+    FUZZTEST_CHECK_NE(path, absl::GetFlag(FLAGS_config))
         << "To update config in place, use " << DASHED_FLAG_NAME(update_config);
-    CHECK(!absl::GetFlag(FLAGS_update_config))
+    FUZZTEST_CHECK(!absl::GetFlag(FLAGS_update_config))
         << DASHED_FLAG_NAME(save_config) << " and "
         << DASHED_FLAG_NAME(update_config) << " are mutually exclusive";
   } else if (absl::GetFlag(FLAGS_update_config)) {
     path = absl::GetFlag(FLAGS_config);
-    CHECK(!path.empty()) << DASHED_FLAG_NAME(update_config)
-                         << " must be used in combination with "
-                         << DASHED_FLAG_NAME(config);
+    FUZZTEST_CHECK(!path.empty())
+        << DASHED_FLAG_NAME(update_config)
+        << " must be used in combination with " << DASHED_FLAG_NAME(config);
   }
 
   // Save or update the config file.
@@ -244,7 +245,7 @@
     } else {
       file_contents = flags_str;
     }
-    CHECK_OK(RemoteFileSetContents(path.c_str(), file_contents));
+    FUZZTEST_CHECK_OK(RemoteFileSetContents(path.c_str(), file_contents));
   }
 
   return path;
@@ -269,7 +270,7 @@
   const AugmentedArgvWithCleanup localized_argv =
       LocalizeConfigFilesInArgv(saved_argv);
   if (localized_argv.was_augmented()) {
-    LOG(INFO) << "Command line was augmented; reparsing";
+    FUZZTEST_LOG(INFO) << "Command line was augmented; reparsing";
     runtime_state->leftover_argv() = CastArgv(absl::ParseCommandLine(
         localized_argv.argc(), CastArgv(localized_argv.argv()).data()));
   }
@@ -279,15 +280,15 @@
     const FlagInfosPerSource flags = GetFlagsPerSource("centipede");
     const std::string flags_str = FormatFlagfileString(
         flags, DefaultedFlags::kCommentedOut, FlagComments::kNone);
-    LOG(INFO) << "Final resolved config:\n" << flags_str;
+    FUZZTEST_LOG(INFO) << "Final resolved config:\n" << flags_str;
   }
 
   // If --save_config was passed, save the final resolved flags to the requested
   // file and exit the program.
   const auto path = MaybeSaveConfigToFile(leftover_argv);
   if (!path.empty()) {
-    LOG(INFO) << "Config written to file: " << VV(path);
-    LOG(INFO) << "Nothing left to do; exiting";
+    FUZZTEST_LOG(INFO) << "Config written to file: " << VV(path);
+    FUZZTEST_LOG(INFO) << "Nothing left to do; exiting";
     exit(EXIT_SUCCESS);
   }
 
diff --git a/centipede/config_init.cc b/centipede/config_init.cc
index 5c5c555..2d22a33 100644
--- a/centipede/config_init.cc
+++ b/centipede/config_init.cc
@@ -37,7 +37,7 @@
 ABSL_ATTRIBUTE_WEAK std::unique_ptr<RuntimeState> InitRuntime(int argc,
                                                               char* argv[]) {
   // NB: The invocation order below is very important. Do not change.
-  // Make `LOG(INFO)` to go to stderr by default. Note that an explicit
+  // Make `FUZZTEST_LOG(INFO)` to go to stderr by default. Note that an explicit
   // `--stderrthreshold=N` on the command line will override this.
   absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo);
   // Make --help print any flags defined by any Centipede source.
diff --git a/centipede/config_init.h b/centipede/config_init.h
index 740d2cc..59436df 100644
--- a/centipede/config_init.h
+++ b/centipede/config_init.h
@@ -42,8 +42,8 @@
 };
 
 // * Initializes the relevant runtime subsystems in the correct order.
-// * Directs all `LOG(INFO)`s to also to stderr (by default, only `LOG(ERROR)`s
-//   and higher go to stderr).
+// * Directs all `FUZZTEST_LOG(INFO)`s to also to stderr (by default, only
+//   `FUZZTEST_LOG(ERROR)`s and higher go to stderr).
 // * Tweaks --help behavior to print any flags defined by any Centipede source
 //   (by default, --help only prints flags defined in the source named
 //   <program>.cc or <program_main>.cc).
diff --git a/centipede/control_flow.cc b/centipede/control_flow.cc
index 68c443e..e053a80 100644
--- a/centipede/control_flow.cc
+++ b/centipede/control_flow.cc
@@ -30,8 +30,6 @@
 #include <vector>
 
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_split.h"
@@ -47,11 +45,11 @@
 PCTable ReadPcTableFromFile(std::string_view file_path) {
   ByteArray pc_infos_as_bytes;
   ReadFromLocalFile(file_path, pc_infos_as_bytes);
-  CHECK_EQ(pc_infos_as_bytes.size() % sizeof(PCInfo), 0);
+  FUZZTEST_CHECK_EQ(pc_infos_as_bytes.size() % sizeof(PCInfo), 0);
   size_t pc_table_size = pc_infos_as_bytes.size() / sizeof(PCInfo);
   const auto *pc_infos = reinterpret_cast<PCInfo *>(pc_infos_as_bytes.data());
   PCTable pc_table{pc_infos, pc_infos + pc_table_size};
-  CHECK_EQ(pc_table.size(), pc_table_size);
+  FUZZTEST_CHECK_EQ(pc_table.size(), pc_table_size);
   return pc_table;
 }
 
@@ -68,9 +66,9 @@
   if (exit_code != EXIT_SUCCESS) {
     std::string log_text;
     ReadFromLocalFile(stderr_path, log_text);
-    LOG(ERROR) << "Failed to use objdump to get PC table; stderr is:";
+    FUZZTEST_LOG(ERROR) << "Failed to use objdump to get PC table; stderr is:";
     for (const auto &line : absl::StrSplit(log_text, '\n')) {
-      LOG(ERROR).NoPrefix() << line;
+      FUZZTEST_LOG(ERROR).NoPrefix() << line;
     }
     std::filesystem::remove(tmp_path);
     std::filesystem::remove(stderr_path);
@@ -79,7 +77,7 @@
   std::filesystem::remove(stderr_path);
   PCTable pc_table;
   std::ifstream in(std::string{tmp_path});
-  CHECK(in.good()) << VV(tmp_path);
+  FUZZTEST_CHECK(in.good()) << VV(tmp_path);
   bool saw_new_function = false;
 
   // Read the objdump output, find lines that start a function
@@ -107,7 +105,7 @@
 CFTable ReadCfTable(std::istream &in) {
   const std::string input_string(std::istreambuf_iterator<char>(in), {});
   const ByteArray cf_table_as_bytes(input_string.begin(), input_string.end());
-  CHECK_EQ(cf_table_as_bytes.size() % sizeof(CFTable::value_type), 0);
+  FUZZTEST_CHECK_EQ(cf_table_as_bytes.size() % sizeof(CFTable::value_type), 0);
   const size_t cf_table_size =
       cf_table_as_bytes.size() / sizeof(CFTable::value_type);
   const auto *cf_entries =
@@ -117,7 +115,7 @@
 
 CFTable ReadCfTable(std::string_view file_path) {
   std::string cf_table_contents;
-  CHECK_OK(RemoteFileGetContents(file_path, cf_table_contents));
+  FUZZTEST_CHECK_OK(RemoteFileGetContents(file_path, cf_table_contents));
   std::istringstream cf_table_stream(cf_table_contents);
   return ReadCfTable(cf_table_stream);
 }
@@ -135,7 +133,7 @@
     // Use std::string; there is no std::stoul for std::string_view.
     const std::vector<std::string> tokens =
         absl::StrSplit(line, ' ', absl::SkipEmpty());
-    CHECK_EQ(tokens.size(), 2) << VV(line);
+    FUZZTEST_CHECK_EQ(tokens.size(), 2) << VV(line);
     result.push_back(DsoInfo{tokens[0], std::stoul(tokens[1])});
   }
   return result;
@@ -143,7 +141,7 @@
 
 void ControlFlowGraph::InitializeControlFlowGraph(const CFTable &cf_table,
                                                   const PCTable &pc_table) {
-  CHECK(!cf_table.empty());
+  FUZZTEST_CHECK(!cf_table.empty());
   func_entries_.resize(pc_table.size());
   reachability_.resize(pc_table.size());
 
@@ -162,14 +160,14 @@
     // Record the list of successors
     graph_[curr_pc] = std::move(successors);
     // TODO(ussuri): Remove after debugging.
-    VLOG(100) << "Added PC: " << curr_pc;
+    FUZZTEST_VLOG(100) << "Added PC: " << curr_pc;
 
     // Iterate over callees.
     while (cf_table[j]) {
       ++j;
     }
     ++j;  // Step over the delimiter.
-    CHECK_LE(j, cf_table.size());
+    FUZZTEST_CHECK_LE(j, cf_table.size());
   }
   // Calculate cyclomatic complexity for all functions.
   for (PCIndex i = 0; i < pc_table.size(); ++i) {
@@ -186,7 +184,7 @@
 const std::vector<uintptr_t> &ControlFlowGraph::GetSuccessors(
     uintptr_t basic_block) const {
   auto it = graph_.find(basic_block);
-  CHECK(it != graph_.end()) << VV(basic_block);
+  FUZZTEST_CHECK(it != graph_.end()) << VV(basic_block);
   return it->second;
 }
 
diff --git a/centipede/control_flow.h b/centipede/control_flow.h
index f401d84..2feb9fa 100644
--- a/centipede/control_flow.h
+++ b/centipede/control_flow.h
@@ -25,7 +25,6 @@
 
 #include "absl/container/flat_hash_map.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
 #include "./centipede/pc_info.h"
 #include "./common/defs.h"
 #include "./common/logging.h"
@@ -86,26 +85,27 @@
     return graph_.contains(basic_block);
   }
 
-  // Returns cyclomatic complexity of function PC. CHECK-fails if it is not a
-  // valid function PC.
+  // Returns cyclomatic complexity of function PC. FUZZTEST_CHECK-fails if it is
+  // not a valid function PC.
   uint32_t GetCyclomaticComplexity(uintptr_t pc) const {
     auto it = function_complexities_.find(pc);
-    CHECK(it != function_complexities_.end());
+    FUZZTEST_CHECK(it != function_complexities_.end());
     return it->second;
   }
 
   // Returns true if the given basic block is function entry.
   bool BlockIsFunctionEntry(PCIndex pc_index) const {
-    // TODO(ussuri): Change the following to use CHECK_LE(pc_index,
+    // TODO(ussuri): Change the following to use FUZZTEST_CHECK_LE(pc_index,
     // func_entries_.size()) and have a death test.
     return pc_index < func_entries_.size() ? func_entries_[pc_index] : false;
   }
 
-  // Returns the idx in pc_table associated with the PC, CHECK-fails if the PC
-  // is not in the pc_table.
+  // Returns the idx in pc_table associated with the PC, FUZZTEST_CHECK-fails if
+  // the PC is not in the pc_table.
   PCIndex GetPcIndex(uintptr_t pc) const {
     auto it = pc_index_map_.find(pc);
-    CHECK(it != pc_index_map_.end()) << VV(pc) << " is not in pc_table.";
+    FUZZTEST_CHECK(it != pc_index_map_.end())
+        << VV(pc) << " is not in pc_table.";
     return it->second;
   }
 
@@ -117,7 +117,7 @@
   // The method is const, under the hood it uses a mutable data member.
   // Thread-safe: can be called concurrently from multiple threads
   const std::vector<uintptr_t> &LazyGetReachabilityForPc(uintptr_t pc) const {
-    CHECK_EQ(reachability_.size(), pc_index_map_.size());
+    FUZZTEST_CHECK_EQ(reachability_.size(), pc_index_map_.size());
     auto pc_index = GetPcIndex(pc);
     std::call_once(*(reachability_[pc_index].once), [this, &pc, &pc_index]() {
       reachability_[pc_index].reach = ComputeReachabilityForPc(pc);
diff --git a/centipede/control_flow_test.cc b/centipede/control_flow_test.cc
index 4d63e59..2d21d21 100644
--- a/centipede/control_flow_test.cc
+++ b/centipede/control_flow_test.cc
@@ -25,8 +25,6 @@
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/container/flat_hash_map.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "./centipede/binary_info.h"
 #include "./centipede/pc_info.h"
 #include "./centipede/symbol_table.h"
@@ -87,17 +85,17 @@
     EXPECT_TRUE(cfg.GetSuccessors(4).empty());
   }
 
-  CHECK_EQ(cfg.GetPcIndex(1), 0);
-  CHECK_EQ(cfg.GetPcIndex(2), 1);
-  CHECK_EQ(cfg.GetPcIndex(3), 2);
-  CHECK_EQ(cfg.GetPcIndex(4), 3);
+  FUZZTEST_CHECK_EQ(cfg.GetPcIndex(1), 0);
+  FUZZTEST_CHECK_EQ(cfg.GetPcIndex(2), 1);
+  FUZZTEST_CHECK_EQ(cfg.GetPcIndex(3), 2);
+  FUZZTEST_CHECK_EQ(cfg.GetPcIndex(4), 3);
 
   EXPECT_TRUE(cfg.BlockIsFunctionEntry(0));
   EXPECT_FALSE(cfg.BlockIsFunctionEntry(1));
   EXPECT_FALSE(cfg.BlockIsFunctionEntry(2));
   EXPECT_FALSE(cfg.BlockIsFunctionEntry(3));
 
-  CHECK_EQ(cfg.GetCyclomaticComplexity(1), 2);
+  FUZZTEST_CHECK_EQ(cfg.GetCyclomaticComplexity(1), 2);
 }
 
 TEST(CFTable, SerializesAndDeserializesCfTable) {
@@ -205,9 +203,9 @@
       target_path, GetObjDumpPath(), GetLLVMSymbolizerPath(),
       GetTestTempDir(test_info_->name()).string());
   const auto &cf_table = binary_info.cf_table;
-  LOG(INFO) << VV(target_path) << VV(tmp_path1) << VV(cf_table.size());
+  FUZZTEST_LOG(INFO) << VV(target_path) << VV(tmp_path1) << VV(cf_table.size());
   if (cf_table.empty()) {
-    LOG(INFO) << "__sancov_cfs is empty.";
+    FUZZTEST_LOG(INFO) << "__sancov_cfs is empty.";
     // TODO(ussuri): This should be removed once OSS clang supports
     //  control-flow.
     GTEST_SKIP();
@@ -215,7 +213,7 @@
 
   ASSERT_FALSE(
       std::filesystem::exists(tmp_path1.c_str()));  // tmp_path1 was deleted.
-  LOG(INFO) << VV(cf_table.size());
+  FUZZTEST_LOG(INFO) << VV(cf_table.size());
 
   const auto &pc_table = binary_info.pc_table;
   EXPECT_FALSE(binary_info.uses_legacy_trace_pc_instrumentation);
@@ -304,7 +302,7 @@
   for (size_t i = 0; i < symbols.size(); i++) {
     bool is_func_entry = pc_table[i].has_flag(PCInfo::kFuncEntry);
     if (is_func_entry) {
-      LOG(INFO) << symbols.full_description(i);
+      FUZZTEST_LOG(INFO) << symbols.full_description(i);
     }
     single_edge_func_num_edges += symbols.func(i) == "SingleEdgeFunc";
     multi_edge_func_num_edges += symbols.func(i) == "MultiEdgeFunc";
diff --git a/centipede/corpus.cc b/centipede/corpus.cc
index 42f3e4b..16f4b5d 100644
--- a/centipede/corpus.cc
+++ b/centipede/corpus.cc
@@ -22,8 +22,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_join.h"
 #include "absl/strings/substitute.h"
@@ -80,7 +78,7 @@
                      const CoverageFrontier &coverage_frontier,
                      size_t max_corpus_size, Rng &rng) {
   // TODO(kcc): use coverage_frontier.
-  CHECK(max_corpus_size);
+  FUZZTEST_CHECK(max_corpus_size);
   if (records_.size() < 2UL) return 0;
   // Recompute the weights.
   size_t num_zero_weights = 0;
@@ -103,7 +101,7 @@
   RemoveSubset(subset_to_remove, records_);
 
   weighted_distribution_.RecomputeInternalState();
-  CHECK(!records_.empty());
+  FUZZTEST_CHECK(!records_.empty());
 
   // Features may have shrunk from CountUnseenAndPruneFrequentFeatures.
   // Call shrink_to_fit for the features that survived the pruning.
@@ -119,9 +117,9 @@
                  const ExecutionMetadata &metadata, const FeatureSet &fs,
                  const CoverageFrontier &coverage_frontier) {
   // TODO(kcc): use coverage_frontier.
-  CHECK(!data.empty())
+  FUZZTEST_CHECK(!data.empty())
       << "Got request to add empty element to corpus: ignoring";
-  CHECK_EQ(records_.size(), weighted_distribution_.size());
+  FUZZTEST_CHECK_EQ(records_.size(), weighted_distribution_.size());
   records_.push_back({data, fv, metadata});
   weighted_distribution_.AddWeight(ComputeWeight(fv, fs, coverage_frontier));
 }
@@ -137,8 +135,8 @@
 void Corpus::DumpStatsToFile(const FeatureSet &fs, std::string_view filepath,
                              std::string_view description) {
   auto *file = ValueOrDie(RemoteFileOpen(filepath, "w"));
-  CHECK(file != nullptr) << "Failed to open file: " << filepath;
-  CHECK_OK(RemoteFileSetWriteBufferSize(file, 100UL * 1024 * 1024));
+  FUZZTEST_CHECK(file != nullptr) << "Failed to open file: " << filepath;
+  FUZZTEST_CHECK_OK(RemoteFileSetWriteBufferSize(file, 100UL * 1024 * 1024));
   static constexpr std::string_view kHeaderStub = R"(# $0
 {
   "num_inputs": $1,
@@ -151,7 +149,7 @@
 )";
   const std::string header_str =
       absl::Substitute(kHeaderStub, description, records_.size());
-  CHECK_OK(RemoteFileAppend(file, header_str));
+  FUZZTEST_CHECK_OK(RemoteFileAppend(file, header_str));
   std::string before_record;
   for (const auto &record : records_) {
     std::vector<size_t> frequencies;
@@ -162,11 +160,11 @@
     const std::string frequencies_str = absl::StrJoin(frequencies, ", ");
     const std::string record_str = absl::Substitute(
         kRecordStub, before_record, record.data.size(), frequencies_str);
-    CHECK_OK(RemoteFileAppend(file, record_str));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, record_str));
     before_record = ",";
   }
-  CHECK_OK(RemoteFileAppend(file, std::string{kFooter}));
-  CHECK_OK(RemoteFileClose(file));
+  FUZZTEST_CHECK_OK(RemoteFileAppend(file, std::string{kFooter}));
+  FUZZTEST_CHECK_OK(RemoteFileClose(file));
 }
 
 std::string Corpus::MemoryUsageString() const {
@@ -184,7 +182,7 @@
 //------------------------------------------------------------------------------
 
 void WeightedDistribution::AddWeight(uint64_t weight) {
-  CHECK_EQ(weights_.size(), cumulative_weights_.size());
+  FUZZTEST_CHECK_EQ(weights_.size(), cumulative_weights_.size());
   weights_.push_back(weight);
   if (cumulative_weights_.empty()) {
     cumulative_weights_.push_back(weight);
@@ -194,7 +192,7 @@
 }
 
 void WeightedDistribution::ChangeWeight(size_t idx, uint64_t new_weight) {
-  CHECK_LT(idx, size());
+  FUZZTEST_CHECK_LT(idx, size());
   weights_[idx] = new_weight;
   cumulative_weights_valid_ = false;
 }
@@ -212,15 +210,15 @@
 __attribute__((noinline))  // to see it in profile.
 size_t
 WeightedDistribution::RandomIndex(size_t random) const {
-  CHECK(!weights_.empty());
-  CHECK(cumulative_weights_valid_);
+  FUZZTEST_CHECK(!weights_.empty());
+  FUZZTEST_CHECK(cumulative_weights_valid_);
   uint64_t sum_of_all_weights = cumulative_weights_.back();
   if (sum_of_all_weights == 0)
     return random % size();  // can't do much else here.
   random = random % sum_of_all_weights;
   auto it = std::upper_bound(cumulative_weights_.begin(),
                              cumulative_weights_.end(), random);
-  CHECK(it != cumulative_weights_.end());
+  FUZZTEST_CHECK(it != cumulative_weights_.end());
   return it - cumulative_weights_.begin();
 }
 
diff --git a/centipede/corpus.h b/centipede/corpus.h
index e297f06..dc6bb00 100644
--- a/centipede/corpus.h
+++ b/centipede/corpus.h
@@ -23,7 +23,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
 #include "./centipede/binary_info.h"
 #include "./centipede/execution_metadata.h"
 #include "./centipede/feature.h"
@@ -180,7 +179,7 @@
 
   // Returns true iff `idx` belongs to the frontier.
   bool PcIndexIsFrontier(size_t idx) const {
-    CHECK_LT(idx, MaxPcIndex());
+    FUZZTEST_CHECK_LT(idx, MaxPcIndex());
     return frontier_[idx];
   }
 
@@ -189,7 +188,7 @@
 
   // Returns the frontier weight of pc at `idx`, weight of a non-frontier is 0.
   uint64_t FrontierWeight(size_t idx) const {
-    CHECK_LT(idx, MaxPcIndex());
+    FUZZTEST_CHECK_LT(idx, MaxPcIndex());
     return frontier_weight_[idx];
   }
 
diff --git a/centipede/corpus_io.cc b/centipede/corpus_io.cc
index 23e63c3..cdc6de9 100644
--- a/centipede/corpus_io.cc
+++ b/centipede/corpus_io.cc
@@ -22,8 +22,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/time/time.h"
 #include "absl/types/span.h"
@@ -46,13 +44,13 @@
       !features_path.empty() && RemotePathExists(features_path);
 
   if (!good_corpus_path) {
-    LOG(WARNING) << "Corpus file path empty or not found - returning: "
-                 << corpus_path;
+    FUZZTEST_LOG(WARNING) << "Corpus file path empty or not found - returning: "
+                          << corpus_path;
     return;
   }
 
   RPROF_THIS_FUNCTION_WITH_TIMELAPSE(            //
-      /*enable=*/ABSL_VLOG_IS_ON(10),            //
+      /*enable=*/FUZZTEST_VLOG_IS_ON(10),        //
       /*timelapse_interval=*/absl::Seconds(30),  //
       /*also_log_timelapses=*/false);
 
@@ -64,7 +62,7 @@
   std::multimap<std::string /*hash*/, ByteArray /*input*/> hash_to_input;
   // Read inputs from the corpus file into `hash_to_input`.
   auto corpus_reader = DefaultBlobFileReaderFactory();
-  CHECK_OK(corpus_reader->Open(corpus_path)) << VV(corpus_path);
+  FUZZTEST_CHECK_OK(corpus_reader->Open(corpus_path)) << VV(corpus_path);
   ByteSpan blob;
   while (corpus_reader->Read(blob).ok()) {
     std::string hash = Hash(blob);
@@ -82,15 +80,17 @@
 
   // If the features file is not passed or doesn't exist, simply ignore it.
   if (!good_features_path) {
-    LOG(WARNING) << "Features file path empty or not found - ignoring: "
-                 << features_path;
+    FUZZTEST_LOG(WARNING)
+        << "Features file path empty or not found - ignoring: "
+        << features_path;
   } else {
     // Read features from the features file. For each feature, find a matching
     // input in `hash_to_input`, call `callback` for the pair, and remove the
     // entry from `hash_to_input`. In the end, `hash_to_input` will contain
     // only inputs without matching features.
     auto features_reader = DefaultBlobFileReaderFactory();
-    CHECK_OK(features_reader->Open(features_path)) << VV(features_path);
+    FUZZTEST_CHECK_OK(features_reader->Open(features_path))
+        << VV(features_path);
     ByteSpan hash_and_features;
     while (features_reader->Read(hash_and_features).ok()) {
       // Every valid feature record must contain the hash at the end.
@@ -127,7 +127,7 @@
 
   RPROF_SNAPSHOT("Reported inputs with no matching features");
 
-  VLOG(1)  //
+  FUZZTEST_VLOG(1)  //
       << "Finished shard reading:\n"
       << "Corpus path                : " << corpus_path << "\n"
       << "Features path              : " << features_path << "\n"
@@ -140,17 +140,17 @@
 
 void ExportCorpus(absl::Span<const std::string> sharded_file_paths,
                   std::string_view out_dir) {
-  LOG(INFO) << "Exporting corpus to " << out_dir;
+  FUZZTEST_LOG(INFO) << "Exporting corpus to " << out_dir;
   for (const std::string &file : sharded_file_paths) {
     auto reader = DefaultBlobFileReaderFactory();
-    CHECK_OK(reader->Open(file)) << VV(file);
+    FUZZTEST_CHECK_OK(reader->Open(file)) << VV(file);
     ByteSpan blob;
     size_t num_read = 0;
     while (reader->Read(blob).ok()) {
       ++num_read;
       WriteToRemoteHashedFileInDir(out_dir, blob);
     }
-    LOG(INFO) << "Exported " << num_read << " inputs from " << file;
+    FUZZTEST_LOG(INFO) << "Exported " << num_read << " inputs from " << file;
   }
 }
 
diff --git a/centipede/corpus_io_test.cc b/centipede/corpus_io_test.cc
index a97572d..f368a31 100644
--- a/centipede/corpus_io_test.cc
+++ b/centipede/corpus_io_test.cc
@@ -22,7 +22,6 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
 #include "absl/types/span.h"
 #include "./centipede/corpus.h"
 #include "./centipede/feature.h"
@@ -30,6 +29,7 @@
 #include "./centipede/workdir.h"
 #include "./common/blob_file.h"
 #include "./common/defs.h"
+#include "./common/logging.h"
 #include "./common/test_util.h"
 
 namespace fuzztest::internal {
@@ -40,11 +40,11 @@
 void WriteBlobsToFile(std::string_view blob_file_path,
                       absl::Span<const ByteArray> blobs) {
   auto writer = DefaultBlobFileWriterFactory();
-  CHECK_OK(writer->Open(blob_file_path, "w"));
+  FUZZTEST_CHECK_OK(writer->Open(blob_file_path, "w"));
   for (const ByteArray& blob : blobs) {
-    CHECK_OK(writer->Write(blob));
+    FUZZTEST_CHECK_OK(writer->Write(blob));
   }
-  CHECK_OK(writer->Close());
+  FUZZTEST_CHECK_OK(writer->Close());
 }
 
 std::vector<ByteArray> ReadInputsFromFiles(std::string_view dir) {
@@ -109,7 +109,7 @@
 TEST(ExportCorpusTest, ExportsCorpusToIndividualFiles) {
   const std::filesystem::path temp_dir = GetTestTempDir(test_info_->name());
   const std::filesystem::path out_dir = temp_dir / "out_dir";
-  CHECK(std::filesystem::create_directory(out_dir));
+  FUZZTEST_CHECK(std::filesystem::create_directory(out_dir));
   const WorkDir workdir{temp_dir.c_str(), "fake_binary_name",
                         "fake_binary_hash", /*my_shard_index=*/0};
   const auto corpus_file_paths = workdir.CorpusFilePaths();
diff --git a/centipede/corpus_test.cc b/centipede/corpus_test.cc
index 13b576c..8975571 100644
--- a/centipede/corpus_test.cc
+++ b/centipede/corpus_test.cc
@@ -135,7 +135,7 @@
   EXPECT_EQ(corpus.Prune(fs, coverage_frontier, 1, rng), 1);
   EXPECT_EQ(corpus.NumActive(), 1);
   EXPECT_DEATH(corpus.Prune(fs, coverage_frontier, 0, rng),
-               "max_corpus_size");  // CHECK-fail.
+               "max_corpus_size");  // FUZZTEST_CHECK-fail.
   EXPECT_EQ(corpus.NumTotal(), 6);
 }
 
diff --git a/centipede/coverage.cc b/centipede/coverage.cc
index 28373ea..a5a96e2 100644
--- a/centipede/coverage.cc
+++ b/centipede/coverage.cc
@@ -25,13 +25,13 @@
 #include <vector>
 
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
 #include "absl/strings/str_split.h"
 #include "absl/synchronization/mutex.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/feature.h"
 #include "./centipede/pc_info.h"
 #include "./centipede/symbol_table.h"
+#include "./common/logging.h"
 #include "./common/remote_file.h"
 #include "./common/status_macros.h"
 
@@ -41,7 +41,7 @@
     : func_entries_(pc_table.size()),
       fully_covered_funcs_vec_(pc_table.size()),
       covered_pcs_vec_(pc_table.size()) {
-  CHECK_LT(pc_table.size(), std::numeric_limits<PCIndex>::max());
+  FUZZTEST_CHECK_LT(pc_table.size(), std::numeric_limits<PCIndex>::max());
   absl::flat_hash_set<PCIndex> covered_pcs(pci_vec.begin(), pci_vec.end());
   // Iterate though all the pc_table entries.
   // The first one is some function's kFuncEntry.
@@ -51,7 +51,7 @@
   // to fully_covered_funcs or uncovered_funcs correspondingly.
   // For all others add them to partially_covered_funcs.
   for (size_t this_func = 0; this_func < pc_table.size();) {
-    CHECK(pc_table[this_func].has_flag(PCInfo::kFuncEntry));
+    FUZZTEST_CHECK(pc_table[this_func].has_flag(PCInfo::kFuncEntry));
     func_entries_[this_func] = true;
     // Find next entry.
     size_t next_func = this_func + 1;
@@ -78,9 +78,10 @@
     } else if (pcf.covered.empty()) {
       uncovered_funcs.push_back(this_func);
     } else {
-      CHECK(!pcf.covered.empty());
-      CHECK(!pcf.uncovered.empty());
-      CHECK_EQ(pcf.covered.size() + pcf.uncovered.size(), num_func_pcs);
+      FUZZTEST_CHECK(!pcf.covered.empty());
+      FUZZTEST_CHECK(!pcf.uncovered.empty());
+      FUZZTEST_CHECK_EQ(pcf.covered.size() + pcf.uncovered.size(),
+                        num_func_pcs);
       partially_covered_funcs.push_back(pcf);
     }
     // Move to the next function.
@@ -92,46 +93,51 @@
                                 std::string_view filepath,
                                 std::string_view description) {
   auto *file = ValueOrDie(RemoteFileOpen(filepath, "w"));
-  CHECK(file != nullptr) << "Failed to open file: " << filepath;
-  CHECK_OK(RemoteFileSetWriteBufferSize(file, 100UL * 1024 * 1024));
+  FUZZTEST_CHECK(file != nullptr) << "Failed to open file: " << filepath;
+  FUZZTEST_CHECK_OK(RemoteFileSetWriteBufferSize(file, 100UL * 1024 * 1024));
   if (!description.empty()) {
-    CHECK_OK(RemoteFileAppend(file, "# "));
-    CHECK_OK(RemoteFileAppend(file, std::string{description}));
-    CHECK_OK(RemoteFileAppend(file, ":\n\n"));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, "# "));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, std::string{description}));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, ":\n\n"));
   }
   // Print symbolized function names for all covered functions.
   for (auto pc_index : fully_covered_funcs) {
-    CHECK_OK(RemoteFileAppend(file, "FULL: "));
-    CHECK_OK(RemoteFileAppend(file, symbols.full_description(pc_index)));
-    CHECK_OK(RemoteFileAppend(file, "\n"));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, "FULL: "));
+    FUZZTEST_CHECK_OK(
+        RemoteFileAppend(file, symbols.full_description(pc_index)));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, "\n"));
   }
-  CHECK_OK(RemoteFileFlush(file));
+  FUZZTEST_CHECK_OK(RemoteFileFlush(file));
   // Same for uncovered functions.
   for (auto pc_index : uncovered_funcs) {
-    CHECK_OK(RemoteFileAppend(file, "NONE: "));
-    CHECK_OK(RemoteFileAppend(file, symbols.full_description(pc_index)));
-    CHECK_OK(RemoteFileAppend(file, "\n"));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, "NONE: "));
+    FUZZTEST_CHECK_OK(
+        RemoteFileAppend(file, symbols.full_description(pc_index)));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, "\n"));
   }
-  CHECK_OK(RemoteFileFlush(file));
+  FUZZTEST_CHECK_OK(RemoteFileFlush(file));
   // For every partially covered function, first print its name,
   // then print its covered edges, then uncovered edges.
   for (auto &pcf : partially_covered_funcs) {
-    CHECK_OK(RemoteFileAppend(file, "PARTIAL: "));
-    CHECK_OK(RemoteFileAppend(file, symbols.full_description(pcf.covered[0])));
-    CHECK_OK(RemoteFileAppend(file, "\n"));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, "PARTIAL: "));
+    FUZZTEST_CHECK_OK(
+        RemoteFileAppend(file, symbols.full_description(pcf.covered[0])));
+    FUZZTEST_CHECK_OK(RemoteFileAppend(file, "\n"));
     for (auto pc_index : pcf.covered) {
-      CHECK_OK(RemoteFileAppend(file, "  + "));
-      CHECK_OK(RemoteFileAppend(file, symbols.full_description(pc_index)));
-      CHECK_OK(RemoteFileAppend(file, "\n"));
+      FUZZTEST_CHECK_OK(RemoteFileAppend(file, "  + "));
+      FUZZTEST_CHECK_OK(
+          RemoteFileAppend(file, symbols.full_description(pc_index)));
+      FUZZTEST_CHECK_OK(RemoteFileAppend(file, "\n"));
     }
     for (auto pc_index : pcf.uncovered) {
-      CHECK_OK(RemoteFileAppend(file, "  - "));
-      CHECK_OK(RemoteFileAppend(file, symbols.full_description(pc_index)));
-      CHECK_OK(RemoteFileAppend(file, "\n"));
+      FUZZTEST_CHECK_OK(RemoteFileAppend(file, "  - "));
+      FUZZTEST_CHECK_OK(
+          RemoteFileAppend(file, symbols.full_description(pc_index)));
+      FUZZTEST_CHECK_OK(RemoteFileAppend(file, "\n"));
     }
   }
-  CHECK_OK(RemoteFileFlush(file));
-  CHECK_OK(RemoteFileClose(file));
+  FUZZTEST_CHECK_OK(RemoteFileFlush(file));
+  FUZZTEST_CHECK_OK(RemoteFileClose(file));
 }
 
 std::string CoverageLogger::ObserveAndDescribeIfNew(PCIndex pc_index) {
@@ -215,7 +221,7 @@
     auto cyclomatic_comp = cfg.GetCyclomaticComplexity(callee);
     // Determine knob based on callee coverage kind.
     auto callee_idx = cfg.GetPcIndex(callee);
-    CHECK(cfg.BlockIsFunctionEntry(callee_idx));
+    FUZZTEST_CHECK(cfg.BlockIsFunctionEntry(callee_idx));
     auto coverage_multiplier = SelectMultiplierByCoverageKind(
         uncovered_knob, partially_covered_knob, fully_covered_knob, callee_idx,
         coverage);
diff --git a/centipede/coverage.h b/centipede/coverage.h
index 7e681c0..340027c 100644
--- a/centipede/coverage.h
+++ b/centipede/coverage.h
@@ -26,7 +26,6 @@
 
 #include "absl/base/thread_annotations.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
 #include "absl/synchronization/mutex.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/feature.h"
@@ -55,7 +54,7 @@
   // Returns true if the function is fully covered. pc_index is for a function
   // entry.
   bool FunctionIsFullyCovered(PCIndex pc_index) const {
-    CHECK(func_entries_[pc_index]);
+    FUZZTEST_CHECK(func_entries_[pc_index]);
     return fully_covered_funcs_vec_[pc_index];
   }
   // Returns true if the given basic block is covered. pc_index is for any BB.
diff --git a/centipede/distill.cc b/centipede/distill.cc
index 1b16a2b..74ecf67 100644
--- a/centipede/distill.cc
+++ b/centipede/distill.cc
@@ -30,8 +30,6 @@
 
 #include "absl/base/thread_annotations.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_join.h"
 #include "absl/synchronization/mutex.h"
@@ -136,9 +134,10 @@
   CorpusEltVec ReadShard(size_t shard_idx) {
     const auto corpus_path = workdir_.CorpusFilePaths().Shard(shard_idx);
     const auto features_path = workdir_.FeaturesFilePaths().Shard(shard_idx);
-    VLOG(1) << log_prefix_ << "reading input shard " << shard_idx << ":\n"
-            << VV(corpus_path) << "\n"
-            << VV(features_path);
+    FUZZTEST_VLOG(1) << log_prefix_ << "reading input shard " << shard_idx
+                     << ":\n"
+                     << VV(corpus_path) << "\n"
+                     << VV(features_path);
     CorpusEltVec elts;
     // Read elements from the current shard.
     fuzztest::internal::ReadShard(  //
@@ -171,8 +170,9 @@
         features_path_{workdir_.DistilledFeaturesFilePaths().MyShard()},
         corpus_writer_{DefaultBlobFileWriterFactory()},
         feature_writer_{DefaultBlobFileWriterFactory()} {
-    CHECK_OK(corpus_writer_->Open(corpus_path_, append ? "a" : "w"));
-    CHECK_OK(feature_writer_->Open(features_path_, append ? "a" : "w"));
+    FUZZTEST_CHECK_OK(corpus_writer_->Open(corpus_path_, append ? "a" : "w"));
+    FUZZTEST_CHECK_OK(
+        feature_writer_->Open(features_path_, append ? "a" : "w"));
   }
 
   virtual ~CorpusShardWriter() = default;
@@ -184,10 +184,10 @@
 
   void WriteBatch(CorpusEltVec elts) {
     absl::MutexLock lock(&mu_);
-    VLOG(1) << log_prefix_ << "writing " << elts.size()
-            << " elements to output shard:\n"
-            << VV(corpus_path_) << "\n"
-            << VV(features_path_);
+    FUZZTEST_VLOG(1) << log_prefix_ << "writing " << elts.size()
+                     << " elements to output shard:\n"
+                     << VV(corpus_path_) << "\n"
+                     << VV(features_path_);
     for (auto &elt : elts) {
       WriteEltImpl(std::move(elt));
     }
@@ -214,8 +214,9 @@
     const auto preprocessed_elt = PreprocessElt(std::move(elt));
     if (preprocessed_elt.has_value()) {
       // Append to the distilled corpus and features files.
-      CHECK_OK(corpus_writer_->Write(preprocessed_elt->input));
-      CHECK_OK(feature_writer_->Write(preprocessed_elt->PackedFeatures()));
+      FUZZTEST_CHECK_OK(corpus_writer_->Write(preprocessed_elt->input));
+      FUZZTEST_CHECK_OK(
+          feature_writer_->Write(preprocessed_elt->PackedFeatures()));
       ++stats_.num_written_elts;
     }
   }
@@ -337,9 +338,9 @@
     DistillingInputFilter &input_filter,       //
     ResourcePool<RUsageMemory> &ram_pool,      //
     int parallelism) {
-  LOG(INFO) << LogPrefix(env) << "Distilling to output shard "
-            << env.my_shard_index << "; input shard indices:\n"
-            << absl::StrJoin(shard_indices, ", ");
+  FUZZTEST_LOG(INFO) << LogPrefix(env) << "Distilling to output shard "
+                     << env.my_shard_index << "; input shard indices:\n"
+                     << absl::StrJoin(shard_indices, ", ");
 
   // Read and write the shards in parallel, but gate reading of each on the
   // availability of free RAM to keep the peak RAM usage under control.
@@ -360,7 +361,7 @@
              /*mem_rss=*/reader.EstimateRamFootprint(shard_idx)},
             /*timeout=*/kRamLeaseTimeout,
         });
-        CHECK_OK(ram_lease.status());
+        FUZZTEST_CHECK_OK(ram_lease.status());
 
         CorpusEltVec shard_elts = reader.ReadShard(shard_idx);
         // Reverse the order of elements. The intuition is as follows:
@@ -371,23 +372,25 @@
         std::reverse(shard_elts.begin(), shard_elts.end());
         writer.WriteBatch(std::move(shard_elts));
         const CorpusShardWriter::Stats shard_stats = writer.GetStats();
-        LOG(INFO) << LogPrefix(env)
-                  << "batches: " << shard_stats.num_written_batches << "/"
-                  << num_shards << " inputs: " << shard_stats.num_total_elts
-                  << " written: " << shard_stats.num_written_elts;
+        FUZZTEST_LOG(INFO) << LogPrefix(env)
+                           << "batches: " << shard_stats.num_written_batches
+                           << "/" << num_shards
+                           << " inputs: " << shard_stats.num_total_elts
+                           << " written: " << shard_stats.num_written_elts;
       });
     }
   }  // The threads join here.
 
-  LOG(INFO) << LogPrefix(env) << "Done distilling to output shard "
-            << env.my_shard_index;
+  FUZZTEST_LOG(INFO) << LogPrefix(env) << "Done distilling to output shard "
+                     << env.my_shard_index;
 }
 
 int Distill(const Environment &env, const DistillOptions &opts) {
-  RPROF_THIS_FUNCTION_WITH_TIMELAPSE(                                      //
-      /*enable=*/ABSL_VLOG_IS_ON(1),                                       //
-      /*timelapse_interval=*/absl::Seconds(ABSL_VLOG_IS_ON(2) ? 10 : 60),  //
-      /*also_log_timelapses=*/ABSL_VLOG_IS_ON(10));
+  RPROF_THIS_FUNCTION_WITH_TIMELAPSE(                   //
+      /*enable=*/FUZZTEST_VLOG_IS_ON(1),                //
+                                                        /*timelapse_interval=*/
+      absl::Seconds(FUZZTEST_VLOG_IS_ON(2) ? 10 : 60),  //
+      /*also_log_timelapses=*/FUZZTEST_VLOG_IS_ON(10));
 
   // Prepare the per-thread envs.
   std::vector<Environment> envs_per_thread(env.num_threads, env);
@@ -423,16 +426,16 @@
     PeriodicAction progress_logger{
         [&input_filter]() {
           const auto stats = input_filter.GetStats();
-          LOG(INFO) << LogPrefix() << stats.coverage_str
-                    << " inputs: " << stats.num_total_elts
-                    << " unique: " << stats.num_byte_unique_elts
-                    << " distilled: " << stats.num_feature_unique_elts;
+          FUZZTEST_LOG(INFO) << LogPrefix() << stats.coverage_str
+                             << " inputs: " << stats.num_total_elts
+                             << " unique: " << stats.num_byte_unique_elts
+                             << " distilled: " << stats.num_feature_unique_elts;
         },
         // Seeing 0's at the beginning is not interesting, unless debugging.
         // Likewise, increase the frequency --v >= 1 to aid debugging.
         PeriodicAction::ConstDelayConstInterval(
-            absl::Seconds(ABSL_VLOG_IS_ON(1) ? 0 : 60),
-            absl::Seconds(ABSL_VLOG_IS_ON(1) ? 10 : 60)),
+            absl::Seconds(FUZZTEST_VLOG_IS_ON(1) ? 0 : 60),
+            absl::Seconds(FUZZTEST_VLOG_IS_ON(1) ? 10 : 60)),
     };
     // The RAM pool shared between all the `DistillToOneOutputShard()` threads.
     ResourcePool ram_pool{kRamQuota};
diff --git a/centipede/distill_test.cc b/centipede/distill_test.cc
index 2d88010..047f67f 100644
--- a/centipede/distill_test.cc
+++ b/centipede/distill_test.cc
@@ -25,7 +25,6 @@
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/flags/reflection.h"
-#include "absl/log/check.h"
 #include "./centipede/corpus_io.h"
 #include "./centipede/environment.h"
 #include "./centipede/feature.h"
@@ -33,6 +32,7 @@
 #include "./centipede/workdir.h"
 #include "./common/blob_file.h"
 #include "./common/defs.h"
+#include "./common/logging.h"
 #include "./common/test_util.h"
 
 namespace fuzztest::internal {
@@ -70,10 +70,10 @@
   const auto features_path = wd.FeaturesFilePaths().Shard(shard_index);
   const auto corpus_appender = DefaultBlobFileWriterFactory(env.riegeli);
   const auto features_appender = DefaultBlobFileWriterFactory(env.riegeli);
-  CHECK_OK(corpus_appender->Open(corpus_path, "a"));
-  CHECK_OK(features_appender->Open(features_path, "a"));
-  CHECK_OK(corpus_appender->Write(record.input));
-  CHECK_OK(features_appender->Write(
+  FUZZTEST_CHECK_OK(corpus_appender->Open(corpus_path, "a"));
+  FUZZTEST_CHECK_OK(features_appender->Open(features_path, "a"));
+  FUZZTEST_CHECK_OK(corpus_appender->Write(record.input));
+  FUZZTEST_CHECK_OK(features_appender->Write(
       PackFeaturesAndHash(record.input, record.feature_vec)));
 }
 
diff --git a/centipede/environment.cc b/centipede/environment.cc
index 443a611..16da62c 100644
--- a/centipede/environment.cc
+++ b/centipede/environment.cc
@@ -27,8 +27,6 @@
 #include "absl/base/no_destructor.h"
 #include "absl/container/flat_hash_map.h"
 #include "absl/flags/marshalling.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_split.h"
 #include "absl/strings/string_view.h"
@@ -46,7 +44,7 @@
 namespace {
 
 size_t ComputeTimeoutPerBatch(size_t timeout_per_input, size_t batch_size) {
-  CHECK_GT(batch_size, 0);
+  FUZZTEST_CHECK_GT(batch_size, 0);
   // NOTE: If `timeout_per_input` == 0, leave `timeout_per_batch` at 0 too:
   // the implementation interprets both as "no limit".
   if (timeout_per_input == 0) return 0;
@@ -117,18 +115,19 @@
 
 // Returns true if `value` is one of "1", "true".
 // Returns true if `value` is one of "0", "false".
-// CHECK-fails otherwise.
+// FUZZTEST_CHECK-fails otherwise.
 static bool GetBoolFlag(std::string_view value) {
   if (value == "0" || value == "false") return false;
-  CHECK(value == "1" || value == "true") << value;
+  FUZZTEST_CHECK(value == "1" || value == "true") << value;
   return true;
 }
 
-// Returns `value` as a size_t, CHECK-fails on parse error.
+// Returns `value` as a size_t, FUZZTEST_CHECK-fails on parse error.
 static size_t GetIntFlag(std::string_view value) {
   size_t result{};
-  CHECK(std::from_chars(value.data(), value.data() + value.size(), result).ec ==
-        std::errc())
+  FUZZTEST_CHECK(
+      std::from_chars(value.data(), value.data() + value.size(), result).ec ==
+      std::errc())
       << value;
   return result;
 }
@@ -169,7 +168,8 @@
     return;
   }
 
-  LOG(FATAL) << "Unknown flag for experiment: " << name << "=" << value;
+  FUZZTEST_LOG(FATAL) << "Unknown flag for experiment: " << name << "="
+                      << value;
 }
 
 void Environment::UpdateForExperiment() {
@@ -183,7 +183,7 @@
   std::vector<Experiment> experiments;
   for (auto flag : absl::StrSplit(this->experiment, ':', absl::SkipEmpty())) {
     std::vector<std::string> flag_and_value = absl::StrSplit(flag, '=');
-    CHECK_EQ(flag_and_value.size(), 2) << flag;
+    FUZZTEST_CHECK_EQ(flag_and_value.size(), 2) << flag;
     experiments.emplace_back(
         Experiment{flag_and_value[0], absl::StrSplit(flag_and_value[1], ',')});
   }
@@ -191,15 +191,15 @@
   // Count the number of flag combinations.
   size_t num_combinations = 1;
   for (const auto &exp : experiments) {
-    CHECK_NE(exp.flag_values.size(), 0) << exp.flag_name;
+    FUZZTEST_CHECK_NE(exp.flag_values.size(), 0) << exp.flag_name;
     num_combinations *= exp.flag_values.size();
   }
-  CHECK_GT(num_combinations, 0);
-  CHECK_EQ(num_threads % num_combinations, 0)
+  FUZZTEST_CHECK_GT(num_combinations, 0);
+  FUZZTEST_CHECK_EQ(num_threads % num_combinations, 0)
       << VV(num_threads) << VV(num_combinations);
 
   // Update the flags for the current shard and compute experiment_name.
-  CHECK_LT(my_shard_index, num_threads);
+  FUZZTEST_CHECK_LT(my_shard_index, num_threads);
   size_t my_combination_num = my_shard_index % num_combinations;
   experiment_name.clear();
   experiment_flags.clear();
@@ -228,14 +228,14 @@
   if (knobs_file_path.empty()) return;
   ByteArray knob_bytes;
   auto *f = ValueOrDie(RemoteFileOpen(knobs_file, "r"));
-  CHECK(f) << "Failed to open remote file " << knobs_file;
-  CHECK_OK(RemoteFileRead(f, knob_bytes));
-  CHECK_OK(RemoteFileClose(f));
-  VLOG(1) << "Knobs: " << knob_bytes.size() << " knobs read from "
-          << knobs_file;
+  FUZZTEST_CHECK(f) << "Failed to open remote file " << knobs_file;
+  FUZZTEST_CHECK_OK(RemoteFileRead(f, knob_bytes));
+  FUZZTEST_CHECK_OK(RemoteFileClose(f));
+  FUZZTEST_VLOG(1) << "Knobs: " << knob_bytes.size() << " knobs read from "
+                   << knobs_file;
   knobs.Set(knob_bytes);
   knobs.ForEachKnob([](std::string_view name, Knobs::value_type value) {
-    VLOG(1) << "knob " << name << ": " << static_cast<uint32_t>(value);
+    FUZZTEST_VLOG(1) << "knob " << name << ": " << static_cast<uint32_t>(value);
   });
 }
 
@@ -248,11 +248,11 @@
   // enough.
   if (max_num_crash_reports == Default().max_num_crash_reports) {
     max_num_crash_reports = 20;
-    LOG(INFO) << "Overriding the default max_num_crash_reports to "
-              << max_num_crash_reports << " for FuzzTest.";
+    FUZZTEST_LOG(INFO) << "Overriding the default max_num_crash_reports to "
+                       << max_num_crash_reports << " for FuzzTest.";
   }
   if (config.jobs != 0) {
-    CHECK(j == Default().j || j == config.jobs)
+    FUZZTEST_CHECK(j == Default().j || j == config.jobs)
         << "Value for --j is inconsistent with the value for jobs in the "
            "target binary:"
         << VV(j) << VV(config.jobs);
@@ -266,7 +266,7 @@
       [&](absl::Duration duration, absl::string_view duration_name) -> size_t {
     if (duration == absl::InfiniteDuration()) return 0;
     // Centipede's time-related fields are in seconds, so we need at least 1s.
-    CHECK_GE(duration, absl::Seconds(1))
+    FUZZTEST_CHECK_GE(duration, absl::Seconds(1))
         << duration_name << " must not be less than one second";
     return static_cast<size_t>(absl::ToInt64Seconds(duration));
   };
@@ -274,9 +274,9 @@
   // Update `timeout_per_input` and consequently `timeout_per_batch`.
   const size_t time_limit_per_input_sec =
       convert_to_seconds(config.time_limit_per_input, "Time limit per input");
-  CHECK(timeout_per_input == 0 ||
-        timeout_per_input == Default().timeout_per_input ||
-        timeout_per_input == time_limit_per_input_sec)
+  FUZZTEST_CHECK(timeout_per_input == 0 ||
+                 timeout_per_input == Default().timeout_per_input ||
+                 timeout_per_input == time_limit_per_input_sec)
       << "Value for --timeout_per_input is inconsistent with the value for "
          "time_limit_per_input in the target binary:"
       << VV(timeout_per_input) << VV(config.time_limit_per_input);
@@ -300,8 +300,8 @@
   constexpr auto bytes_to_mb = [](size_t bytes) {
     return bytes == 0 ? 0 : (bytes - 1) / 1024 / 1024 + 1;
   };
-  CHECK(rss_limit_mb == Default().rss_limit_mb ||
-        rss_limit_mb == bytes_to_mb(config.rss_limit))
+  FUZZTEST_CHECK(rss_limit_mb == Default().rss_limit_mb ||
+                 rss_limit_mb == bytes_to_mb(config.rss_limit))
       << "Value for --rss_limit_mb is inconsistent with the value for "
          "rss_limit in the target binary:"
       << VV(rss_limit_mb) << VV(config.rss_limit);
@@ -311,8 +311,8 @@
   constexpr auto bytes_to_kb = [](size_t bytes) {
     return bytes == 0 ? 0 : (bytes - 1) / 1024 + 1;
   };
-  CHECK(stack_limit_kb == Default().stack_limit_kb ||
-        stack_limit_kb == bytes_to_kb(config.stack_limit))
+  FUZZTEST_CHECK(stack_limit_kb == Default().stack_limit_kb ||
+                 stack_limit_kb == bytes_to_kb(config.stack_limit))
       << "Value for --stack_limit_kb is inconsistent with the value for "
          "stack_limit in the target binary:"
       << VV(stack_limit_kb) << VV(config.stack_limit);
@@ -327,8 +327,8 @@
 void Environment::UpdateTimeoutPerBatchIfEqualTo(size_t val) {
   if (timeout_per_batch != val) return;
   timeout_per_batch = ComputeTimeoutPerBatch(timeout_per_input, batch_size);
-  VLOG(1) << "--timeout_per_batch auto-computed: " << timeout_per_batch
-          << " sec (see --help for details)";
+  FUZZTEST_VLOG(1) << "--timeout_per_batch auto-computed: " << timeout_per_batch
+                   << " sec (see --help for details)";
 }
 
 void Environment::UpdateBinaryHashIfEmpty() {
diff --git a/centipede/environment.h b/centipede/environment.h
index aeaeb44..4871fc8 100644
--- a/centipede/environment.h
+++ b/centipede/environment.h
@@ -56,7 +56,7 @@
   Knobs knobs;  // Read from a file by `ReadKnobsFileIfSpecified`, see knobs.h.
 
   // Defines internal logging level. Set to zero to reduce logging in tests.
-  // TODO(ussuri): Retire in favor of VLOGs?
+  // TODO(ussuri): Retire in favor of FUZZTEST_VLOGs?
   size_t log_level = 1;
 
   // Path to a file with PCs. This file is created and the field is set in
@@ -103,7 +103,7 @@
   //   shard 5 will have {foo=2,bar=30},
   // and so on.
   //
-  // CHECK-fails if the `--experiment` flag is not well-formed,
+  // FUZZTEST_CHECK-fails if the `--experiment` flag is not well-formed,
   // or if num_threads is not a multiple of the number of flag combinations
   // (which is 6 in this example).
   //
@@ -113,7 +113,7 @@
   // which means "value #0 is used for foo and value #1 is used for bar".
   void UpdateForExperiment();
 
-  // Sets flag 'name' to `value` for an experiment. CHECK-fails on
+  // Sets flag 'name' to `value` for an experiment. FUZZTEST_CHECK-fails on
   // invalid name/value combination. Used in `UpdateForExperiment()`.
   void SetFlagForExperiment(std::string_view name, std::string_view value);
 
@@ -121,9 +121,9 @@
 
   // Reads `knobs` from `knobs_file`. Does nothing if the `knobs_file` is empty.
   void ReadKnobsFileIfSpecified();
-  // Updates `this` with `config` obtained from the target binary. CHECK-fails
-  // if the fields are non-default and inconsistent with the corresponding
-  // values in `config`.
+  // Updates `this` with `config` obtained from the target binary.
+  // FUZZTEST_CHECK-fails if the fields are non-default and inconsistent with
+  // the corresponding values in `config`.
   void UpdateWithTargetConfig(const fuzztest::internal::Configuration& config);
   // If `timeout_per_batch` is `val`, computes it as a function of
   // `timeout_per_input` and `batch_size` and updates it. Otherwise, leaves it
diff --git a/centipede/environment_flags.cc b/centipede/environment_flags.cc
index 72b3d1c..8db3381 100644
--- a/centipede/environment_flags.cc
+++ b/centipede/environment_flags.cc
@@ -20,8 +20,6 @@
 #include <vector>
 
 #include "absl/flags/flag.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/match.h"
 #include "absl/strings/str_split.h"
 #include "absl/time/clock.h"
@@ -64,7 +62,7 @@
 absl::Time GetStopAtTime(absl::Time stop_at, absl::Duration stop_after) {
   const bool stop_at_is_non_default = stop_at != absl::InfiniteFuture();
   const bool stop_after_is_non_default = stop_after != absl::InfiniteDuration();
-  CHECK_LE(stop_at_is_non_default + stop_after_is_non_default, 1)
+  FUZZTEST_CHECK_LE(stop_at_is_non_default + stop_after_is_non_default, 1)
       << "At most one of --stop_at and --stop_after should be specified, "
          "including via --config file: "
       << VV(stop_at) << VV(stop_after);
@@ -106,12 +104,12 @@
     env_from_flags.num_threads = j;
     env_from_flags.my_shard_index = 0;
   }
-  CHECK_GE(env_from_flags.total_shards, 1);
-  CHECK_GE(env_from_flags.batch_size, 1);
-  CHECK_GE(env_from_flags.num_threads, 1);
-  CHECK_LE(env_from_flags.num_threads, env_from_flags.total_shards);
-  CHECK_LE(env_from_flags.my_shard_index + env_from_flags.num_threads,
-           env_from_flags.total_shards)
+  FUZZTEST_CHECK_GE(env_from_flags.total_shards, 1);
+  FUZZTEST_CHECK_GE(env_from_flags.batch_size, 1);
+  FUZZTEST_CHECK_GE(env_from_flags.num_threads, 1);
+  FUZZTEST_CHECK_LE(env_from_flags.num_threads, env_from_flags.total_shards);
+  FUZZTEST_CHECK_LE(env_from_flags.my_shard_index + env_from_flags.num_threads,
+                    env_from_flags.total_shards)
       << VV(env_from_flags.my_shard_index) << VV(env_from_flags.num_threads);
 
   if (!argv.empty()) {
@@ -126,7 +124,8 @@
         env_from_flags.clang_coverage_binary);
 
   if (absl::StrContains(env_from_flags.binary, "@@")) {
-    LOG(INFO) << "@@ detected; running in standalone mode with batch_size=1";
+    FUZZTEST_LOG(INFO)
+        << "@@ detected; running in standalone mode with batch_size=1";
     env_from_flags.has_input_wildcards = true;
     env_from_flags.batch_size = 1;
     // TODO(kcc): do we need to check if extra_binaries have @@?
diff --git a/centipede/environment_test.cc b/centipede/environment_test.cc
index f78c1be..a906b99 100644
--- a/centipede/environment_test.cc
+++ b/centipede/environment_test.cc
@@ -18,8 +18,8 @@
 #include <string_view>
 
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/configuration.h"
 
 namespace fuzztest::internal {
@@ -152,7 +152,7 @@
   fuzztest::internal::Configuration config;
   config.time_limit = absl::Seconds(123);
   config.time_budget_type = fuzztest::internal::TimeBudgetType::kPerTest;
-  CHECK(config.GetTimeLimitPerTest() == absl::Seconds(123));
+  FUZZTEST_CHECK(config.GetTimeLimitPerTest() == absl::Seconds(123));
   env.UpdateWithTargetConfig(config);
   EXPECT_EQ(env.timeout_per_batch, 123)
       << "`timeout_per_batch` should be set to the test time limit when it was "
diff --git a/centipede/feature.h b/centipede/feature.h
index 80cee6b..e69d756 100644
--- a/centipede/feature.h
+++ b/centipede/feature.h
@@ -22,7 +22,7 @@
 //
 // This library must not depend on anything other than libc so that fuzz targets
 // using it doesn't gain redundant coverage. For the same reason this library
-// uses raw __builtin_trap instead of CHECKs.
+// uses raw __builtin_trap instead of FUZZTEST_CHECKs.
 // We make an exception for <algorithm> for std::sort/std::unique,
 // since <algorithm> is very lightweight.
 // This library is also header-only, with all functions defined as inline.
diff --git a/centipede/feature_set.cc b/centipede/feature_set.cc
index 09d9361..f13cc5a 100644
--- a/centipede/feature_set.cc
+++ b/centipede/feature_set.cc
@@ -21,7 +21,6 @@
 #include <string>
 #include <string_view>
 
-#include "absl/log/check.h"
 #include "absl/strings/str_cat.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/feature.h"
@@ -102,10 +101,10 @@
     // The less frequent is the domain, the more valuable are its features.
     auto domain_id = feature_domains::Domain::FeatureToDomainId(feature);
     auto features_in_domain = features_per_domain_[domain_id];
-    CHECK(features_in_domain);
+    FUZZTEST_CHECK(features_in_domain);
     auto domain_weight = num_features_ / features_in_domain;
     auto feature_frequency = frequencies_[feature];
-    CHECK_GT(feature_frequency, 0)
+    FUZZTEST_CHECK_GT(feature_frequency, 0)
         << VV(feature) << VV(domain_id) << VV(features_in_domain)
         << VV(domain_weight) << VV((int)feature_frequency) << DebugString();
     weight += domain_weight * (256 / feature_frequency);
diff --git a/centipede/feature_set.h b/centipede/feature_set.h
index ce05712..59a5341 100644
--- a/centipede/feature_set.h
+++ b/centipede/feature_set.h
@@ -22,10 +22,10 @@
 #include <ostream>
 #include <string>
 
-#include "absl/log/log.h"
 #include "./centipede/control_flow.h"
 #include "./centipede/feature.h"
 #include "./centipede/util.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -111,7 +111,7 @@
     size_t domain_id = feature_domains::Domain::FeatureToDomainId(feature);
     // TODO(b/385774476): Remove this check once the root cause is fixed.
     if (domain_id >= feature_domains::kNumDomains) {
-      LOG(ERROR) << "Unexpected feature with id: " << feature;
+      FUZZTEST_LOG(WARNING) << "Unexpected feature with id: " << feature;
       return true;
     }
     return should_discard_domain_.test(domain_id);
diff --git a/centipede/hashed_ring_buffer.h b/centipede/hashed_ring_buffer.h
index f7bc646..86d555c 100644
--- a/centipede/hashed_ring_buffer.h
+++ b/centipede/hashed_ring_buffer.h
@@ -22,7 +22,7 @@
 //
 // This library must not depend on anything other than libc so that fuzz targets
 // using it doesn't gain redundant coverage. For the same reason this library
-// uses raw __builtin_trap instead of CHECKs.
+// uses raw __builtin_trap instead of FUZZTEST_CHECKs.
 // We make an exception for <algorithm> for std::sort/std::unique,
 // since <algorithm> is very lightweight.
 // This library is also header-only, with all functions defined as inline.
@@ -69,7 +69,8 @@
   // Resets the current state, sets the ring buffer size to `size_` (<= kSize).
   void Reset(size_t size) {
     memset(this, 0, sizeof(*this));
-    if (size > kSize) __builtin_trap();  // can't use CHECK in the runner.
+    if (size > kSize)
+      __builtin_trap();  // can't use FUZZTEST_CHECK in the runner.
     size_ = size;
     hash_.Reset(size);
   }
diff --git a/centipede/minimize_crash.cc b/centipede/minimize_crash.cc
index a9c081f..66d417a 100644
--- a/centipede/minimize_crash.cc
+++ b/centipede/minimize_crash.cc
@@ -23,8 +23,6 @@
 #include <vector>
 
 #include "absl/base/thread_annotations.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/synchronization/mutex.h"
 #include "./centipede/centipede_callbacks.h"
 #include "./centipede/environment.h"
@@ -65,7 +63,7 @@
   // The crasher must be smaller than the original one.
   void AddCrasher(ByteArray crasher) {
     absl::MutexLock lock(&mutex_);
-    CHECK_LT(crasher.size(), crashers_.front().size());
+    FUZZTEST_CHECK_LT(crasher.size(), crashers_.front().size());
     crashers_.emplace_back(crasher);
     // Write the crasher to disk.
     auto hash = Hash(crasher);
@@ -96,13 +94,14 @@
 
   size_t num_batches = env.num_runs / env.batch_size;
   for (size_t i = 0; i < num_batches; ++i) {
-    LOG_EVERY_POW_2(INFO) << "[" << i << "] Minimizing... Interrupt to stop";
+    FUZZTEST_LOG_EVERY_POW_2(INFO)
+        << "[" << i << "] Minimizing... Interrupt to stop";
     if (ShouldStop()) break;
     // Get up to kMaxNumCrashersToGet most recent crashers. We don't want just
     // the most recent crasher to avoid being stuck in local minimum.
     constexpr size_t kMaxNumCrashersToGet = 20;
     const auto recent_crashers = queue.GetRecentCrashers(kMaxNumCrashersToGet);
-    CHECK(!recent_crashers.empty());
+    FUZZTEST_CHECK(!recent_crashers.empty());
     // Compute the minimal known crasher size.
     size_t min_known_size = recent_crashers.front().size();
     for (const auto &crasher : recent_crashers) {
@@ -125,10 +124,10 @@
     // Execute all mutants. If a new crasher is found, add it to `queue`.
     if (!callbacks->Execute(env.binary, smaller_mutants, batch_result)) {
       size_t crash_inputs_idx = batch_result.num_outputs_read();
-      CHECK_LT(crash_inputs_idx, smaller_mutants.size());
+      FUZZTEST_CHECK_LT(crash_inputs_idx, smaller_mutants.size());
       const auto &new_crasher = smaller_mutants[crash_inputs_idx];
-      LOG(INFO) << "Crasher: size: " << new_crasher.size() << ": "
-                << AsPrintableString(new_crasher, /*max_len=*/40);
+      FUZZTEST_LOG(INFO) << "Crasher: size: " << new_crasher.size() << ": "
+                         << AsPrintableString(new_crasher, /*max_len=*/40);
       queue.AddCrasher(new_crasher);
     }
   }
@@ -139,17 +138,17 @@
   ScopedCentipedeCallbacks scoped_callback(callbacks_factory, env);
   auto callbacks = scoped_callback.callbacks();
 
-  LOG(INFO) << "MinimizeCrash: trying the original crashy input";
+  FUZZTEST_LOG(INFO) << "MinimizeCrash: trying the original crashy input";
 
   BatchResult batch_result;
   ByteArray original_crashy_input(crashy_input.begin(), crashy_input.end());
   if (callbacks->Execute(env.binary, {original_crashy_input}, batch_result)) {
-    LOG(INFO) << "The original crashy input did not crash; exiting";
+    FUZZTEST_LOG(INFO) << "The original crashy input did not crash; exiting";
     return EXIT_FAILURE;
   }
 
-  LOG(INFO) << "Starting the crash minimization loop in " << env.num_threads
-            << "threads";
+  FUZZTEST_LOG(INFO) << "Starting the crash minimization loop in "
+                     << env.num_threads << "threads";
 
   MinimizerWorkQueue queue(WorkDir{env}.CrashReproducerDirPaths().MyShard(),
                            original_crashy_input);
diff --git a/centipede/pc_info.cc b/centipede/pc_info.cc
index 9d99cb5..bbabced 100644
--- a/centipede/pc_info.cc
+++ b/centipede/pc_info.cc
@@ -20,9 +20,9 @@
 #include <ostream>
 #include <string>
 
-#include "absl/log/check.h"
 #include "absl/types/span.h"
 #include "./common/defs.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -34,11 +34,11 @@
   std::string input_string(std::istreambuf_iterator<char>(in), {});
 
   ByteArray pc_infos_as_bytes(input_string.begin(), input_string.end());
-  CHECK_EQ(pc_infos_as_bytes.size() % sizeof(PCInfo), 0);
+  FUZZTEST_CHECK_EQ(pc_infos_as_bytes.size() % sizeof(PCInfo), 0);
   size_t pc_table_size = pc_infos_as_bytes.size() / sizeof(PCInfo);
   const auto *pc_infos = reinterpret_cast<PCInfo *>(pc_infos_as_bytes.data());
   PCTable pc_table{pc_infos, pc_infos + pc_table_size};
-  CHECK_EQ(pc_table.size(), pc_table_size);
+  FUZZTEST_CHECK_EQ(pc_table.size(), pc_table_size);
 
   return pc_table;
 }
diff --git a/centipede/periodic_action.h b/centipede/periodic_action.h
index 302d9a0..8af5b21 100644
--- a/centipede/periodic_action.h
+++ b/centipede/periodic_action.h
@@ -19,7 +19,7 @@
 // Example:
 //   MyStats stats = ...;
 //   PeriodicAction stats_logger{
-//       [&stats]() { LOG(INFO) << "Current stats are: " << stats; },
+//       [&stats]() { FUZZTEST_LOG(INFO) << "Current stats are: " << stats; },
 //       {.delay = absl::Minutes(5), .interval = absl::Minutes(1)}
 //   };
 //   while (true) {
diff --git a/centipede/resource_pool.cc b/centipede/resource_pool.cc
index 28a2aec..a499a8f 100644
--- a/centipede/resource_pool.cc
+++ b/centipede/resource_pool.cc
@@ -19,14 +19,13 @@
 #include <thread>  // NOLINT: For thread IDs.
 #include <utility>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_cat.h"
 #include "absl/synchronization/mutex.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
 #include "./centipede/rusage_stats.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -44,7 +43,7 @@
 
 template <typename ResourceT>
 ResourcePool<ResourceT>::LeaseToken::~LeaseToken() {
-  CHECK(status_checked_)  //
+  FUZZTEST_CHECK(status_checked_)  //
       << "status() was never consulted by caller: " << *this;
   if (status_.ok()) {
     leaser_.ReturnLease(*this);
@@ -88,18 +87,18 @@
 template <typename ResourceT>
 ResourcePool<ResourceT>::ResourcePool(const ResourceT& quota)
     : quota_{quota}, pool_{quota} {
-  LOG(INFO) << "Creating pool with quota=[" << quota.ShortStr() << "]";
+  FUZZTEST_LOG(INFO) << "Creating pool with quota=[" << quota.ShortStr() << "]";
 }
 
 template <typename ResourceT>
 typename ResourcePool<ResourceT>::LeaseToken
 ResourcePool<ResourceT>::AcquireLeaseBlocking(LeaseRequest&& request) {
-  if (ABSL_VLOG_IS_ON(1)) {
+  if (FUZZTEST_VLOG_IS_ON(1)) {
     absl::ReaderMutexLock lock{&pool_mu_};
-    VLOG(1) << "Received lease request " << request.id           //
-            << "\nrequested: " << request.amount.FormattedStr()  //
-            << "\nquota:     " << quota_.FormattedStr()          //
-            << "\navailable: " << pool_.FormattedStr();
+    FUZZTEST_VLOG(1) << "Received lease request " << request.id           //
+                     << "\nrequested: " << request.amount.FormattedStr()  //
+                     << "\nquota:     " << quota_.FormattedStr()          //
+                     << "\navailable: " << pool_.FormattedStr();
   }
 
   if (request.amount == ResourceT::Zero()) {
@@ -123,7 +122,7 @@
     pool_mu_.AssertReaderHeld();
     const bool got_pool = request.amount <= pool_;
     if (!got_pool) {
-      VLOG(10)                                                     //
+      FUZZTEST_VLOG(10)                                            //
           << "Pending lease '" << request.id << "':"               //
           << "\nreq age   : " << request.age()                     //
           << "\navailable : " << pool_.FormattedStr()              //
@@ -138,7 +137,7 @@
   // the timeout is reached, proceed to the else-branch.
   if (pool_mu_.LockWhenWithTimeout(  //
           absl::Condition{&got_enough_free_pool}, request.timeout)) {
-    VLOG(1)                                                    //
+    FUZZTEST_VLOG(1)                                           //
         << "Granting lease " << request.id                     //
         << "\nreq age : " << request.age()                     //
         << "\nbefore  : " << pool_.FormattedStr()              //
@@ -161,7 +160,7 @@
 template <typename ResourceT>
 void ResourcePool<ResourceT>::ReturnLease(const LeaseToken& lease) {
   absl::WriterMutexLock lock{&pool_mu_};
-  VLOG(1)                                                              //
+  FUZZTEST_VLOG(1)                                                     //
       << "Returning lease " << lease.request().id                      //
       << "\nreq age   : " << lease.request().age()                     //
       << "\nlease age : " << lease.age()                               //
diff --git a/centipede/resource_pool.h b/centipede/resource_pool.h
index 241150f..c33a8ff 100644
--- a/centipede/resource_pool.h
+++ b/centipede/resource_pool.h
@@ -76,7 +76,7 @@
 //                 .amount = RUsageMemory{.mem_rss = EstimateShardPeakRss()},
 //                 .timeout = absl::Minutes(10),
 //             });
-//         CHECK_OK(rss_lease.status());
+//         FUZZTEST_CHECK_OK(rss_lease.status());
 //         ...
 //       }
 //       // `rss_lease` dtor returns the leased RSS to `rss_pool` and unblocks
@@ -138,7 +138,7 @@
 
     // The outcome of resource acquisition (ie. of
     // `ResourcePool::AcquireLeaseBlocking()`). Must be consulted by the client
-    // at least once, otherwise the dtor will CHECK.
+    // at least once, otherwise the dtor will FUZZTEST_CHECK.
     const absl::Status& status() const;
     // The originating request.
     const LeaseRequest& request() const;
diff --git a/centipede/resource_pool_test.cc b/centipede/resource_pool_test.cc
index 23bf03b..c5b3f5e 100644
--- a/centipede/resource_pool_test.cc
+++ b/centipede/resource_pool_test.cc
@@ -21,7 +21,6 @@
 #include <utility>
 
 #include "gtest/gtest.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
diff --git a/centipede/runner_fork_server.cc b/centipede/runner_fork_server.cc
index 7467f94..db99a7e 100644
--- a/centipede/runner_fork_server.cc
+++ b/centipede/runner_fork_server.cc
@@ -84,8 +84,8 @@
 }
 
 // Maybe writes the `reason` to stderr; then calls _exit. We use this instead of
-// CHECK/RunnerCheck since the fork server runs at the very early stage of the
-// process, where the logging functions used there may not work.
+// FUZZTEST_CHECK/RunnerCheck since the fork server runs at the very early stage
+// of the process, where the logging functions used there may not work.
 void Exit(const char *absl_nonnull reason) {
   Log(reason);
   _exit(0);  // The exit code does not matter, it won't be checked anyway.
diff --git a/centipede/runner_utils.h b/centipede/runner_utils.h
index ff3b044..efa2b10 100644
--- a/centipede/runner_utils.h
+++ b/centipede/runner_utils.h
@@ -26,7 +26,7 @@
 // as it is a more common pattern.
 void PrintErrorAndExitIf(bool condition, const char* absl_nonnull error);
 
-// A rough equivalent of "CHECK(condition) << error;".
+// A rough equivalent of "FUZZTEST_CHECK(condition) << error;".
 inline void RunnerCheck(bool condition, const char* absl_nonnull error) {
   PrintErrorAndExitIf(!condition, error);
 }
diff --git a/centipede/rusage_profiler.cc b/centipede/rusage_profiler.cc
index ae99463..a8b2ec4 100644
--- a/centipede/rusage_profiler.cc
+++ b/centipede/rusage_profiler.cc
@@ -29,8 +29,6 @@
 #include "absl/base/attributes.h"
 #include "absl/base/const_init.h"
 #include "absl/base/nullability.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
 #include "absl/synchronization/mutex.h"
@@ -38,6 +36,7 @@
 #include "absl/time/time.h"
 #include "./centipede/periodic_action.h"
 #include "./centipede/rusage_stats.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -102,7 +101,7 @@
 
 const RUsageProfiler::Snapshot& RUsageProfiler::Snapshot::Log() const {
   if (id >= 0) {
-    LOG(INFO).AtLocation(location.file, location.line)
+    FUZZTEST_LOG(INFO).AtLocation(location.file, location.line)
         << "PROFILER [P." << profiler_id << (profiler_desc.empty() ? "" : " ")
         << profiler_desc << "] SNAPSHOT [S." << id << (title.empty() ? "" : " ")
         << title << "]:\n"
@@ -214,7 +213,7 @@
         low_water >= kZero ? 0 :
         std::floor(std::abs(low_water / notch_size));
     // clang-format on
-    CHECK_GE(kBarNotches, notch_zero);
+    FUZZTEST_CHECK_GE(kBarNotches, notch_zero);
     // Print a zero mark only if a delta metric goes negative.
     std::string zero_mark = low_water < kZero ? "|" : "";
 
@@ -231,7 +230,7 @@
           notch_size == kZero
               ? kBarNotches : std::floor((current - low_water) / notch_size);
       // clang-format on
-      CHECK_GE(kBarNotches, notches);
+      FUZZTEST_CHECK_GE(kBarNotches, notches);
 
       if (!is_delta) {
         // Non-delta metrics can't go negative, so the bar always looks like
@@ -422,7 +421,7 @@
     bool also_log,                    //
     std::string title) {
   absl::WriterMutexLock lock{&mutex_};
-  CHECK(!timelapse_recorder_) << "StopTimelapse() wasn't called";
+  FUZZTEST_CHECK(!timelapse_recorder_) << "StopTimelapse() wasn't called";
   timelapse_recorder_ = std::make_unique<PeriodicAction>(
       [this, loc = std::move(loc), title = std::move(title), also_log]() {
         const auto& s = TakeSnapshot(loc, title);
@@ -433,7 +432,7 @@
 
 void RUsageProfiler::StopTimelapse() {
   absl::WriterMutexLock lock{&mutex_};
-  CHECK(timelapse_recorder_) << "StartTimelapse() wasn't called";
+  FUZZTEST_CHECK(timelapse_recorder_) << "StartTimelapse() wasn't called";
   timelapse_recorder_.reset();
 }
 
@@ -441,30 +440,31 @@
     SourceLocation loc, const std::string& title) {
   if (metrics_ == kMetricsOff) return;
 
-  // Logs streamed-in text to LOG(INFO), while dropping the usual log prefix
-  // (date/time/thread/source). LOG()'s limit on the size of a single message
-  // applies to one streamed text fragment only (if needed, this can be reduced
-  // even further to a single line of text in a fragment): this is the main
-  // purpose of this class, as profiling reports can get very long. especially
-  // with automatic timelapse snapshotting.
+  // Logs streamed-in text to FUZZTEST_LOG(INFO), while dropping the usual log
+  // prefix (date/time/thread/source). FUZZTEST_LOG()'s limit on the size of a
+  // single message applies to one streamed text fragment only (if needed, this
+  // can be reduced even further to a single line of text in a fragment): this
+  // is the main purpose of this class, as profiling reports can get very long.
+  // especially with automatic timelapse snapshotting.
   class ReportLogger final : public ReportSink {
    public:
     ReportLogger(SourceLocation loc) : loc_{loc} {}
 
     ~ReportLogger() override {
       if (!buffer_.empty()) {
-        LOG(INFO).AtLocation(loc_.file, loc_.line).NoPrefix() << buffer_;
+        FUZZTEST_LOG(INFO).AtLocation(loc_.file, loc_.line).NoPrefix()
+            << buffer_;
       }
     }
 
     ReportLogger& operator<<(std::string_view fragment) override {
       const auto last_newline = fragment.rfind('\n');
       if (last_newline == std::string_view::npos) {
-        // Accumulate no-'\n' fragments: LOG() always wraps around.
+        // Accumulate no-'\n' fragments: FUZZTEST_LOG() always wraps around.
         buffer_ += fragment;
       } else {
         // Now we can log, but save the last bit of text
-        LOG(INFO).AtLocation(loc_.file, loc_.line).NoPrefix()
+        FUZZTEST_LOG(INFO).AtLocation(loc_.file, loc_.line).NoPrefix()
             << buffer_ << fragment.substr(0, last_newline);
         buffer_ = fragment.substr(last_newline + 1);
       }
@@ -476,7 +476,7 @@
     std::string buffer_;
   };
 
-  LOG(INFO).AtLocation(loc.file, loc.line) << title << "\n";
+  FUZZTEST_LOG(INFO).AtLocation(loc.file, loc.line) << title << "\n";
   ReportLogger report_logger{loc};
   GenerateReport(&report_logger);
 }
diff --git a/centipede/rusage_profiler.h b/centipede/rusage_profiler.h
index 7e12b96..a45e6d3 100644
--- a/centipede/rusage_profiler.h
+++ b/centipede/rusage_profiler.h
@@ -106,18 +106,21 @@
 //    ...
 //    profiler.TakeSnapshot(ABSL_LOC).Log();  // Records and logs a snapshot
 //    ...
-//    VLOG(1) << profiler.TakeSnapshot(ABSL_LOC);  // A different way to log
+//    FUZZTEST_VLOG(1) << profiler.TakeSnapshot(ABSL_LOC);  // A different way
+//    to log
 //    ...
 //  }  // Dtor logs a final snapshot
 //
 //                           EXAMPLE USAGE - MACROS
 //
 //  void foo() {
-//    RPROF_THIS_FUNCTION(VLOG_IS_ON(2));  // Profile the function @ --v>=2
+//    RPROF_THIS_FUNCTION(FUZZTEST_VLOG_IS_ON(2));  // Profile the function @
+//    --v>=2
 //    ...
-//    RPROF_SNAPSHOT_AND_LOG();  // Record and log a function-level snapshot
-//    for (...) {
-//        RPROF_THIS_SCOPE(VLOG_IS_ON(3));  // Profile loop iterations @ --v>=3
+//    RPROF_SNAPSHOT_AND_FUZZTEST_LOG();  // Record and log a function-level
+//    snapshot for (...) {
+//        RPROF_THIS_SCOPE(FUZZTEST_VLOG_IS_ON(3));  // Profile loop iterations
+//        @ --v>=3
 //        ...
 //    }
 //    RPROF_SNAPSHOT();  // Record (not log) another function-level snapshot
@@ -261,9 +264,9 @@
     // table-like formatting.
     std::string ShortMetricsStr() const;
 
-    // Logs this snapshot to LOG(INFO). The source location that annotates the
-    // log message is set to `location` instead of the actual call's location.
-    // Returns *this so clients can do either of
+    // Logs this snapshot to FUZZTEST_LOG(INFO). The source location that
+    // annotates the log message is set to `location` instead of the actual
+    // call's location. Returns *this so clients can do either of
     //   Snapshot s = profiler.TakeSnapshot();
     //   Snapshot s = profiler.TakeSnapshot().Log();
     const Snapshot& Log() const;
@@ -289,8 +292,8 @@
   };
 
   // An abstract interface used to stream in a profiling report in
-  // GenerateReport(). Also used inside PrintReport() to overcome the LOG()'s
-  // limitation on the size of a single printed message.
+  // GenerateReport(). Also used inside PrintReport() to overcome the
+  // FUZZTEST_LOG()'s limitation on the size of a single printed message.
   class ReportSink {
    public:
     virtual ~ReportSink() = default;
@@ -529,7 +532,7 @@
 // earlier RPROF_THIS_FUNCTION() in the same function. An optional snapshot
 // title can be passed as a macro argument.
 // clang-format off
-#define RPROF_SNAPSHOT_AND_LOG(...) \
+#define RPROF_SNAPSHOT_AND_FUZZTEST_LOG(...) \
   FUNCTION_LEVEL_RPROF_NAME.TakeSnapshot( \
       {__FILE__, __LINE__}, ##__VA_ARGS__).Log()
 // clang-format on
@@ -550,7 +553,7 @@
 // RPROF_THIS_FUNCTION in the same function. An optional report title can be
 // passed as a macro argument.
 // clang-format off
-#define RPROF_DUMP_REPORT_TO_LOG(...) \
+#define RPROF_DUMP_REPORT_TO_FUZZTEST_LOG(...) \
   FUNCTION_LEVEL_RPROF_NAME.PrintReport({__FILE__, __LINE__}, ##__VA_ARGS__)
 // clang-format on
 
diff --git a/centipede/rusage_profiler_test.cc b/centipede/rusage_profiler_test.cc
index 3960dd4..c8c0b9f 100644
--- a/centipede/rusage_profiler_test.cc
+++ b/centipede/rusage_profiler_test.cc
@@ -23,10 +23,10 @@
 
 #include "gtest/gtest.h"
 #include "absl/flags/flag.h"
-#include "absl/log/log.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
 #include "./centipede/rusage_stats.h"
+#include "./common/logging.h"
 
 ABSL_FLAG(bool, verbose, false, "Print extra info for debugging");
 ABSL_FLAG(bool, enable_system_load_sensitive_tests, false,
@@ -99,7 +99,7 @@
   RPROF_START_TIMELAPSE(absl::Seconds(1), /*also_log=*/true, "Timelapse");
   WasteTimeAndGobbleBytes();
   RPROF_STOP_TIMELAPSE();
-  RPROF_DUMP_REPORT_TO_LOG("Report");
+  RPROF_DUMP_REPORT_TO_FUZZTEST_LOG("Report");
 }
 
 // NOTE: Exclude this test from MSAN: 1) MSAN messes with the system memory
@@ -144,16 +144,18 @@
   const RUsageMemory delta_memory = after_memory - before_memory;
 
   if (absl::GetFlag(FLAGS_verbose)) {
-    LOG(INFO) << "before_snapshot:\n" << before_snapshot.FormattedMetricsStr();
-    LOG(INFO) << "after_snapshot:\n" << after_snapshot.FormattedMetricsStr();
-    LOG(INFO) << "";
-    LOG(INFO) << "before_timing: " << before_timing.FormattedStr();
-    LOG(INFO) << "after_timing:  " << after_timing.FormattedStr();
-    LOG(INFO) << "delta_timing:  " << delta_timing.FormattedStr();
-    LOG(INFO) << "";
-    LOG(INFO) << "before_memory: " << before_memory.FormattedStr();
-    LOG(INFO) << "after_memory:  " << after_memory.FormattedStr();
-    LOG(INFO) << "delta_memory:  " << delta_memory.FormattedStr();
+    FUZZTEST_LOG(INFO) << "before_snapshot:\n"
+                       << before_snapshot.FormattedMetricsStr();
+    FUZZTEST_LOG(INFO) << "after_snapshot:\n"
+                       << after_snapshot.FormattedMetricsStr();
+    FUZZTEST_LOG(INFO) << "";
+    FUZZTEST_LOG(INFO) << "before_timing: " << before_timing.FormattedStr();
+    FUZZTEST_LOG(INFO) << "after_timing:  " << after_timing.FormattedStr();
+    FUZZTEST_LOG(INFO) << "delta_timing:  " << delta_timing.FormattedStr();
+    FUZZTEST_LOG(INFO) << "";
+    FUZZTEST_LOG(INFO) << "before_memory: " << before_memory.FormattedStr();
+    FUZZTEST_LOG(INFO) << "after_memory:  " << after_memory.FormattedStr();
+    FUZZTEST_LOG(INFO) << "delta_memory:  " << delta_memory.FormattedStr();
   }
 
   EXPECT_EQ(after_snapshot.delta_timing,
@@ -172,7 +174,8 @@
   EXPECT_SYS_TIMING_NEAR(after_snapshot.timing, after_timing);
   // EXPECT_SYS_TIMING_NEAR(after_snapshot.delta_timing, delta_timing);
 #else
-  LOG(WARNING) << "Validation of some test results omitted under *SANs";
+  FUZZTEST_LOG(WARNING)
+      << "Validation of some test results omitted under *SANs";
 #endif
 
   if (absl::GetFlag(FLAGS_enable_system_load_sensitive_tests)) {
@@ -207,7 +210,8 @@
     EXPECT_TIME_NEAR(snapshots[i].time - snapshots[i - 1].time, kInterval, .05);
   }
 #else
-  LOG(WARNING) << "Validation of some test results omitted under *SANs";
+  FUZZTEST_LOG(WARNING)
+      << "Validation of some test results omitted under *SANs";
 #endif
 }
 
@@ -232,7 +236,7 @@
    public:
     ~ReportCapture() override = default;
     ReportCapture& operator<<(std::string_view fragment) override {
-      LOG(INFO).NoPrefix() << fragment;
+      FUZZTEST_LOG(INFO).NoPrefix() << fragment;
       return *this;
     }
   };
diff --git a/centipede/rusage_stats.cc b/centipede/rusage_stats.cc
index 8ca674b..ec5df9d 100644
--- a/centipede/rusage_stats.cc
+++ b/centipede/rusage_stats.cc
@@ -39,11 +39,11 @@
 #include <thread>  // NOLINT: For hardware_concurrency() only.
 
 #include "absl/base/nullability.h"
-#include "absl/log/check.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -102,7 +102,7 @@
 
   // Returns a path to the /proc/<pid>/<file> or /proc/<pid>/task/<tid>/<file>.
   [[nodiscard]] const std::string& GetProcFilePath(ProcFile file) const {
-    CHECK_LT(file, proc_file_paths_.size());
+    FUZZTEST_CHECK_LT(file, proc_file_paths_.size());
     return proc_file_paths_[file];
   }
 
@@ -366,7 +366,8 @@
   int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, scope.info().pid()};
   struct kinfo_proc info = {};
   size_t size = sizeof(info);
-  CHECK(sysctl(mib, sizeof(mib) / sizeof(mib[0]), &info, &size, NULL, 0) == 0)
+  FUZZTEST_CHECK(
+      sysctl(mib, sizeof(mib) / sizeof(mib[0]), &info, &size, NULL, 0) == 0)
       << "Error getting process information: " << strerror(errno);
   cpu_utilization = info.kp_proc.p_pctcpu;
 #else   // __APPLE__
@@ -429,7 +430,7 @@
 }
 
 RUsageTiming operator/(const RUsageTiming& t, int64_t div) {
-  CHECK_NE(div, 0);
+  FUZZTEST_CHECK_NE(div, 0);
   // NOTE: Can't use RUsageTimingOp() as this operation is asymmetrical.
   // clang-format off
   return RUsageTiming{
@@ -519,13 +520,13 @@
 #ifdef __APPLE__
   if (scope.info().pid() != getpid()) return {};
   struct proc_taskinfo pti = {};
-  CHECK(proc_pidinfo(scope.info().pid(), PROC_PIDTASKINFO, 0, &pti,
-                     PROC_PIDTASKINFO_SIZE) == PROC_PIDTASKINFO_SIZE)
+  FUZZTEST_CHECK(proc_pidinfo(scope.info().pid(), PROC_PIDTASKINFO, 0, &pti,
+                              PROC_PIDTASKINFO_SIZE) == PROC_PIDTASKINFO_SIZE)
       << "Unable to get system resource information";
   vsize = pti.pti_virtual_size;
   rss = pti.pti_resident_size;
   struct rusage rusage = {};
-  CHECK(getrusage(RUSAGE_SELF, &rusage) == 0)
+  FUZZTEST_CHECK(getrusage(RUSAGE_SELF, &rusage) == 0)
       << "Failed to get memory stats by getrusage";
   // `data` and `shared` are not supported in MacOS.
   // MacOS does not have a builtin way to query the peak size of virtual memory.
@@ -608,7 +609,7 @@
 }
 
 RUsageMemory operator/(const RUsageMemory& m, int64_t div) {
-  CHECK_NE(div, 0);
+  FUZZTEST_CHECK_NE(div, 0);
   // NOTE: Can't use RUsageMemoryOp() as this operation is asymmetrical.
   // clang-format off
   return RUsageMemory{
diff --git a/centipede/rusage_stats.h b/centipede/rusage_stats.h
index ad6d04e..d0d1cde 100644
--- a/centipede/rusage_stats.h
+++ b/centipede/rusage_stats.h
@@ -31,8 +31,8 @@
 #include <ostream>
 #include <string>
 
-#include "absl/log/check.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -78,7 +78,7 @@
 
   const PlatformInfo& info() const {
     // This can fail only when called after the object is moved.
-    CHECK(info_ != nullptr);
+    FUZZTEST_CHECK(info_ != nullptr);
     return *info_;
   }
 
diff --git a/centipede/rusage_stats_test.cc b/centipede/rusage_stats_test.cc
index 6d4ea55..69d1a76 100644
--- a/centipede/rusage_stats_test.cc
+++ b/centipede/rusage_stats_test.cc
@@ -23,7 +23,6 @@
 #include "gtest/gtest.h"
 #include "absl/base/nullability.h"
 #include "absl/flags/flag.h"
-#include "absl/log/log.h"
 #include "absl/synchronization/barrier.h"
 #include "absl/synchronization/mutex.h"
 #include "absl/synchronization/notification.h"
@@ -208,9 +207,9 @@
     }
 
     if (absl::GetFlag(FLAGS_verbose)) {
-      LOG(INFO) << "before: " << before;
-      LOG(INFO) << "after:  " << after;
-      LOG(INFO) << "delta:  " << delta;
+      FUZZTEST_LOG(INFO) << "before: " << before;
+      FUZZTEST_LOG(INFO) << "after:  " << after;
+      FUZZTEST_LOG(INFO) << "delta:  " << delta;
     }
 
     EXPECT_EQ(delta.user_time, after.user_time - before.user_time);
@@ -220,10 +219,10 @@
 
   if (absl::GetFlag(FLAGS_enable_system_load_sensitive_tests)) {
     if (absl::GetFlag(FLAGS_verbose)) {
-      LOG(INFO) << "user_time_histo:\n" << user_time_histo;
-      LOG(INFO) << "cpu_util_histo:\n" << cpu_util_histo;
-      LOG(INFO) << "wall_time_histo:\n" << wall_time_histo;
-      LOG(INFO) << "cpu_cores_histo:\n" << cpu_cores_histo;
+      FUZZTEST_LOG(INFO) << "user_time_histo:\n" << user_time_histo;
+      FUZZTEST_LOG(INFO) << "cpu_util_histo:\n" << cpu_util_histo;
+      FUZZTEST_LOG(INFO) << "wall_time_histo:\n" << wall_time_histo;
+      FUZZTEST_LOG(INFO) << "cpu_cores_histo:\n" << cpu_cores_histo;
     }
 
     EXPECT_NEAR(  //
@@ -260,9 +259,9 @@
     const auto delta = after - before;
 
     if (absl::GetFlag(FLAGS_verbose)) {
-      LOG(INFO) << "before: " << before;
-      LOG(INFO) << "after:  " << after;
-      LOG(INFO) << "delta:  " << delta;
+      FUZZTEST_LOG(INFO) << "before: " << before;
+      FUZZTEST_LOG(INFO) << "after:  " << after;
+      FUZZTEST_LOG(INFO) << "delta:  " << delta;
     }
 
 // NOTE: The sanitizers heavily instrument the code and skew any time
@@ -280,15 +279,16 @@
     EXPECT_LE(before.mem_rss, before.mem_vsize);
     EXPECT_LE(after.mem_rss, after.mem_vsize);
 #else
-    LOG(WARNING) << "Validation of test results omitted under *SAN: see code";
+    FUZZTEST_LOG(WARNING)
+        << "Validation of test results omitted under *SAN: see code";
 #endif
     mem_rss_histo.Add(delta.mem_rss);
     mem_data_histo.Add(delta.mem_data);
   }
 
   if (absl::GetFlag(FLAGS_verbose)) {
-    LOG(INFO) << "mem_rss_histo:\n" << mem_rss_histo;
-    LOG(INFO) << "mem_data_histo:\n" << mem_data_histo;
+    FUZZTEST_LOG(INFO) << "mem_rss_histo:\n" << mem_rss_histo;
+    FUZZTEST_LOG(INFO) << "mem_data_histo:\n" << mem_data_histo;
   }
 
 // NOTE: The sanitizers heavily instrument the code and skew any time
@@ -302,22 +302,19 @@
   EXPECT_NEAR(mem_data_histo.Average(), kBytes, kDataLeeway) << mem_data_histo;
 #endif
 #else
-  LOG(WARNING) << "Validation of test results omitted under *SAN: see code";
+  FUZZTEST_LOG(WARNING)
+      << "Validation of test results omitted under *SAN: see code";
 #endif
 }
 
 TEST(RUsageMemoryTest, BadScope) {
   constexpr pid_t kBadPid = 999999999;
   EXPECT_NO_FATAL_FAILURE(  //
-      const auto timing =
-          RUsageTiming::Snapshot(RUsageScope::Process(kBadPid));
-      VLOG(1) << "Timing: " << timing;
-  );
+      const auto timing = RUsageTiming::Snapshot(RUsageScope::Process(kBadPid));
+      FUZZTEST_VLOG(1) << "Timing: " << timing;);
   EXPECT_NO_FATAL_FAILURE(  //
-      const auto memory =
-          RUsageMemory::Snapshot(RUsageScope::Process(kBadPid));
-      VLOG(1) << "Memory: " << memory;
-  );
+      const auto memory = RUsageMemory::Snapshot(RUsageScope::Process(kBadPid));
+      FUZZTEST_VLOG(1) << "Memory: " << memory;);
 }
 
 TEST(RUsageTimingTest, ConstantsAndMath) {
diff --git a/centipede/seed_corpus_maker.cc b/centipede/seed_corpus_maker.cc
index 695ce07..01830d8 100644
--- a/centipede/seed_corpus_maker.cc
+++ b/centipede/seed_corpus_maker.cc
@@ -18,35 +18,35 @@
 
 #include "absl/base/nullability.h"
 #include "absl/flags/flag.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "./centipede/config_init.h"
 #include "./centipede/seed_corpus_maker_flags.h"
 #include "./centipede/seed_corpus_maker_proto_lib.h"
 #include "./centipede/util.h"
+#include "./common/logging.h"
 #include "./common/remote_file.h"
 
 int main(int argc, char** absl_nonnull argv) {
   (void)fuzztest::internal::InitRuntime(argc, argv);
 
   const std::string config = absl::GetFlag(FLAGS_config);
-  QCHECK(!config.empty());
+  FUZZTEST_QCHECK(!config.empty());
   const std::string override_out_dir = absl::GetFlag(FLAGS_override_out_dir);
   const std::string binary_path = absl::GetFlag(FLAGS_coverage_binary_path);
   const std::string binary_name = std::filesystem::path{binary_path}.filename();
-  QCHECK(!binary_name.empty())
+  FUZZTEST_QCHECK(!binary_name.empty())
       << "--coverage_binary_path yields empty basename";
   std::string binary_hash = absl::GetFlag(FLAGS_coverage_binary_hash);
   if (binary_hash.empty()) {
-    QCHECK(fuzztest::internal::RemotePathExists(binary_path))
+    FUZZTEST_QCHECK(fuzztest::internal::RemotePathExists(binary_path))
         << "--coverage_binary_path doesn't exist";
     binary_hash = fuzztest::internal::HashOfFileContents(binary_path);
-    LOG(INFO) << "--coverage_binary_hash was not provided: computed "
-              << binary_hash
-              << " from actual file at --coverage_binary_path=" << binary_path;
+    FUZZTEST_LOG(INFO) << "--coverage_binary_hash was not provided: computed "
+                       << binary_hash
+                       << " from actual file at --coverage_binary_path="
+                       << binary_path;
   }
 
-  QCHECK_OK(fuzztest::internal::GenerateSeedCorpusFromConfigProto(  //
+  FUZZTEST_QCHECK_OK(fuzztest::internal::GenerateSeedCorpusFromConfigProto(  //
       config, binary_name, binary_hash, override_out_dir));
 
   return EXIT_SUCCESS;
diff --git a/centipede/seed_corpus_maker_lib.cc b/centipede/seed_corpus_maker_lib.cc
index 0a3c701..f1f588f 100644
--- a/centipede/seed_corpus_maker_lib.cc
+++ b/centipede/seed_corpus_maker_lib.cc
@@ -37,8 +37,6 @@
 #include <vector>
 
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/random/random.h"
 #include "absl/status/status.h"
 #include "absl/strings/match.h"
@@ -71,7 +69,7 @@
 
 std::string ShardPathsForLogging(  //
     const std::string& corpus_fname, const std::string& features_fname) {
-  if (ABSL_VLOG_IS_ON(3)) {
+  if (FUZZTEST_VLOG_IS_ON(3)) {
     return absl::StrCat(  //
         ":\nCorpus:  ", corpus_fname, "\nFeatures:", features_fname);
   }
@@ -93,13 +91,15 @@
                      coverage_binary_name, ", and ", coverage_binary_hash));
   }
 
-  RPROF_THIS_FUNCTION_WITH_TIMELAPSE(                                      //
-      /*enable=*/ABSL_VLOG_IS_ON(1),                                       //
-      /*timelapse_interval=*/absl::Seconds(ABSL_VLOG_IS_ON(2) ? 10 : 60),  //
-      /*also_log_timelapses=*/ABSL_VLOG_IS_ON(10));
+  RPROF_THIS_FUNCTION_WITH_TIMELAPSE(                   //
+      /*enable=*/FUZZTEST_VLOG_IS_ON(1),                //
+                                                        /*timelapse_interval=*/
+      absl::Seconds(FUZZTEST_VLOG_IS_ON(2) ? 10 : 60),  //
+      /*also_log_timelapses=*/FUZZTEST_VLOG_IS_ON(10));
 
-  LOG(INFO) << "Reading/sampling seed corpus elements from source glob: "
-            << source.dir_glob;
+  FUZZTEST_LOG(INFO)
+      << "Reading/sampling seed corpus elements from source glob: "
+      << source.dir_glob;
 
   // Find `source.dir_glob()`-matching dirs and pick at most
   // `source.num_recent_dirs()` most recent ones.
@@ -109,14 +109,14 @@
       !match_status.ok() && !absl::IsNotFound(match_status)) {
     return match_status;
   }
-  LOG(INFO) << "Found " << src_dirs.size() << " corpus dir(s) matching "
-            << source.dir_glob;
+  FUZZTEST_LOG(INFO) << "Found " << src_dirs.size()
+                     << " corpus dir(s) matching " << source.dir_glob;
   // Sort in the ascending lexicographical order. We expect that dir names
   // contain timestamps and therefore will be sorted from oldest to newest.
   std::sort(src_dirs.begin(), src_dirs.end(), std::less<std::string>());
   if (source.num_recent_dirs < src_dirs.size()) {
     src_dirs.erase(src_dirs.begin(), src_dirs.end() - source.num_recent_dirs);
-    LOG(INFO) << "Selected " << src_dirs.size() << " corpus dir(s)";
+    FUZZTEST_LOG(INFO) << "Selected " << src_dirs.size() << " corpus dir(s)";
   }
 
   // Find all the corpus shard and individual input files in the found dirs.
@@ -130,16 +130,16 @@
       const std::string glob = fs::path{dir} / source.shard_rel_glob;
       const auto match_status = RemoteGlobMatch(glob, matched_fnames);
       if (!match_status.ok() && !absl::IsNotFound(match_status)) {
-        LOG(ERROR) << "Got error when glob-matching in " << dir << ": "
-                   << match_status;
+        FUZZTEST_LOG(ERROR) << "Got error when glob-matching in " << dir << ": "
+                            << match_status;
       } else {
         current_corpus_shard_fnames.insert(matched_fnames.begin(),
                                            matched_fnames.end());
         corpus_shard_fnames.insert(corpus_shard_fnames.end(),
                                    matched_fnames.begin(),
                                    matched_fnames.end());
-        LOG(INFO) << "Found " << matched_fnames.size() << " shard(s) matching "
-                  << glob;
+        FUZZTEST_LOG(INFO) << "Found " << matched_fnames.size()
+                           << " shard(s) matching " << glob;
       }
     }
     if (!source.individual_input_rel_glob.empty()) {
@@ -147,8 +147,8 @@
       const std::string glob = fs::path{dir} / source.individual_input_rel_glob;
       const auto match_status = RemoteGlobMatch(glob, matched_fnames);
       if (!match_status.ok() && !absl::IsNotFound(match_status)) {
-        LOG(ERROR) << "Got error when glob-matching in " << dir << ": "
-                   << match_status;
+        FUZZTEST_LOG(ERROR) << "Got error when glob-matching in " << dir << ": "
+                            << match_status;
       } else {
         size_t num_added_individual_inputs = 0;
         for (auto& fname : matched_fnames) {
@@ -157,17 +157,18 @@
           ++num_added_individual_inputs;
           individual_input_fnames.push_back(std::move(fname));
         }
-        LOG(INFO) << "Found " << num_added_individual_inputs
-                  << " individual input(s) with glob " << glob;
+        FUZZTEST_LOG(INFO) << "Found " << num_added_individual_inputs
+                           << " individual input(s) with glob " << glob;
       }
     }
   }
-  LOG(INFO) << "Found " << corpus_shard_fnames.size() << " shard(s) and "
-            << individual_input_fnames.size()
-            << " individual input(s) total in source " << source.dir_glob;
+  FUZZTEST_LOG(INFO) << "Found " << corpus_shard_fnames.size()
+                     << " shard(s) and " << individual_input_fnames.size()
+                     << " individual input(s) total in source "
+                     << source.dir_glob;
 
   if (corpus_shard_fnames.empty() && individual_input_fnames.empty()) {
-    LOG(WARNING) << "Skipping empty source " << source.dir_glob;
+    FUZZTEST_LOG(WARNING) << "Skipping empty source " << source.dir_glob;
     return absl::OkStatus();
   }
 
@@ -205,8 +206,8 @@
                 ? work_dir.DistilledFeaturesFilePaths().MyShard()
                 : "";
 
-        VLOG(2) << "Reading elements from source shard " << shard
-                << ShardPathsForLogging(corpus_fname, features_fname);
+        FUZZTEST_VLOG(2) << "Reading elements from source shard " << shard
+                         << ShardPathsForLogging(corpus_fname, features_fname);
 
         ReadShard(corpus_fname, features_fname,
                   [shard, &shard_elts, &shard_elts_with_features](  //
@@ -219,21 +220,23 @@
                       ++shard_elts_with_features;
                     }
                     shard_elts.emplace_back(input, std::move(features));
-                    VLOG_EVERY_N(10, 100000)
+                    FUZZTEST_VLOG_EVERY_N(10, 100000)
                         << "Read " << shard_elts.size()
                         << " elements from shard " << shard << " so far";
                   });
 
-        LOG(INFO) << "Read " << shard_elts.size() << " elements ("
-                  << shard_elts_with_features
-                  << " with computed features) from source shard " << shard
-                  << ShardPathsForLogging(corpus_fname, features_fname);
+        FUZZTEST_LOG(INFO) << "Read " << shard_elts.size() << " elements ("
+                           << shard_elts_with_features
+                           << " with computed features) from source shard "
+                           << shard
+                           << ShardPathsForLogging(corpus_fname,
+                                                   features_fname);
       };
 
       threads.Schedule(read_shard);
     }
 
-    RPROF_SNAPSHOT_AND_LOG("Done reading shards");
+    RPROF_SNAPSHOT_AND_FUZZTEST_LOG("Done reading shards");
 
     src_elts.resize(individual_input_fnames.size());
     for (size_t index = 0; index < individual_input_fnames.size(); ++index) {
@@ -242,8 +245,8 @@
         const auto& path = individual_input_fnames[index];
         const auto read_status = RemoteFileGetContents(path, input);
         if (!read_status.ok()) {
-          LOG(WARNING) << "Skipping individual input path " << path
-                       << " due to read error: " << read_status;
+          FUZZTEST_LOG(WARNING) << "Skipping individual input path " << path
+                                << " due to read error: " << read_status;
           return;
         }
         src_elts[index] = {std::move(input), {}};
@@ -251,7 +254,7 @@
     }
   }
 
-  RPROF_SNAPSHOT_AND_LOG("Done reading");
+  RPROF_SNAPSHOT_AND_FUZZTEST_LOG("Done reading");
 
   size_t src_num_features = 0;
 
@@ -270,21 +273,22 @@
   src_elts_with_features_per_shard.clear();
   src_elts_with_features_per_shard.shrink_to_fit();
 
-  RPROF_SNAPSHOT_AND_LOG("Done merging");
+  RPROF_SNAPSHOT_AND_FUZZTEST_LOG("Done merging");
 
   // Remove empty inputs possibly due to read errors.
   auto remove_it =
       std::remove_if(src_elts.begin(), src_elts.end(),
                      [](const auto& elt) { return std::get<0>(elt).empty(); });
   if (remove_it != src_elts.end()) {
-    LOG(WARNING) << "Removed " << std::distance(remove_it, src_elts.end())
-                 << " empty inputs";
+    FUZZTEST_LOG(WARNING) << "Removed "
+                          << std::distance(remove_it, src_elts.end())
+                          << " empty inputs";
     src_elts.erase(remove_it, src_elts.end());
   }
 
-  LOG(INFO) << "Read total of " << src_elts.size() << " elements ("
-            << src_num_features << " with features) from source "
-            << source.dir_glob;
+  FUZZTEST_LOG(INFO) << "Read total of " << src_elts.size() << " elements ("
+                     << src_num_features << " with features) from source "
+                     << source.dir_glob;
 
   // Extract a sample of the elements of the size specified in
   // `source.sample_size`.
@@ -306,10 +310,10 @@
   }
 
   if (sample_size < src_elts.size()) {
-    LOG(INFO) << "Sampling " << sample_size << " elements out of "
-              << src_elts.size();
+    FUZZTEST_LOG(INFO) << "Sampling " << sample_size << " elements out of "
+                       << src_elts.size();
   } else {
-    LOG(INFO) << "Using all " << src_elts.size() << " elements";
+    FUZZTEST_LOG(INFO) << "Using all " << src_elts.size() << " elements";
   }
 
   // Extract a sample by shuffling the elements' indices and resizing to the
@@ -321,7 +325,7 @@
   std::shuffle(src_sample_idxs.begin(), src_sample_idxs.end(), absl::BitGen{});
   src_sample_idxs.resize(sample_size);
 
-  RPROF_SNAPSHOT_AND_LOG("Done sampling");
+  RPROF_SNAPSHOT_AND_FUZZTEST_LOG("Done sampling");
 
   // Now move each sampled element from `src_elts` to `elements`.
   elements.reserve(elements.size() + sample_size);
@@ -329,7 +333,7 @@
     elements.emplace_back(std::move(src_elts[idx]));
   }
 
-  RPROF_SNAPSHOT_AND_LOG("Done appending");
+  RPROF_SNAPSHOT_AND_FUZZTEST_LOG("Done appending");
   return absl::OkStatus();
 }
 
@@ -356,13 +360,15 @@
         "Unable to write seed corpus to empty destination path");
   }
 
-  RPROF_THIS_FUNCTION_WITH_TIMELAPSE(                                      //
-      /*enable=*/ABSL_VLOG_IS_ON(1),                                       //
-      /*timelapse_interval=*/absl::Seconds(ABSL_VLOG_IS_ON(2) ? 10 : 60),  //
-      /*also_log_timelapses=*/ABSL_VLOG_IS_ON(10));
+  RPROF_THIS_FUNCTION_WITH_TIMELAPSE(                   //
+      /*enable=*/FUZZTEST_VLOG_IS_ON(1),                //
+                                                        /*timelapse_interval=*/
+      absl::Seconds(FUZZTEST_VLOG_IS_ON(2) ? 10 : 60),  //
+      /*also_log_timelapses=*/FUZZTEST_VLOG_IS_ON(10));
 
-  LOG(INFO) << "Writing " << elements.size()
-            << " seed corpus elements to destination: " << destination.dir_path;
+  FUZZTEST_LOG(INFO) << "Writing " << elements.size()
+                     << " seed corpus elements to destination: "
+                     << destination.dir_path;
 
   if (destination.num_shards <= 0) {
     return absl::InvalidArgumentError(
@@ -379,7 +385,7 @@
   // first N shards.
   const size_t num_shards =
       std::min<size_t>(destination.num_shards, elements.size());
-  CHECK_GT(num_shards, 0);
+  FUZZTEST_CHECK_GT(num_shards, 0);
   const size_t shard_size = elements.size() / num_shards;
   std::vector<size_t> shard_sizes(num_shards, shard_size);
   const size_t excess_elts = elements.size() % num_shards;
@@ -402,7 +408,7 @@
       const auto elt_range_begin = shard_elt_it;
       std::advance(shard_elt_it, shard_size);
       const auto elt_range_end = shard_elt_it;
-      CHECK(shard_elt_it <= elements.cend()) << VV(shard);
+      FUZZTEST_CHECK(shard_elt_it <= elements.cend()) << VV(shard);
 
       const auto write_shard = [shard, elt_range_begin, elt_range_end,
                                 coverage_binary_name, coverage_binary_hash,
@@ -436,11 +442,12 @@
             work_dir.CorpusFilePaths().IsShard(corpus_fname)
                 ? work_dir.FeaturesFilePaths().MyShard()
                 : work_dir.DistilledFeaturesFilePaths().MyShard();
-        CHECK(!features_fname.empty());
+        FUZZTEST_CHECK(!features_fname.empty());
 
-        VLOG(2) << "Writing " << std::distance(elt_range_begin, elt_range_end)
-                << " elements to destination shard " << shard
-                << ShardPathsForLogging(corpus_fname, features_fname);
+        FUZZTEST_VLOG(2) << "Writing "
+                         << std::distance(elt_range_begin, elt_range_end)
+                         << " elements to destination shard " << shard
+                         << ShardPathsForLogging(corpus_fname, features_fname);
 
         // Features files are always saved in a subdir of the workdir
         // (== `destination.dir_path` here), which might not exist yet, so we
@@ -463,12 +470,12 @@
 
         const std::unique_ptr<BlobFileWriter> corpus_writer =
             DefaultBlobFileWriterFactory();
-        CHECK(corpus_writer != nullptr);
+        FUZZTEST_CHECK(corpus_writer != nullptr);
         RETURN_IF_NOT_OK(corpus_writer->Open(corpus_fname, "w"));
 
         const std::unique_ptr<BlobFileWriter> features_writer =
             DefaultBlobFileWriterFactory();
-        CHECK(features_writer != nullptr);
+        FUZZTEST_CHECK(features_writer != nullptr);
         RETURN_IF_NOT_OK(features_writer->Open(features_fname, "w"));
 
         // Write the shard's elements to the corpus and features shard files.
@@ -486,10 +493,12 @@
           }
         }
 
-        LOG(INFO) << "Wrote " << std::distance(elt_range_begin, elt_range_end)
-                  << " elements (" << shard_elts_with_features
-                  << " with features) to destination shard " << shard
-                  << ShardPathsForLogging(corpus_fname, features_fname);
+        FUZZTEST_LOG(INFO) << "Wrote "
+                           << std::distance(elt_range_begin, elt_range_end)
+                           << " elements (" << shard_elts_with_features
+                           << " with features) to destination shard " << shard
+                           << ShardPathsForLogging(corpus_fname,
+                                                   features_fname);
 
         dst_elts_with_features += shard_elts_with_features;
 
@@ -506,10 +515,10 @@
     RETURN_IF_NOT_OK(write_status);
   }
 
-  LOG(INFO) << "Wrote total of " << elements.size() << " elements ("
-            << dst_elts_with_features
-            << " with precomputed features) to destination "
-            << destination.dir_path;
+  FUZZTEST_LOG(INFO) << "Wrote total of " << elements.size() << " elements ("
+                     << dst_elts_with_features
+                     << " with precomputed features) to destination "
+                     << destination.dir_path;
   return absl::OkStatus();
 }
 
@@ -524,19 +533,19 @@
     RETURN_IF_NOT_OK(SampleSeedCorpusElementsFromSource(  //
         source, coverage_binary_name, coverage_binary_hash, elements));
   }
-  LOG(INFO) << "Sampled " << elements.size() << " elements from "
-            << config.sources.size() << " seed corpus source(s)";
+  FUZZTEST_LOG(INFO) << "Sampled " << elements.size() << " elements from "
+                     << config.sources.size() << " seed corpus source(s)";
 
   // Write the sampled elements to the destination.
   if (elements.empty()) {
-    LOG(WARNING)
+    FUZZTEST_LOG(WARNING)
         << "No elements to write to seed corpus destination - doing nothing";
   } else {
     RETURN_IF_NOT_OK(WriteSeedCorpusElementsToDestination(  //
         elements, coverage_binary_name, coverage_binary_hash,
         config.destination));
-    LOG(INFO) << "Wrote " << elements.size()
-              << " elements to seed corpus destination";
+    FUZZTEST_LOG(INFO) << "Wrote " << elements.size()
+                       << " elements to seed corpus destination";
   }
   return absl::OkStatus();
 }
diff --git a/centipede/seed_corpus_maker_lib_test.cc b/centipede/seed_corpus_maker_lib_test.cc
index 2be35f0..d749ca3 100644
--- a/centipede/seed_corpus_maker_lib_test.cc
+++ b/centipede/seed_corpus_maker_lib_test.cc
@@ -25,7 +25,6 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
 #include "absl/strings/str_cat.h"
 #include "./centipede/feature.h"
 #include "./centipede/workdir.h"
@@ -207,7 +206,7 @@
         /*shard_index_digits=*/kIdxDigits,
         /*num_shards=*/kNumShards,
     };
-    CHECK_OK(WriteSeedCorpusElementsToDestination(  //
+    FUZZTEST_CHECK_OK(WriteSeedCorpusElementsToDestination(  //
         kShardedInputs, kCovBin, kCovHash, destination));
     const std::string workdir = (test_dir / kRelDir).c_str();
     ASSERT_NO_FATAL_FAILURE(VerifyShardsExist(  //
@@ -218,7 +217,8 @@
   for (int i = 0; i < kIndividualInputs.size(); ++i) {
     const auto path = std::filesystem::path(test_dir) / kRelDir /
                       absl::StrCat("individual_input_", i);
-    CHECK_OK(RemoteFileSetContents(path.string(), kIndividualInputs[i]));
+    FUZZTEST_CHECK_OK(
+        RemoteFileSetContents(path.string(), kIndividualInputs[i]));
   }
 
   // Test that sharded and individual inputs matches what we wrote.
diff --git a/centipede/seed_corpus_maker_proto_lib.cc b/centipede/seed_corpus_maker_proto_lib.cc
index 80ae4c9..fd44c58 100644
--- a/centipede/seed_corpus_maker_proto_lib.cc
+++ b/centipede/seed_corpus_maker_proto_lib.cc
@@ -19,7 +19,6 @@
 #include <utility>
 #include <variant>
 
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "absl/strings/str_cat.h"
@@ -48,16 +47,18 @@
   }
 
   if (RemotePathExists(config_spec)) {
-    LOG(INFO) << "Config spec points at an existing file; trying to parse "
-                 "textproto config from it: "
-              << VV(config_spec);
+    FUZZTEST_LOG(INFO)
+        << "Config spec points at an existing file; trying to parse "
+           "textproto config from it: "
+        << VV(config_spec);
     RETURN_IF_NOT_OK(RemoteFileGetContents(config_spec, config_str));
-    LOG(INFO) << "Raw config read from file:\n" << config_str;
+    FUZZTEST_LOG(INFO) << "Raw config read from file:\n" << config_str;
     base_dir = std::filesystem::path{config_spec}.parent_path();
   } else {
-    LOG(INFO) << "Config spec is not a file, or file doesn't exist; trying to "
-                 "parse textproto config verbatim: "
-              << VV(config_spec);
+    FUZZTEST_LOG(INFO)
+        << "Config spec is not a file, or file doesn't exist; trying to "
+           "parse textproto config verbatim: "
+        << VV(config_spec);
     config_str = config_spec;
     base_dir = fs::current_path();
   }
@@ -73,7 +74,7 @@
                      "destination, config_spec: ",
                      config_spec, ", config: ", config));
   }
-  LOG(INFO) << "Parsed config:\n" << config;
+  FUZZTEST_LOG(INFO) << "Parsed config:\n" << config;
 
   // Resolve relative `source.dir_glob`s in the config to absolute ones.
   for (auto& src : *config.mutable_sources()) {
@@ -99,7 +100,7 @@
         WorkDir::kDigitsInShardIndex);
   }
 
-  LOG(INFO) << "Resolved config:\n" << config;
+  FUZZTEST_LOG(INFO) << "Resolved config:\n" << config;
 
   return config;
 }
@@ -164,7 +165,7 @@
       const proto::SeedCorpusConfig config_proto,
       ResolveSeedCorpusConfigProto(config_spec, override_out_dir));
   if (config_proto.sources_size() == 0 || !config_proto.has_destination()) {
-    LOG(WARNING) << "Config is empty: skipping seed corpus generation";
+    FUZZTEST_LOG(WARNING) << "Config is empty: skipping seed corpus generation";
     return absl::OkStatus();
   }
   RETURN_IF_NOT_OK(DumpConfigProtoToDebugDir(config_proto, coverage_binary_name,
diff --git a/centipede/stats.cc b/centipede/stats.cc
index 748c6f5..50225ed 100644
--- a/centipede/stats.cc
+++ b/centipede/stats.cc
@@ -34,8 +34,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/ascii.h"
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
@@ -60,7 +58,7 @@
 StatsReporter::StatsReporter(const std::vector<std::atomic<Stats>> &stats_vec,
                              const std::vector<Environment> &env_vec)
     : stats_vec_{stats_vec}, env_vec_{env_vec} {
-  CHECK_EQ(stats_vec.size(), env_vec.size());
+  FUZZTEST_CHECK_EQ(stats_vec.size(), env_vec.size());
   for (size_t i = 0; i < env_vec.size(); ++i) {
     const auto &env = env_vec[i];
     group_to_indices_[env.experiment_name].push_back(i);
@@ -162,7 +160,8 @@
 }
 
 void StatsLogger::DoneFieldSamplesBatch() {
-  LOG(INFO) << "Current stats:\n" << absl::StripAsciiWhitespace(os_.str());
+  FUZZTEST_LOG(INFO) << "Current stats:\n"
+                     << absl::StripAsciiWhitespace(os_.str());
   // Reset the stream for the next round of logging.
   os_.str("");
 }
@@ -173,7 +172,7 @@
 StatsCsvFileAppender::~StatsCsvFileAppender() {
   if (files_ == nullptr) return;
   for (const auto &[group_name, file] : *files_) {
-    CHECK_OK(RemoteFileClose(file.file));
+    FUZZTEST_CHECK_OK(RemoteFileClose(file.file));
   }
 }
 
@@ -195,7 +194,7 @@
 }
 
 void StatsCsvFileAppender::SetCurrGroup(const Environment &master_env) {
-  CHECK(files_ != nullptr);
+  FUZZTEST_CHECK(files_ != nullptr);
   BufferedRemoteFile &file = (*files_)[master_env.experiment_name];
   if (file.file == nullptr) {
     const std::string filename =
@@ -208,20 +207,21 @@
     bool append = false;
     if (RemotePathExists(filename)) {
       std::string contents;
-      CHECK_OK(RemoteFileGetContents(filename, contents));
+      FUZZTEST_CHECK_OK(RemoteFileGetContents(filename, contents));
       // NOTE: `csv_header_` ends with '\n', so the match is exact.
       if (absl::StartsWith(contents, csv_header_)) {
         append = true;
       } else {
         append = false;
-        CHECK_OK(RemoteFileSetContents(GetBackupFilename(filename), contents));
+        FUZZTEST_CHECK_OK(
+            RemoteFileSetContents(GetBackupFilename(filename), contents));
       }
     }
     file.file = *RemoteFileOpen(filename, append ? "a" : "w");
-    CHECK(file.file != nullptr) << VV(filename);
+    FUZZTEST_CHECK(file.file != nullptr) << VV(filename);
     if (!append) {
-      CHECK_OK(RemoteFileAppend(file.file, csv_header_));
-      CHECK_OK(RemoteFileFlush(file.file));
+      FUZZTEST_CHECK_OK(RemoteFileAppend(file.file, csv_header_));
+      FUZZTEST_CHECK_OK(RemoteFileFlush(file.file));
     }
   }
   // This is OK even though hash maps provide no pointer stability because the
@@ -245,7 +245,7 @@
   }
   double avg = !values.empty() ? (1.0 * sum / values.size()) : 0;
 
-  CHECK(curr_file_ != nullptr);
+  FUZZTEST_CHECK(curr_file_ != nullptr);
   std::string &values_str = curr_file_->buffer;
   if (curr_field_info_.traits & TraitBits::kMin)
     absl::StrAppendFormat(&values_str, "%" PRIu64 ",", min);
@@ -263,10 +263,11 @@
 }
 
 void StatsCsvFileAppender::DoneFieldSamplesBatch() {
-  CHECK(files_ != nullptr);
+  FUZZTEST_CHECK(files_ != nullptr);
   for (auto &[group_name, file] : *files_) {
-    CHECK_OK(RemoteFileAppend(file.file, absl::StrCat(file.buffer, "\n")));
-    CHECK_OK(RemoteFileFlush(file.file));
+    FUZZTEST_CHECK_OK(
+        RemoteFileAppend(file.file, absl::StrCat(file.buffer, "\n")));
+    FUZZTEST_CHECK_OK(RemoteFileFlush(file.file));
     file.buffer.clear();
   }
 }
@@ -286,7 +287,7 @@
 void PrintRewardValues(absl::Span<const std::atomic<Stats>> stats_vec,
                        std::ostream &os) {
   size_t n = stats_vec.size();
-  CHECK_GT(n, 0);
+  FUZZTEST_CHECK_GT(n, 0);
   std::vector<size_t> num_covered_pcs(n);
   for (size_t i = 0; i < n; ++i) {
     num_covered_pcs[i] = stats_vec[i].load().num_covered_pcs;
diff --git a/centipede/stats.h b/centipede/stats.h
index 603afcc..635533d 100644
--- a/centipede/stats.h
+++ b/centipede/stats.h
@@ -514,8 +514,9 @@
 inline StatsReporter::StatsReporter(StatsReporter &&) noexcept = default;
 
 // Takes a set of `Stats` objects and a corresponding set of `Environment`
-// objects and logs the current `Stats` values to LOG(INFO) on each invocation
-// of `ReportCurrStats()`. If the environments indicate the use of the
+// objects and logs the current `Stats` values to FUZZTEST_LOG(INFO) on each
+// invocation of `ReportCurrStats()`. If the environments indicate the use of
+// the
 // --experiment flag, the stats for each of the experiment are juxtaposed for
 // easy visual comparison.
 class StatsLogger : public StatsReporter {
diff --git a/centipede/stats_test.cc b/centipede/stats_test.cc
index d21221a..491a428 100644
--- a/centipede/stats_test.cc
+++ b/centipede/stats_test.cc
@@ -25,7 +25,6 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
 #include "absl/log/log_entry.h"
 #include "absl/log/log_sink.h"
 #include "absl/log/log_sink_registry.h"
@@ -847,7 +846,8 @@
     ReadFromLocalFile(kExpectedCsvBak, contents_bak);
     const std::vector<std::string> lines_bak =
         absl::StrSplit(contents_bak, '\n');
-    CHECK_NE(lines.size(), kFakeOldCsvLines.size());  // Prevent false positives
+    FUZZTEST_CHECK_NE(lines.size(),
+                      kFakeOldCsvLines.size());  // Prevent false positives
     EXPECT_EQ(lines_bak.size(), kFakeOldCsvLines.size());
   }
 }
diff --git a/centipede/symbol_table.cc b/centipede/symbol_table.cc
index d6aecb4..2168c00 100644
--- a/centipede/symbol_table.cc
+++ b/centipede/symbol_table.cc
@@ -27,8 +27,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/match.h"
 #include "absl/strings/numbers.h"
 #include "absl/strings/str_cat.h"
@@ -68,13 +66,15 @@
   if (lines_view.size() == 1 && lines_view.back().empty()) return;
 
   while (!lines_view.empty()) {
-    CHECK_GE(lines_view.size(), 3) << "Unexpected symbolizer output format.";
+    FUZZTEST_CHECK_GE(lines_view.size(), 3)
+        << "Unexpected symbolizer output format.";
 
     std::string_view func = lines_view[0];
     std::string_view file = lines_view[1];
     std::string_view empty = lines_view[2];
-    CHECK(empty.empty()) << "Unexpected symbolizer output format: " << VV(func)
-                         << VV(file) << VV(empty);
+    FUZZTEST_CHECK(empty.empty())
+        << "Unexpected symbolizer output format: " << VV(func) << VV(file)
+        << VV(empty);
     for (auto &useless_prefix : {"/proc/self/cwd/", "./"}) {
       file = absl::StripPrefix(file, useless_prefix);
     }
@@ -113,8 +113,8 @@
   WriteToLocalFile(pcs_file.path(), pcs_string);
 
   // Run the symbolizer.
-  LOG(INFO) << "Symbolizing " << pc_infos.size() << " PCs from "
-            << dso_basename;
+  FUZZTEST_LOG(INFO) << "Symbolizing " << pc_infos.size() << " PCs from "
+                     << dso_basename;
   Command::Options cmd_options;
   cmd_options.args = {
       "--no-inlines",
@@ -127,8 +127,9 @@
   Command cmd{symbolizer_path, std::move(cmd_options)};
   int exit_code = cmd.Execute();
   if (exit_code != EXIT_SUCCESS) {
-    LOG(ERROR) << "Symbolization failed, debug symbols will not be used: "
-               << VV(dso_path) << VV(cmd.ToString()) << VV(exit_code);
+    FUZZTEST_LOG(ERROR)
+        << "Symbolization failed, debug symbols will not be used: "
+        << VV(dso_path) << VV(cmd.ToString()) << VV(exit_code);
     return;
   }
 
@@ -139,9 +140,10 @@
   size_t new_size = size();
   size_t added_size = new_size - old_size;
   if (added_size != pc_infos.size()) {
-    LOG(ERROR) << "Symbolization failed: debug symbols will not be used: "
-               << VV(dso_path) << VV(cmd.ToString()) << VV(exit_code)
-               << VV(pc_infos.size()) << VV(added_size);
+    FUZZTEST_LOG(ERROR)
+        << "Symbolization failed: debug symbols will not be used: "
+        << VV(dso_path) << VV(cmd.ToString()) << VV(exit_code)
+        << VV(pc_infos.size()) << VV(added_size);
   }
 }
 
@@ -152,12 +154,14 @@
   // NOTE: --symbolizer_path=/dev/null is a somewhat expected alternative to
   // "" that users might pass.
   if (symbolizer_path.empty() || symbolizer_path == "/dev/null") {
-    LOG(WARNING) << "Symbolizer unspecified: debug symbols will not be used";
+    FUZZTEST_LOG(WARNING)
+        << "Symbolizer unspecified: debug symbols will not be used";
     SetAllToUnknown(pc_table.size());
     return;
   }
 
-  LOG(INFO) << "Symbolizing " << dso_table.size() << " instrumented DSOs.";
+  FUZZTEST_LOG(INFO) << "Symbolizing " << dso_table.size()
+                     << " instrumented DSOs.";
 
   // Iterate all DSOs, symbolize their respective PCs.
   // Symbolizing the PCs can take time, so we
@@ -173,7 +177,8 @@
     for (size_t dso_id = 0; dso_id < dso_table.size(); ++dso_id) {
       const auto &dso_info = dso_table[dso_id];
       auto &symbol_table = symbol_tables[dso_id];
-      CHECK_LE(pc_idx_begin + dso_info.num_instrumented_pcs, pc_table.size())
+      FUZZTEST_CHECK_LE(pc_idx_begin + dso_info.num_instrumented_pcs,
+                        pc_table.size())
           << VV(pc_idx_begin) << VV(dso_info.num_instrumented_pcs);
       const absl::Span<const PCInfo> pc_infos = {pc_table.data() + pc_idx_begin,
                                                  dso_info.num_instrumented_pcs};
@@ -188,7 +193,7 @@
   for (const auto &table : symbol_tables) {
     AddEntries(table);
   }
-  CHECK_EQ(pc_idx_begin, pc_table.size());
+  FUZZTEST_CHECK_EQ(pc_idx_begin, pc_table.size());
 
   if (size() != pc_table.size()) {
     // Something went wrong. Set symbols to unknown so the sizes of pc_table and
@@ -214,19 +219,19 @@
   }
   const std::vector<std::string_view> file_line_col_split =
       absl::StrSplit(file_line_col, ':');
-  CHECK_LE(file_line_col_split.size(), 3);
-  CHECK_GE(file_line_col_split.size(), 1)
+  FUZZTEST_CHECK_LE(file_line_col_split.size(), 3);
+  FUZZTEST_CHECK_GE(file_line_col_split.size(), 1)
       << "Unexpected symbolizer input format when getting source location: "
       << file_line_col;
   int line = -1;
   int col = -1;
   if (file_line_col_split.size() >= 2) {
-    CHECK(absl::SimpleAtoi(file_line_col_split[1], &line))
+    FUZZTEST_CHECK(absl::SimpleAtoi(file_line_col_split[1], &line))
         << "Unable to convert line number string to an int: "
         << file_line_col_split[1];
   }
   if (file_line_col_split.size() == 3) {
-    CHECK(absl::SimpleAtoi(file_line_col_split[2], &col))
+    FUZZTEST_CHECK(absl::SimpleAtoi(file_line_col_split[2], &col))
         << "Unable to convert column number string to an int: "
         << file_line_col_split[2];
   }
diff --git a/centipede/test_coverage_util.cc b/centipede/test_coverage_util.cc
index d65dff0..e499179 100644
--- a/centipede/test_coverage_util.cc
+++ b/centipede/test_coverage_util.cc
@@ -18,7 +18,6 @@
 #include <string>
 #include <vector>
 
-#include "absl/log/check.h"
 #include "./centipede/corpus.h"
 #include "./centipede/environment.h"
 #include "./centipede/feature.h"
@@ -46,7 +45,7 @@
   // Repackage execution results into a vector of CorpusRecords.
   std::vector<CorpusRecord> corpus_records;
   std::vector<ExecutionResult> &execution_results = batch_result.results();
-  CHECK_EQ(byte_array_inputs.size(), execution_results.size());
+  FUZZTEST_CHECK_EQ(byte_array_inputs.size(), execution_results.size());
 
   corpus_records.reserve(byte_array_inputs.size());
   for (int i = 0; i < byte_array_inputs.size(); ++i) {
diff --git a/centipede/test_coverage_util.h b/centipede/test_coverage_util.h
index 6a9b5d5..c06a9bf 100644
--- a/centipede/test_coverage_util.h
+++ b/centipede/test_coverage_util.h
@@ -21,7 +21,6 @@
 #include <string_view>
 #include <vector>
 
-#include "absl/log/check.h"
 #include "./centipede/centipede_callbacks.h"
 #include "./centipede/corpus.h"
 #include "./centipede/environment.h"
@@ -48,7 +47,7 @@
                BatchResult &batch_result) override {
     int result =
         ExecuteCentipedeSancovBinaryWithShmem(binary, inputs, batch_result);
-    CHECK_EQ(EXIT_SUCCESS, result);
+    FUZZTEST_CHECK_EQ(EXIT_SUCCESS, result);
     return true;
   }
   std::vector<ByteArray> Mutate(const std::vector<MutationInputRef> &inputs,
diff --git a/centipede/thread_pool.h b/centipede/thread_pool.h
index a742ba6..7c22801 100644
--- a/centipede/thread_pool.h
+++ b/centipede/thread_pool.h
@@ -24,7 +24,6 @@
 
 #include "absl/base/thread_annotations.h"
 #include "absl/functional/any_invocable.h"
-#include "absl/log/check.h"
 #include "absl/synchronization/mutex.h"
 
 namespace fuzztest::internal {
@@ -60,7 +59,7 @@
 
   // Schedules a function to be run on a ThreadPool thread immediately.
   void Schedule(absl::AnyInvocable<void()> func) {
-    CHECK(func != nullptr);
+    FUZZTEST_CHECK(func != nullptr);
     absl::MutexLock l{&mu_};
     queue_.push(std::move(func));
   }
diff --git a/centipede/util.cc b/centipede/util.cc
index c5e1b74..988f25e 100644
--- a/centipede/util.cc
+++ b/centipede/util.cc
@@ -45,7 +45,6 @@
 #include "absl/base/const_init.h"
 #include "absl/base/nullability.h"
 #include "absl/base/thread_annotations.h"
-#include "absl/log/check.h"
 #include "absl/strings/str_format.h"
 #include "absl/strings/str_replace.h"
 #include "absl/strings/str_split.h"
@@ -86,11 +85,11 @@
   f.seekg(0, std::ios_base::end);
   auto size = f.tellg();
   f.seekg(0, std::ios_base::beg);
-  CHECK_EQ(size % sizeof(data[0]), 0);
+  FUZZTEST_CHECK_EQ(size % sizeof(data[0]), 0);
   data.resize(size / sizeof(data[0]));
   f.read(reinterpret_cast<char *>(data.data()), size);
-  CHECK(f) << "Failed to read from local file: " << VV(file_path) << VV(f.eof())
-           << VV(f.bad()) << VV(f.fail()) << VV(size);
+  FUZZTEST_CHECK(f) << "Failed to read from local file: " << VV(file_path)
+                    << VV(f.eof()) << VV(f.bad()) << VV(f.fail()) << VV(size);
   f.close();
 }
 
@@ -110,15 +109,15 @@
 
 void ClearLocalFileContents(std::string_view file_path) {
   std::ofstream f(std::string{file_path}, std::ios::out | std::ios::trunc);
-  CHECK(f) << "Failed to clear the file: " << file_path;
+  FUZZTEST_CHECK(f) << "Failed to clear the file: " << file_path;
 }
 
 void WriteToLocalFile(std::string_view file_path, ByteSpan data) {
   std::ofstream f(std::string{file_path});
-  CHECK(f) << "Failed to open local file: " << file_path;
+  FUZZTEST_CHECK(f) << "Failed to open local file: " << file_path;
   f.write(reinterpret_cast<const char *>(data.data()),
           static_cast<int64_t>(data.size()));
-  CHECK(f) << "Failed to write to local file: " << file_path;
+  FUZZTEST_CHECK(f) << "Failed to write to local file: " << file_path;
   f.close();
 }
 
@@ -140,14 +139,14 @@
 void WriteToRemoteHashedFileInDir(std::string_view dir_path, ByteSpan data) {
   if (dir_path.empty()) return;
   std::string file_path = std::filesystem::path(dir_path).append(Hash(data));
-  CHECK_OK(
+  FUZZTEST_CHECK_OK(
       RemoteFileSetContents(file_path, std::string(data.begin(), data.end())));
 }
 
 std::string HashOfFileContents(std::string_view file_path) {
   if (file_path.empty()) return "";
   std::string file_contents;
-  CHECK_OK(RemoteFileGetContents(file_path, file_contents));
+  FUZZTEST_CHECK_OK(RemoteFileGetContents(file_path, file_contents));
   return Hash(file_contents);
 }
 
@@ -183,7 +182,7 @@
 
 void CreateLocalDirRemovedAtExit(std::string_view path) {
   // Safeguard against removing dirs not created by TemporaryLocalDirPath().
-  CHECK_NE(path.find("/centipede-"), std::string::npos);
+  FUZZTEST_CHECK_NE(path.find("/centipede-"), std::string::npos);
   // Create the dir.
   std::filesystem::remove_all(path);
   std::filesystem::create_directories(path);
@@ -202,12 +201,12 @@
 ScopedFile::~ScopedFile() { std::filesystem::remove_all(my_path_); }
 
 void AppendHashToArray(ByteArray &ba, std::string_view hash) {
-  CHECK_EQ(hash.size(), kHashLen);
+  FUZZTEST_CHECK_EQ(hash.size(), kHashLen);
   ba.insert(ba.end(), hash.begin(), hash.end());
 }
 
 std::string ExtractHashFromArray(ByteArray &ba) {
-  CHECK_GE(ba.size(), kHashLen);
+  FUZZTEST_CHECK_GE(ba.size(), kHashLen);
   std::string res;
   res.insert(res.end(), ba.end() - kHashLen, ba.end());
   ba.resize(ba.size() - kHashLen);
@@ -223,7 +222,7 @@
                                         ByteSpan features) {
   ByteArray feature_bytes_with_hash(features.size() + kHashLen);
   auto hash = Hash(data);
-  CHECK_EQ(hash.size(), kHashLen);
+  FUZZTEST_CHECK_EQ(hash.size(), kHashLen);
   memcpy(feature_bytes_with_hash.data(), features.data(), features.size());
   memcpy(feature_bytes_with_hash.data() + features.size(), hash.data(),
          kHashLen);
@@ -350,13 +349,13 @@
 uint8_t *MmapNoReserve(size_t size) {
   auto result = mmap(0, size, PROT_READ | PROT_WRITE,
                      MAP_PRIVATE | MAP_ANON | MAP_NORESERVE, -1, 0);
-  CHECK(result != MAP_FAILED);
+  FUZZTEST_CHECK(result != MAP_FAILED);
   return reinterpret_cast<uint8_t *>(result);
 }
 
 void Munmap(uint8_t *ptr, size_t size) {
   auto result = munmap(ptr, size);
-  CHECK_EQ(result, 0);
+  FUZZTEST_CHECK_EQ(result, 0);
 }
 
 }  // namespace fuzztest::internal
diff --git a/centipede/util.h b/centipede/util.h
index 1f31e40..93ca1cb 100644
--- a/centipede/util.h
+++ b/centipede/util.h
@@ -23,10 +23,10 @@
 #include <vector>
 
 #include "absl/base/nullability.h"
-#include "absl/log/check.h"
 #include "absl/types/span.h"
 #include "./centipede/feature.h"
 #include "./common/defs.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -158,13 +158,13 @@
                         std::vector<ByteArray> &dictionary_entries);
 
 // Maps `size` bytes with `mmap(NO_RESERVE)` or equivalent, returns the result.
-// CHECK-fails on error.
+// FUZZTEST_CHECK-fails on error.
 // The resulting memory is unreserved, and will be zero-initialized on first
 // access.
 uint8_t *MmapNoReserve(size_t size);
 
 // Unmaps memory returned by `MmapNoReserve`().
-// CHECK-fails on error.
+// FUZZTEST_CHECK-fails on error.
 void Munmap(uint8_t *ptr, size_t size);
 
 // Fixed size array allocated/deallocated with MmapNoReserve/Munmap.
@@ -179,11 +179,11 @@
   MmapNoReserveArray(MmapNoReserveArray &&) = delete;
   MmapNoReserveArray &operator=(MmapNoReserveArray &&) = delete;
   uint8_t operator[](size_t i) const {
-    CHECK_LT(i, kSize);
+    FUZZTEST_CHECK_LT(i, kSize);
     return array_[i];
   }
   uint8_t &operator[](size_t i) {
-    CHECK_LT(i, kSize);
+    FUZZTEST_CHECK_LT(i, kSize);
     return array_[i];
   }
 
diff --git a/centipede/util_test.cc b/centipede/util_test.cc
index 792c9f9..7be77e8 100644
--- a/centipede/util_test.cc
+++ b/centipede/util_test.cc
@@ -24,11 +24,11 @@
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/container/flat_hash_map.h"
-#include "absl/log/log.h"
 #include "./centipede/feature.h"
 #include "./centipede/thread_pool.h"
 #include "./common/defs.h"
 #include "./common/hash.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -106,7 +106,7 @@
   {
     // Check that repeated calls return the same path.
     auto temp_dir = TemporaryLocalDirPath();
-    LOG(INFO) << temp_dir;
+    FUZZTEST_LOG(INFO) << temp_dir;
     EXPECT_EQ(temp_dir, TemporaryLocalDirPath());
   }
 
diff --git a/centipede/workdir.cc b/centipede/workdir.cc
index 59b2e0f..c0f4090 100644
--- a/centipede/workdir.cc
+++ b/centipede/workdir.cc
@@ -23,8 +23,6 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/match.h"
 #include "absl/strings/numbers.h"
 #include "absl/strings/str_cat.h"
@@ -46,7 +44,7 @@
 std::string NormalizeAnnotation(std::string_view annotation) {
   std::string ret;
   if (!annotation.empty()) {
-    CHECK_NE(annotation.front(), '.');
+    FUZZTEST_CHECK_NE(annotation.front(), '.');
     ret = absl::StrCat(".", annotation);
   }
   return ret;
@@ -101,15 +99,16 @@
   const std::filesystem::path path{corpus_shard_path};
   const std::string dir = path.parent_path();
   const std::string stem = path.stem();
-  CHECK(stem == kCorpusShardStem ||
-        absl::StartsWith(stem, kDistilledCorpusShardStemPrefix))
+  FUZZTEST_CHECK(stem == kCorpusShardStem ||
+                 absl::StartsWith(stem, kDistilledCorpusShardStemPrefix))
       << VV(corpus_shard_path);
   const std::string dot_ext = path.extension();
-  CHECK(!dot_ext.empty() && dot_ext[0] == '.') << VV(corpus_shard_path);
+  FUZZTEST_CHECK(!dot_ext.empty() && dot_ext[0] == '.')
+      << VV(corpus_shard_path);
   const std::string ext = dot_ext.substr(1);
-  CHECK_EQ(ext.size(), kDigitsInShardIndex) << VV(corpus_shard_path);
+  FUZZTEST_CHECK_EQ(ext.size(), kDigitsInShardIndex) << VV(corpus_shard_path);
   size_t shard_index = -1;
-  CHECK(absl::SimpleAtoi(ext, &shard_index)) << VV(corpus_shard_path);
+  FUZZTEST_CHECK(absl::SimpleAtoi(ext, &shard_index)) << VV(corpus_shard_path);
   return WorkDir{
       dir,
       std::string{binary_name},
@@ -241,8 +240,8 @@
   const auto dir_iter =
       std::filesystem::directory_iterator(dir_path, dir_error);
   if (dir_error) {
-    LOG(ERROR) << "Failed to access coverage dir '" << dir_path
-               << "': " << dir_error.message();
+    FUZZTEST_LOG(ERROR) << "Failed to access coverage dir '" << dir_path
+                        << "': " << dir_error.message();
     return {};
   }
   std::vector<std::string> raw_profiles;
diff --git a/common/BUILD b/common/BUILD
index 753a042..d0fb585 100644
--- a/common/BUILD
+++ b/common/BUILD
@@ -40,7 +40,7 @@
     srcs = ["bazel.cc"],
     hdrs = ["bazel.h"],
     deps = [
-        "@abseil-cpp//absl/log:check",
+        ":logging",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
@@ -64,8 +64,6 @@
         ":status_macros",
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/base:nullability",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings:str_format",
@@ -106,8 +104,8 @@
     name = "logging",
     hdrs = ["logging.h"],
     deps = [
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
+        "@abseil-cpp//absl/log:absl_check",
+        "@abseil-cpp//absl/log:absl_log",
     ],
 )
 
@@ -124,7 +122,6 @@
                ":logging",
                ":status_macros",
                "@abseil-cpp//absl/base:nullability",
-               "@abseil-cpp//absl/log:check",
                "@abseil-cpp//absl/status",
                "@abseil-cpp//absl/status:statusor",
                "@abseil-cpp//absl/strings",
@@ -156,8 +153,6 @@
         ":logging",
         ":status_macros",
         "@abseil-cpp//absl/base:nullability",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
@@ -186,8 +181,8 @@
     name = "status_macros",
     hdrs = ["status_macros.h"],
     deps = [
+        ":logging",
         "@abseil-cpp//absl/base:core_headers",
-        "@abseil-cpp//absl/log",
     ],
 )
 
@@ -200,8 +195,6 @@
         ":blob_file",
         ":defs",
         ":logging",
-        "@abseil-cpp//absl/log",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@googletest//:gtest",
@@ -213,7 +206,7 @@
     srcs = ["temp_dir.cc"],
     hdrs = ["temp_dir.h"],
     deps = [
-        "@abseil-cpp//absl/log:check",
+        ":logging",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:string_view",
     ],
@@ -254,7 +247,6 @@
         ":logging",
         ":remote_file",
         ":test_util",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/time",
         "@googletest//:gtest",
diff --git a/common/bazel.cc b/common/bazel.cc
index 1a9780d..75f2141 100644
--- a/common/bazel.cc
+++ b/common/bazel.cc
@@ -18,12 +18,12 @@
 #include <cstdlib>
 #include <string>
 
-#include "absl/log/check.h"
 #include "absl/status/status.h"
 #include "absl/strings/numbers.h"
 #include "absl/strings/str_cat.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -40,7 +40,7 @@
     return absl::InfiniteDuration();
   }
   int timeout_s = 0;
-  CHECK(absl::SimpleAtoi(test_timeout_env, &timeout_s))
+  FUZZTEST_CHECK(absl::SimpleAtoi(test_timeout_env, &timeout_s))
       << "Failed to parse TEST_TIMEOUT: \"" << test_timeout_env << "\"";
   return absl::Seconds(timeout_s);
 }
@@ -52,18 +52,20 @@
     TestShard test_shard;
     if (const char *test_total_shards_env = std::getenv("TEST_TOTAL_SHARDS");
         test_total_shards_env != nullptr) {
-      CHECK(absl::SimpleAtoi(test_total_shards_env, &test_shard.total_shards))
+      FUZZTEST_CHECK(
+          absl::SimpleAtoi(test_total_shards_env, &test_shard.total_shards))
           << "Failed to parse TEST_TOTAL_SHARDS as an integer: \""
           << test_total_shards_env << "\"";
-      CHECK_GT(test_shard.total_shards, 0)
+      FUZZTEST_CHECK_GT(test_shard.total_shards, 0)
           << "TEST_TOTAL_SHARDS must be greater than 0.";
     }
     if (const char *test_shard_index_env = std::getenv("TEST_SHARD_INDEX");
         test_shard_index_env != nullptr) {
-      CHECK(absl::SimpleAtoi(test_shard_index_env, &test_shard.index))
+      FUZZTEST_CHECK(absl::SimpleAtoi(test_shard_index_env, &test_shard.index))
           << "Failed to parse TEST_SHARD_INDEX as an integer: \""
           << test_shard_index_env << "\"";
-      CHECK(0 <= test_shard.index && test_shard.index < test_shard.total_shards)
+      FUZZTEST_CHECK(0 <= test_shard.index &&
+                     test_shard.index < test_shard.total_shards)
           << "TEST_SHARD_INDEX must be in the range [0, "
           << test_shard.total_shards << ").";
     }
@@ -102,7 +104,7 @@
       // timeout. This case can only happen if we would in fact need more than
       // `kMaxShardCount` shards, indicating that there are simply too many fuzz
       // tests in a binary.
-      CHECK_EQ(suggested_shard_count, kMaxShardCount);
+      FUZZTEST_CHECK_EQ(suggested_shard_count, kMaxShardCount);
       absl::StrAppend(&error,
                       "split the fuzz tests into several test binaries where "
                       "each binary has at most ",
@@ -112,7 +114,7 @@
       // In this case, `suggested_shard_count` must be greater than
       // `shard_count`, otherwise we would have already executed all the tests
       // without a timeout.
-      CHECK_GT(suggested_shard_count, shard_count);
+      FUZZTEST_CHECK_GT(suggested_shard_count, shard_count);
       absl::StrAppend(&error, "increase the `shard_count` to ",
                       suggested_shard_count, ", ");
     }
diff --git a/common/blob_file.cc b/common/blob_file.cc
index dc9a40e..6193c4f 100644
--- a/common/blob_file.cc
+++ b/common/blob_file.cc
@@ -27,8 +27,6 @@
 
 #include "absl/base/nullability.h"
 #include "absl/base/optimization.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_format.h"
 #include "absl/strings/string_view.h"
@@ -71,7 +69,7 @@
   ~SimpleBlobFileReader() override {
     if (file_ && !closed_) {
       // Virtual resolution is off in dtors, so use a specific Close().
-      CHECK_OK(SimpleBlobFileReader::Close());
+      FUZZTEST_CHECK_OK(SimpleBlobFileReader::Close());
     }
   }
 
@@ -125,12 +123,12 @@
   ~SimpleBlobFileWriter() override {
     if (file_ && !closed_) {
       // Virtual resolution is off in dtors, so use a specific Close().
-      CHECK_OK(SimpleBlobFileWriter::Close());
+      FUZZTEST_CHECK_OK(SimpleBlobFileWriter::Close());
     }
   }
 
   absl::Status Open(std::string_view path, std::string_view mode) override {
-    CHECK(mode == "w" || mode == "a") << VV(mode);
+    FUZZTEST_CHECK(mode == "w" || mode == "a") << VV(mode);
     if (closed_) return absl::FailedPreconditionError("already closed");
     if (file_) return absl::FailedPreconditionError("already open");
     ASSIGN_OR_RETURN_IF_NOT_OK(file_, RemoteFileOpen(path, mode.data()));
@@ -170,7 +168,7 @@
  public:
   ~DefaultBlobFileReader() override {
     // Virtual resolution is off in dtors, so use a specific Close().
-    CHECK_OK(DefaultBlobFileReader::Close());
+    FUZZTEST_CHECK_OK(DefaultBlobFileReader::Close());
   }
 
   absl::Status Open(std::string_view path) override {
@@ -247,8 +245,8 @@
     // TODO(b/313706444): Reconsider error handling after experiments.
     // TODO(b/310701588): Try adding a test for this.
     if (riegeli_reader_.ok() && !riegeli_reader_.Close()) {
-      LOG(WARNING) << "Ignoring errors while closing Riegeli file: "
-                   << riegeli_reader_.status();
+      FUZZTEST_LOG(WARNING) << "Ignoring errors while closing Riegeli file: "
+                            << riegeli_reader_.status();
     }
     // Any non-ok status of `riegeli_reader_` persists for subsequent
     // operations; therefore, re-initialize it to a closed ok state.
@@ -272,11 +270,11 @@
  public:
   ~RiegeliWriter() override {
     // Virtual resolution is off in dtors, so use a specific Close().
-    CHECK_OK(RiegeliWriter::Close());
+    FUZZTEST_CHECK_OK(RiegeliWriter::Close());
   }
 
   absl::Status Open(std::string_view path, std::string_view mode) override {
-    CHECK(mode == "w" || mode == "a") << VV(mode);
+    FUZZTEST_CHECK(mode == "w" || mode == "a") << VV(mode);
     if (absl::Status s = Close(); !s.ok()) return s;
     const auto kWriterOpts =
         riegeli::RecordWriterBase::Options{}.set_chunk_size(kMaxBufferedBytes);
@@ -305,7 +303,7 @@
     if (!PostWriteFlush(blob.size())) return writer_.status();
     write_duration_ += absl::Now() - now;
     if (written_blobs_ + buffered_blobs_ % 10000 == 0)
-      VLOG(10) << "Current stats: " << StatsString();
+      FUZZTEST_VLOG(10) << "Current stats: " << StatsString();
     return absl::OkStatus();
   }
 
@@ -322,7 +320,7 @@
     written_bytes_ += buffered_bytes_;
     buffered_blobs_ = 0;
     buffered_bytes_ = 0;
-    VLOG(1) << "Final stats: " << StatsString();
+    FUZZTEST_VLOG(1) << "Final stats: " << StatsString();
     return absl::OkStatus();
   }
 
@@ -358,7 +356,8 @@
         : (absl::Now() - flushed_at_ > kMaxFlushInterval)     ? "time"
                                                               : "";
     if (!flush_reason.empty()) {
-      VLOG(20) << "Flushing b/c " << flush_reason << ": " << StatsString();
+      FUZZTEST_VLOG(20) << "Flushing b/c " << flush_reason << ": "
+                        << StatsString();
       if (!writer_.Flush(riegeli::FlushType::kFromMachine)) return false;
       flushed_at_ = absl::Now();
       written_blobs_ += buffered_blobs_;
@@ -376,7 +375,8 @@
   bool PostWriteFlush(size_t blob_size) {
     const auto record_size = blob_size + kRiegeliPerRecordMetadataSize;
     if (record_size >= kMaxBufferedBytes) {
-      VLOG(20) << "Post-write flushing b/c blob size: " << StatsString();
+      FUZZTEST_VLOG(20) << "Post-write flushing b/c blob size: "
+                        << StatsString();
       if (!writer_.Flush(riegeli::FlushType::kFromMachine)) return false;
       flushed_at_ = absl::Now();
       written_blobs_ += 1;
@@ -446,7 +446,7 @@
 ByteArray PackBytesForAppendFile(ByteSpan blob) {
   ByteArray res;
   auto hash = Hash(blob);
-  CHECK_EQ(hash.size(), kHashLen);
+  FUZZTEST_CHECK_EQ(hash.size(), kHashLen);
   size_t size = blob.size();
   uint8_t size_bytes[sizeof(size)];
   std::memcpy(size_bytes, &size, sizeof(size));
@@ -496,7 +496,8 @@
 std::unique_ptr<BlobFileWriter> DefaultBlobFileWriterFactory(bool riegeli) {
   if (riegeli)
 #ifdef CENTIPEDE_DISABLE_RIEGELI
-    LOG(FATAL) << "Riegeli unavailable: built with --use_riegeli set to false.";
+    FUZZTEST_LOG(FATAL)
+        << "Riegeli unavailable: built with --use_riegeli set to false.";
 #else
     return std::make_unique<RiegeliWriter>();
 #endif  // CENTIPEDE_DISABLE_RIEGELI
diff --git a/common/logging.h b/common/logging.h
index 7020085..8f25c92 100644
--- a/common/logging.h
+++ b/common/logging.h
@@ -15,13 +15,32 @@
 #ifndef FUZZTEST_COMMON_LOGGING_H_
 #define FUZZTEST_COMMON_LOGGING_H_
 
-// TODO(b/315519925): Temporary leftover from switching to now-available
-//  OSS Abseil VLOG and friends. Explicitly include these wherever necessary and
-//  remove from here.
-#include "absl/log/check.h"  // IWYU pragma: keep
-#include "absl/log/log.h"    // IWYU pragma: keep
+#include "absl/log/absl_check.h"
+#include "absl/log/absl_log.h"
 
-// Easy variable value logging: LOG(INFO) << VV(foo) << VV(bar);
+// Easy variable value logging: FUZZTEST_LOG(INFO) << VV(foo) << VV(bar);
 #define VV(x) #x ": " << (x) << " "
 
+// NOTE: these macros are for internal use within the fuzztest codebase.
+#define FUZZTEST_LOG(severity) ABSL_LOG(severity)
+#define FUZZTEST_LOG_EVERY_POW_2(severity) ABSL_LOG_EVERY_POW_2(severity)
+#define FUZZTEST_LOG_FIRST_N(severity, n) ABSL_LOG_FIRST_N(severity, n)
+#define FUZZTEST_VLOG(verbose_level) ABSL_VLOG(verbose_level)
+#define FUZZTEST_VLOG_EVERY_N(verbose_level, n) \
+  ABSL_VLOG_EVERY_N(verbose_level, n)
+#define FUZZTEST_VLOG_IS_ON(verbose_level) ABSL_VLOG_IS_ON(verbose_level)
+#define FUZZTEST_LOG_IF(severity, condition) ABSL_LOG_IF(severity, condition)
+#define FUZZTEST_CHECK(cond) ABSL_CHECK(cond) << "Internal error: "
+#define FUZZTEST_PCHECK(cond) ABSL_PCHECK(cond) << "Internal error: "
+#define FUZZTEST_PRECONDITION(cond) ABSL_CHECK(cond) << "Failed precondition: "
+#define FUZZTEST_CHECK_OK(status) ABSL_CHECK_OK(status)
+#define FUZZTEST_CHECK_GT(a, b) ABSL_CHECK_GT(a, b)
+#define FUZZTEST_CHECK_GE(a, b) ABSL_CHECK_GE(a, b)
+#define FUZZTEST_CHECK_EQ(a, b) ABSL_CHECK_EQ(a, b)
+#define FUZZTEST_CHECK_NE(a, b) ABSL_CHECK_NE(a, b)
+#define FUZZTEST_CHECK_LE(a, b) ABSL_CHECK_LE(a, b)
+#define FUZZTEST_CHECK_LT(a, b) ABSL_CHECK_LT(a, b)
+#define FUZZTEST_QCHECK(cond) ABSL_QCHECK(cond)
+#define FUZZTEST_QCHECK_OK(status) ABSL_QCHECK_OK(status)
+
 #endif  // FUZZTEST_COMMON_LOGGING_H_
diff --git a/common/remote_file.cc b/common/remote_file.cc
index 714855e..b628ad6 100644
--- a/common/remote_file.cc
+++ b/common/remote_file.cc
@@ -21,7 +21,6 @@
 #include <string_view>
 
 #include "absl/base/nullability.h"
-#include "absl/log/check.h"
 #include "absl/status/status.h"
 #include "./common/defs.h"
 #include "./common/logging.h"
diff --git a/common/remote_file_oss.cc b/common/remote_file_oss.cc
index 0f0acba..fb6f23a 100644
--- a/common/remote_file_oss.cc
+++ b/common/remote_file_oss.cc
@@ -37,8 +37,6 @@
 #include <vector>
 
 #include "absl/base/nullability.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "absl/strings/str_cat.h"
@@ -69,7 +67,8 @@
   }
 
   ~LocalRemoteFile() {
-    CHECK(file_ == nullptr) << "Dtor called before Close(): " << VV(path_);
+    FUZZTEST_CHECK(file_ == nullptr)
+        << "Dtor called before Close(): " << VV(path_);
   }
 
   // Movable but not copyable.
@@ -123,7 +122,7 @@
                                              ": ", std::strerror(errno)));
     }
     static constexpr auto elt_size = sizeof(ba[0]);
-    CHECK_EQ(file_size % elt_size, 0)
+    FUZZTEST_CHECK_EQ(file_size % elt_size, 0)
         << VV(file_size) << VV(elt_size) << VV(path_);
     if (file_size % elt_size != 0) {
       return absl::FailedPreconditionError(
@@ -165,36 +164,36 @@
 #if defined(FUZZTEST_STUB_STD_FILESYSTEM)
 
 absl::Status RemoteMkdir(std::string_view path) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 bool RemotePathExists(std::string_view path) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 bool RemotePathIsDirectory(std::string_view path) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 absl::StatusOr<std::vector<std::string>> RemoteListFiles(std::string_view path,
                                                          bool recursively) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 absl::Status RemoteFileRename(std::string_view from, std::string_view to) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 absl::Status RemoteFileCopy(std::string_view from, std::string_view to) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 absl::Status RemotePathTouchExistingFile(std::string_view path) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 absl::Status RemotePathDelete(std::string_view path, bool recursively) {
-  LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 #else
@@ -310,7 +309,7 @@
 
 // TODO(ussuri): For now, simulate the old behavior, where a failure to open
 //  a file returned nullptr. Adjust the clients to expect non-null and use a
-//  normal ctor with a CHECK instead of `Create()` here instead.
+//  normal ctor with a FUZZTEST_CHECK instead of `Create()` here instead.
 absl::StatusOr<RemoteFile *> RemoteFileOpen(std::string_view path,
                                             const char *mode) {
   return LocalRemoteFile::Create(std::string(path), mode);
@@ -367,7 +366,8 @@
 #if defined(FUZZTEST_HAS_OSS_GLOB)
 int HandleGlobError(const char *epath, int eerrno) {
   if (eerrno == ENOENT) return 0;
-  LOG(FATAL) << "Error while globbing path: " << VV(epath) << VV(eerrno);
+  FUZZTEST_LOG(FATAL) << "Error while globbing path: " << VV(epath)
+                      << VV(eerrno);
   return -1;
 }
 #endif  // defined(FUZZTEST_HAS_OSS_GLOB)
diff --git a/common/remote_file_test.cc b/common/remote_file_test.cc
index ade0988..82fd85b 100644
--- a/common/remote_file_test.cc
+++ b/common/remote_file_test.cc
@@ -23,7 +23,6 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
 #include "absl/status/status.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
@@ -40,9 +39,9 @@
 
 void CreateFileOrDie(std::string_view path, std::string_view contents = "") {
   std::ofstream f{std::string(path)};
-  CHECK(f.good()) << VV(path);
+  FUZZTEST_CHECK(f.good()) << VV(path);
   f << contents;
-  CHECK(f.good()) << VV(path);
+  FUZZTEST_CHECK(f.good()) << VV(path);
 }
 
 TEST(RemoteFile, GetSize) {
@@ -137,7 +136,7 @@
 TEST(RemotePathDelete, RecursivelyDeletesAllFilesAndSubdirectories) {
   const fs::path temp_dir = GetTestTempDir(test_info_->name());
   const fs::path a_b_c = temp_dir / "a" / "b" / "c";
-  CHECK(fs::create_directories(a_b_c)) << VV(a_b_c);
+  FUZZTEST_CHECK(fs::create_directories(a_b_c)) << VV(a_b_c);
   const std::string file_path = a_b_c / "file";
   CreateFileOrDie(file_path);
 
diff --git a/common/status_macros.h b/common/status_macros.h
index 0fe940f..882f2f5 100644
--- a/common/status_macros.h
+++ b/common/status_macros.h
@@ -21,7 +21,7 @@
 
 #include "absl/base/attributes.h"
 #include "absl/base/optimization.h"
-#include "absl/log/log.h"
+#include "./common/logging.h"
 
 // If `status_expr` (an expression of type `absl::Status`) is not OK then return
 // it from the current function. Otherwise, do nothing.
@@ -55,8 +55,9 @@
                           std::uint_least32_t line = __builtin_LINE(),
                           const char* file_name = __builtin_FILE()) {
   if (ABSL_PREDICT_FALSE(!value.ok())) {
-    LOG(FATAL) << file_name << ":" << line
-               << ": ValueOrDie on non-OK status: " << value.status();
+    FUZZTEST_CHECK(false) << file_name << ":" << line
+                          << ": ValueOrDie on non-OK status: "
+                          << value.status();
   }
   return *std::forward<T>(value);
 }
diff --git a/common/temp_dir.cc b/common/temp_dir.cc
index e57e237..f9dba37 100644
--- a/common/temp_dir.cc
+++ b/common/temp_dir.cc
@@ -4,9 +4,9 @@
 #include <filesystem>    // NOLINT
 #include <system_error>  // NOLINT
 
-#include "absl/log/check.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -18,24 +18,24 @@
   if (temp_root.empty()) {
     std::error_code error;
     temp_root = std::filesystem::temp_directory_path(error);
-    CHECK(!error) << "Failed to get the root temp directory path: "
-                  << error.message();
+    FUZZTEST_CHECK(!error) << "Failed to get the root temp directory path: "
+                           << error.message();
   }
   absl::string_view prefix = custom_prefix.empty() ? "temp_dir" : custom_prefix;
   const fs::path path_template = temp_root / absl::StrCat(prefix, "_XXXXXX");
 #if !defined(_MSC_VER)
   path_ = mkdtemp(path_template.string().data());
 #else
-  CHECK(false) << "Windows is not supported yet.";
+  FUZZTEST_CHECK(false) << "Windows is not supported yet.";
 #endif
-  CHECK(std::filesystem::is_directory(path_));
+  FUZZTEST_CHECK(std::filesystem::is_directory(path_));
 }
 
 TempDir::~TempDir() {
   std::error_code error;
   std::filesystem::remove_all(path_, error);
-  CHECK(!error) << "Unable to clean up temporary dir " << path_ << ": "
-                << error.message();
+  FUZZTEST_CHECK(!error) << "Unable to clean up temporary dir " << path_ << ": "
+                         << error.message();
 }
 
 }  // namespace fuzztest::internal
diff --git a/common/test_util.cc b/common/test_util.cc
index 368f673..3232d55 100644
--- a/common/test_util.cc
+++ b/common/test_util.cc
@@ -19,8 +19,6 @@
 #include <system_error>  // NOLINT
 
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
-#include "absl/log/log.h"
 #include "absl/strings/str_cat.h"
 #include "./common/logging.h"
 
@@ -28,13 +26,14 @@
 
 std::filesystem::path GetTestTempDir(std::string_view subdir) {
   const std::filesystem::path test_tempdir = ::testing::TempDir();
-  CHECK(!test_tempdir.empty())
+  FUZZTEST_CHECK(!test_tempdir.empty())
       << "testing::TempDir() is expected to always return non-empty path";
   const auto dir = test_tempdir / subdir;
   if (!std::filesystem::exists(dir)) {
     std::error_code error;
     std::filesystem::create_directories(dir, error);
-    CHECK(!error) << "Failed to create dir: " VV(dir) << error.message();
+    FUZZTEST_CHECK(!error) << "Failed to create dir: " VV(dir)
+                           << error.message();
   }
   return std::filesystem::canonical(dir);
 }
@@ -45,13 +44,13 @@
 
 std::filesystem::path GetTestRunfilesDir() {
   const auto test_srcdir = ::testing::SrcDir();
-  CHECK(!test_srcdir.empty())
+  FUZZTEST_CHECK(!test_srcdir.empty())
       << "testing::SrcDir() is expected to always return non-empty path";
   const char* test_workspace = std::getenv("TEST_WORKSPACE");
-  CHECK(test_workspace != nullptr)
+  FUZZTEST_CHECK(test_workspace != nullptr)
       << "TEST_WORKSPACE envvar is expected to be set by build system";
   auto path = std::filesystem::path{test_srcdir}.append(test_workspace);
-  CHECK(std::filesystem::exists(path))  //
+  FUZZTEST_CHECK(std::filesystem::exists(path))  //
       << "No such dir: " << VV(path) << VV(test_srcdir) << VV(test_workspace);
   return path;
 }
@@ -60,19 +59,19 @@
   const auto runfiles_dir = GetTestRunfilesDir();
   auto path = runfiles_dir;
   path.append(rel_path);
-  CHECK(std::filesystem::exists(path))  //
+  FUZZTEST_CHECK(std::filesystem::exists(path))  //
       << "No such path: " << VV(path) << VV(runfiles_dir) << VV(rel_path);
   return path;
 }
 
 std::string GetLLVMSymbolizerPath() {
-  CHECK_EQ(system("which llvm-symbolizer"), EXIT_SUCCESS)
+  FUZZTEST_CHECK_EQ(system("which llvm-symbolizer"), EXIT_SUCCESS)
       << "llvm-symbolizer has to be installed and findable via PATH";
   return "llvm-symbolizer";
 }
 
 std::string GetObjDumpPath() {
-  CHECK_EQ(system("which objdump"), EXIT_SUCCESS)
+  FUZZTEST_CHECK_EQ(system("which objdump"), EXIT_SUCCESS)
       << "objdump has to be installed and findable via PATH";
   return "objdump";
 }
@@ -80,7 +79,7 @@
 void PrependDirToPathEnvvar(std::string_view dir) {
   const std::string new_path_envvar = absl::StrCat(dir, ":", getenv("PATH"));
   setenv("PATH", new_path_envvar.c_str(), /*replace*/ 1);
-  LOG(INFO) << "New PATH: " << new_path_envvar;
+  FUZZTEST_LOG(INFO) << "New PATH: " << new_path_envvar;
 }
 
 }  // namespace fuzztest::internal
diff --git a/common/test_util.h b/common/test_util.h
index 11cc60c..c859bff 100644
--- a/common/test_util.h
+++ b/common/test_util.h
@@ -22,10 +22,10 @@
 #include <string_view>
 #include <vector>
 
-#include "absl/log/check.h"
 #include "absl/strings/str_format.h"
 #include "./common/blob_file.h"
 #include "./common/defs.h"
+#include "./common/logging.h"
 
 #include "./common/logging.h"
 
@@ -116,7 +116,7 @@
     while (reader_->Read(blob).ok()) {
       corpus.emplace_back(blob.begin(), blob.end());
     }
-    CHECK_OK(reader_->Close());
+    FUZZTEST_CHECK_OK(reader_->Close());
     return corpus;
   }
 
diff --git a/domain_tests/BUILD b/domain_tests/BUILD
index a2584b1..a558db2 100644
--- a/domain_tests/BUILD
+++ b/domain_tests/BUILD
@@ -126,6 +126,7 @@
         "@abseil-cpp//absl/random:bit_gen_ref",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:logging",
         "@com_google_fuzztest//fuzztest/internal:meta",
         "@com_google_fuzztest//fuzztest/internal:serialization",
diff --git a/domain_tests/domain_testing.h b/domain_tests/domain_testing.h
index e8b9009..9574b58 100644
--- a/domain_tests/domain_testing.h
+++ b/domain_tests/domain_testing.h
@@ -35,6 +35,7 @@
 #include "absl/status/status.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/mutation_metadata.h"
 #include "./fuzztest/internal/logging.h"
 #include "./fuzztest/internal/meta.h"
@@ -145,8 +146,8 @@
   Value(const Domain& domain, T user_value)
       : corpus_value([&]() {
           auto corpus_value = domain.FromValue(user_value);
-          FUZZTEST_INTERNAL_CHECK_PRECONDITION(corpus_value.has_value(),
-                                               "Invalid user_value!");
+          FUZZTEST_PRECONDITION(corpus_value.has_value())
+              << "Invalid user_value!";
           return *corpus_value;
         }()),
         user_value(std::move(user_value)) {}
diff --git a/e2e_tests/BUILD b/e2e_tests/BUILD
index 78cb11b..9ca044f 100644
--- a/e2e_tests/BUILD
+++ b/e2e_tests/BUILD
@@ -25,10 +25,10 @@
     hdrs = ["test_binary_util.h"],
     deps = [
         "@abseil-cpp//absl/container:flat_hash_map",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:string_view",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:flag_name",
         "@com_google_fuzztest//fuzztest/internal:subprocess",
     ],
@@ -65,6 +65,7 @@
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
         "@com_google_fuzztest//centipede:weak_sancov_stubs",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:temp_dir",
         "@com_google_fuzztest//fuzztest/internal:escaping",
         "@com_google_fuzztest//fuzztest/internal:io",
@@ -91,7 +92,7 @@
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
-        "@com_google_fuzztest//fuzztest/internal:logging",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:subprocess",
         "@re2",
     ],
@@ -146,7 +147,6 @@
         ":test_binary_util",
         "@abseil-cpp//absl/base:no_destructor",
         "@abseil-cpp//absl/container:flat_hash_map",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
diff --git a/e2e_tests/benchmark_test.cc b/e2e_tests/benchmark_test.cc
index feaa786..ef6146c 100644
--- a/e2e_tests/benchmark_test.cc
+++ b/e2e_tests/benchmark_test.cc
@@ -37,7 +37,7 @@
 #include "absl/strings/string_view.h"
 #include "absl/strings/strip.h"
 #include "absl/time/time.h"
-#include "./fuzztest/internal/logging.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/subprocess.h"
 #include "re2/re2.h"
 
@@ -65,7 +65,7 @@
 std::string SelfPath() {
   char buf[4096];
   ssize_t len = readlink("/proc/self/exe", buf, sizeof(buf));
-  FUZZTEST_INTERNAL_CHECK(len < sizeof(buf), "Path too long!");
+  FUZZTEST_CHECK(len < sizeof(buf)) << "Path too long!";
   return std::string(buf, len);
 }
 std::string MicrobenchmarksBinaryPath() {
@@ -73,28 +73,30 @@
   const std::size_t dir_path_len = self_path.find_last_of('/');
   std::string binary_path = self_path.substr(0, dir_path_len) +
                             "/testdata/fuzz_tests_for_microbenchmarking";
-  FUZZTEST_INTERNAL_CHECK(std::filesystem::exists(binary_path), "Can't find ",
-                          binary_path);
+  FUZZTEST_CHECK(std::filesystem::exists(binary_path))
+      << "Can't find " << binary_path;
   return binary_path;
 }
 
 uint64_t ExtractTime(absl::string_view output) {
   static constexpr LazyRE2 kElapsedTimeRE = {"\nElapsed time: (.+)\n"};
   std::string duration_str;
-  FUZZTEST_INTERNAL_CHECK(
-      RE2::PartialMatch(output, *kElapsedTimeRE, &duration_str),
-      "\n\nCould not find:\n\nElapsed time:\n\nin:\n\n", output);
+  FUZZTEST_CHECK(RE2::PartialMatch(output, *kElapsedTimeRE, &duration_str))
+      << "\n\nCould not find:\n\nElapsed time:\n\nin:\n\n"
+      << output;
   absl::Duration duration;
-  FUZZTEST_INTERNAL_CHECK(absl::ParseDuration(duration_str, &duration),
-                          "Could not parse duration:", duration_str);
+  FUZZTEST_CHECK(absl::ParseDuration(duration_str, &duration))
+      << "Could not parse duration:" << duration_str;
   return absl::ToInt64Nanoseconds(duration);
 }
 
 uint64_t ExtractNumber(absl::string_view output, absl::string_view name) {
   uint64_t number;
-  FUZZTEST_INTERNAL_CHECK(
-      RE2::PartialMatch(output, absl::StrCat("\n", name, ": (.+)\n"), &number),
-      "\n\nCould not find\n\n", name, ":\n\nin:\n\n", output);
+  FUZZTEST_CHECK(
+      RE2::PartialMatch(output, absl::StrCat("\n", name, ": (.+)\n"), &number))
+      << "\n\nCould not find\n\n"
+      << name << ":\n\nin:\n\n"
+      << output;
   return number;
 }
 
@@ -141,8 +143,8 @@
       // This measures the cost of the framework on processing the edge map.
       // This way we can see if differences in a CL come from edge count
       // change or from implementation changes.
-      FUZZTEST_INTERNAL_CHECK(result.stats.total_edges != 0,
-                              "Total edges cannot be zero!");
+      FUZZTEST_CHECK(result.stats.total_edges != 0)
+          << "Total edges cannot be zero!";
       json_results.push_back(SingleJsonResult(
           "Control.Edges10000(time)",
           10000 * result.stats.nanos / result.stats.total_edges));
@@ -226,8 +228,7 @@
 int main(int argc, char** argv) {
 #if defined(__has_feature)
 #if !__has_feature(coverage_sanitizer)
-  FUZZTEST_INTERNAL_CHECK(false,
-                          "\n\nPlease compile with --config=fuzztest.\n");
+  FUZZTEST_CHECK(false) << "\n\nPlease compile with --config=fuzztest.\n";
 #endif
 #endif
   absl::ParseCommandLine(argc, argv);
diff --git a/e2e_tests/corpus_database_test.cc b/e2e_tests/corpus_database_test.cc
index 98422cd..af147ec 100644
--- a/e2e_tests/corpus_database_test.cc
+++ b/e2e_tests/corpus_database_test.cc
@@ -22,7 +22,6 @@
 #include "gtest/gtest.h"
 #include "absl/base/no_destructor.h"
 #include "absl/container/flat_hash_map.h"
-#include "absl/log/check.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "absl/strings/str_cat.h"
@@ -75,11 +74,12 @@
   static void SetUpTestSuite() {
 #if defined(__has_feature)
 #if !__has_feature(address_sanitizer)
-    CHECK(false) << "The test binary is not built with ASAN. Please run with "
-                    "--config=asan.";
+    FUZZTEST_CHECK(false)
+        << "The test binary is not built with ASAN. Please run with "
+           "--config=asan.";
 #elif !__has_feature(coverage_sanitizer) || !defined(FUZZTEST_USE_CENTIPEDE)
-    CHECK(false) << "The test binary is not built with coverage "
-                    "instrumentation for Centipede. "
+    FUZZTEST_CHECK(false) << "The test binary is not built with coverage "
+                             "instrumentation for Centipede. "
     "Please run with --config=fuzztest-experimental.";
 #endif
 #endif
@@ -146,7 +146,7 @@
         return RunBinary(CentipedePath(), centipede_options);
       }
     }
-    FUZZTEST_INTERNAL_CHECK(false, "Unsupported execution model!\n");
+    FUZZTEST_INTERNAL_FUZZTEST_CHECK(false, "Unsupported execution model!\n");
   }
 
  private:
diff --git a/e2e_tests/functional_test.cc b/e2e_tests/functional_test.cc
index 9ee676e..591013b 100644
--- a/e2e_tests/functional_test.cc
+++ b/e2e_tests/functional_test.cc
@@ -33,6 +33,7 @@
 #include "absl/strings/substitute.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 #include "./common/temp_dir.h"
 #include "./e2e_tests/test_binary_util.h"
 #include "./fuzztest/internal/escaping.h"
@@ -1288,7 +1289,7 @@
         return RunBinary(CentipedePath(), run_options);
       }
     }
-    FUZZTEST_INTERNAL_CHECK(false, "Unsupported execution model!\n");
+    FUZZTEST_CHECK(false) << "Unsupported execution model!\n";
   }
 };
 
diff --git a/e2e_tests/test_binary_util.cc b/e2e_tests/test_binary_util.cc
index 7aac989..0fe3112 100644
--- a/e2e_tests/test_binary_util.cc
+++ b/e2e_tests/test_binary_util.cc
@@ -20,10 +20,10 @@
 #include <system_error>  // NOLINT
 #include <vector>
 
-#include "absl/log/check.h"
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/flag_name.h"
 #include "./fuzztest/internal/subprocess.h"
 
@@ -34,12 +34,14 @@
 // root.
 std::string GetFullPath(const std::filesystem::path& relative_path) {
   const auto test_srcdir = absl::NullSafeStringView(std::getenv("TEST_SRCDIR"));
-  CHECK(!test_srcdir.empty()) << "Please set TEST_SRCDIR to non-empty value or "
-                                 "use bazel to run the test.";
+  FUZZTEST_CHECK(!test_srcdir.empty())
+      << "Please set TEST_SRCDIR to non-empty value or "
+         "use bazel to run the test.";
   const std::string full_path =
       std::filesystem::path(test_srcdir) / "_main"
       / relative_path;
-  CHECK(std::filesystem::exists(full_path)) << "Can't find " << full_path;
+  FUZZTEST_CHECK(std::filesystem::exists(full_path))
+      << "Can't find " << full_path;
   return full_path;
 }
 
diff --git a/e2e_tests/testdata/BUILD b/e2e_tests/testdata/BUILD
index 3c623f3..b21cb8f 100644
--- a/e2e_tests/testdata/BUILD
+++ b/e2e_tests/testdata/BUILD
@@ -50,7 +50,6 @@
         "@abseil-cpp//absl/algorithm:container",
         "@abseil-cpp//absl/container:flat_hash_map",
         "@abseil-cpp//absl/container:flat_hash_set",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
         "@abseil-cpp//absl/types:span",
@@ -93,13 +92,13 @@
         "@abseil-cpp//absl/container:flat_hash_map",
         "@abseil-cpp//absl/container:flat_hash_set",
         "@abseil-cpp//absl/functional:function_ref",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/random:bit_gen_ref",
         "@abseil-cpp//absl/random:distributions",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest",
         "@com_google_fuzztest//fuzztest:fuzztest_gtest_main",
         "@com_google_fuzztest//fuzztest:googletest_fixture_adapter",
diff --git a/e2e_tests/testdata/fuzz_tests_for_functional_testing.cc b/e2e_tests/testdata/fuzz_tests_for_functional_testing.cc
index 8049505..17df652 100644
--- a/e2e_tests/testdata/fuzz_tests_for_functional_testing.cc
+++ b/e2e_tests/testdata/fuzz_tests_for_functional_testing.cc
@@ -38,6 +38,7 @@
 #include "absl/strings/string_view.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/logging.h"
 #include "./fuzztest/internal/test_protobuf.pb.h"
 #include "google/protobuf/descriptor.h"
@@ -735,12 +736,11 @@
     // where the callbacks from the signal handler happen in a separate stack.
     new_sigact.sa_flags = SA_SIGINFO | SA_ONSTACK;
 
-    FUZZTEST_INTERNAL_CHECK(sigaction(SIGUSR1, &new_sigact, nullptr) == 0,
-                            errno);
+    FUZZTEST_CHECK(sigaction(SIGUSR1, &new_sigact, nullptr) == 0) << errno;
     stack_t test_stack = {};
     test_stack.ss_size = 1 << 20;
     test_stack.ss_sp = malloc(test_stack.ss_size);
-    FUZZTEST_INTERNAL_CHECK(sigaltstack(&test_stack, &old_stack) == 0, errno);
+    FUZZTEST_CHECK(sigaltstack(&test_stack, &old_stack) == 0) << errno;
   }
 
   void StackCalculationWorksWithAlternateStackForSignalHandlers(int i) {
@@ -750,7 +750,7 @@
     // "stack overflow" detection and we will continue here.
     raise(SIGUSR1);
     // Just make sure the signal handler ran.
-    FUZZTEST_INTERNAL_CHECK(dummy_to_trigger_cmp_in_handler != 0, "");
+    FUZZTEST_CHECK(dummy_to_trigger_cmp_in_handler != 0);
 
     if (i == 123456789) {
       std::abort();
@@ -760,7 +760,7 @@
   ~AlternateSignalStackFixture() {
     stack_t test_stack = {};
     // Resume to the old signal stack.
-    FUZZTEST_INTERNAL_CHECK(sigaltstack(&old_stack, &test_stack) == 0, errno);
+    FUZZTEST_CHECK(sigaltstack(&old_stack, &test_stack) == 0) << errno;
     free(test_stack.ss_sp);
   }
 
diff --git a/e2e_tests/testdata/fuzz_tests_with_proto_inputs.cc b/e2e_tests/testdata/fuzz_tests_with_proto_inputs.cc
index 5fbc362..5cc7ee1 100644
--- a/e2e_tests/testdata/fuzz_tests_with_proto_inputs.cc
+++ b/e2e_tests/testdata/fuzz_tests_with_proto_inputs.cc
@@ -30,7 +30,6 @@
 #include "absl/algorithm/container.h"
 #include "absl/container/flat_hash_map.h"
 #include "absl/container/flat_hash_set.h"
-#include "absl/log/check.h"
 #include "absl/strings/str_cat.h"
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
diff --git a/fuzztest/BUILD b/fuzztest/BUILD
index 7dc2a14..11ef509 100644
--- a/fuzztest/BUILD
+++ b/fuzztest/BUILD
@@ -79,6 +79,7 @@
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:string_view",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:logging",
         "@com_google_fuzztest//fuzztest/internal:registration",
         "@com_google_fuzztest//fuzztest/internal:registry",
@@ -91,9 +92,9 @@
     srcs = ["fuzztest_macros_test.cc"],
     deps = [
         ":fuzztest_macros",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:temp_dir",
         "@googletest//:gtest_main",
     ],
@@ -124,6 +125,7 @@
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:configuration",
         "@com_google_fuzztest//fuzztest/internal:flag_name",
         "@com_google_fuzztest//fuzztest/internal:googletest_adaptor",
@@ -160,12 +162,11 @@
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/base:no_destructor",
         "@abseil-cpp//absl/flags:flag",
-        "@abseil-cpp//absl/log:absl_check",
         "@abseil-cpp//absl/random",
         "@abseil-cpp//absl/random:bit_gen_ref",
         "@abseil-cpp//absl/synchronization",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:io",
-        "@com_google_fuzztest//fuzztest/internal:logging",
         "@com_google_fuzztest//fuzztest/internal/domains:core_domains_impl",
     ],
     alwayslink = True,
@@ -193,6 +194,7 @@
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings:string_view",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:any",
         "@com_google_fuzztest//fuzztest/internal:logging",
         "@com_google_fuzztest//fuzztest/internal:meta",
diff --git a/fuzztest/domain_core.h b/fuzztest/domain_core.h
index 926aba4..86a520e 100644
--- a/fuzztest/domain_core.h
+++ b/fuzztest/domain_core.h
@@ -44,6 +44,7 @@
 #include "absl/status/status.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/any.h"
 #include "./fuzztest/internal/domains/aggregate_of_impl.h"
 #include "./fuzztest/internal/domains/arbitrary_impl.h"
@@ -83,18 +84,18 @@
   // values it can handle until we call Set on the name.
   template <typename T>
   Domain<T> Get(std::string_view name) {
-    FUZZTEST_INTERNAL_CHECK(domain_lookup_table_ != nullptr,
-                            "Finalize() has been called!");
+    FUZZTEST_CHECK(domain_lookup_table_ != nullptr)
+        << "Finalize() has been called!";
     return IndirectDomain<T>(GetIndirect<T>(name));
   }
 
   template <typename T>
   void Set(std::string_view name, const Domain<T>& domain) {
-    FUZZTEST_INTERNAL_CHECK(domain_lookup_table_ != nullptr,
-                            "Finalize() has been called!");
+    FUZZTEST_CHECK(domain_lookup_table_ != nullptr)
+        << "Finalize() has been called!";
     auto* indirect = GetIndirect<T>(name);
-    FUZZTEST_INTERNAL_CHECK(!indirect->has_value(),
-                            "Cannot set the same domain twice!");
+    FUZZTEST_CHECK(!indirect->has_value())
+        << "Cannot set the same domain twice!";
     *indirect = internal::MoveOnlyAny(std::in_place_type<Domain<T>>, domain);
   }
 
@@ -105,18 +106,17 @@
   // anymore.
   template <typename T>
   Domain<T> Finalize(std::string_view name) && {
-    FUZZTEST_INTERNAL_CHECK(domain_lookup_table_ != nullptr,
-                            "Finalize() has been called!");
-    FUZZTEST_INTERNAL_CHECK(
-        GetIndirect<T>(name)->has_value(),
-        // FUZZTEST_INTERNAL_CHECK uses absl::StrCat, which does not accept
+    FUZZTEST_CHECK(domain_lookup_table_ != nullptr)
+        << "Finalize() has been called!";
+    FUZZTEST_CHECK(GetIndirect<T>(name)->has_value())
+        <<
+        // FUZZTEST_CHECK uses absl::StrCat, which does not accept
         // std::string_view in iOS builds, so convert to absl::string_view.
-        "Finalize() has been called with an unknown name: ",
-        absl::string_view{name.data(), name.size()});
+        "Finalize() has been called with an unknown name: "
+        << absl::string_view{name.data(), name.size()};
     for (auto& iter : *domain_lookup_table_) {
-      FUZZTEST_INTERNAL_CHECK(
-          iter.second != nullptr && iter.second->has_value(),
-          "Some domain is not set yet!");
+      FUZZTEST_CHECK(iter.second != nullptr && iter.second->has_value())
+          << "Some domain is not set yet!";
     }
     auto domain = GetIndirect<T>(name)->template GetAs<Domain<T>>();
     return OwningDomain<T>(std::move(domain), std::move(domain_lookup_table_));
@@ -140,9 +140,8 @@
     if (!indirection) {
       indirection = std::make_unique<internal::MoveOnlyAny>();
     }
-    FUZZTEST_INTERNAL_CHECK(
-        !indirection->has_value() || indirection->Has<Domain<T>>(),
-        "The indirection must either be empty or hold a value of Domain<T>");
+    FUZZTEST_CHECK(!indirection->has_value() || indirection->Has<Domain<T>>())
+        << "The indirection must either be empty or hold a value of Domain<T>";
     return indirection.get();
   }
 
diff --git a/fuzztest/fuzztest_macros.cc b/fuzztest/fuzztest_macros.cc
index c8b5da3..ee3b1c5 100644
--- a/fuzztest/fuzztest_macros.cc
+++ b/fuzztest/fuzztest_macros.cc
@@ -32,6 +32,7 @@
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_split.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/logging.h"
 #include "./fuzztest/internal/runtime.h"
 
@@ -88,17 +89,17 @@
     std::string_view dir, std::function<bool(std::string_view)> filter) {
   std::vector<std::tuple<std::string>> out;
   const std::filesystem::path fs_dir(dir);
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(std::filesystem::is_directory(fs_dir),
-                                       "Not a directory: ", fs_dir.string());
+  FUZZTEST_PRECONDITION(std::filesystem::is_directory(fs_dir))
+      << "Not a directory: " << fs_dir.string();
   for (const auto& entry :
        std::filesystem::recursive_directory_iterator(fs_dir)) {
     if (std::filesystem::is_directory(entry)) continue;
     if (!filter(entry.path().string())) continue;
 
     std::ifstream stream(entry.path());
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        stream.good(), "Cannot read input file: ", entry.path().string(), ": ",
-        strerror(errno));
+    FUZZTEST_PRECONDITION(stream.good())
+        << "Cannot read input file: " << entry.path().string() << ": "
+        << strerror(errno);
 
     std::stringstream buffer;
     buffer << stream.rdbuf();
@@ -145,20 +146,19 @@
 
 std::vector<std::string> ReadDictionaryFromFile(
     std::string_view dictionary_file) {
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-      !std::filesystem::is_directory(dictionary_file),
-      "Not a file: ", dictionary_file);
+  FUZZTEST_PRECONDITION(!std::filesystem::is_directory(dictionary_file))
+      << "Not a file: " << dictionary_file;
   const std::filesystem::path fs_path(dictionary_file);
   std::ifstream stream(fs_path);
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(stream.good(), "Error reading ",
-                                       fs_path.string(), ": ", strerror(errno));
+  FUZZTEST_PRECONDITION(stream.good())
+      << "Error reading " << fs_path.string() << ": " << strerror(errno);
   std::stringstream buffer;
   buffer << stream.rdbuf();
   absl::StatusOr<std::vector<std::string>> parsed_entries =
       ParseDictionary(buffer.str());
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-      parsed_entries.status().ok(), "Could not parse dictionary file ",
-      fs_path.string(), ": ", parsed_entries.status());
+  FUZZTEST_PRECONDITION(parsed_entries.status().ok())
+      << "Could not parse dictionary file " << fs_path.string() << ": "
+      << parsed_entries.status();
   return *parsed_entries;
 }
 
diff --git a/fuzztest/fuzztest_macros_test.cc b/fuzztest/fuzztest_macros_test.cc
index 0ddc009..41f44d9 100644
--- a/fuzztest/fuzztest_macros_test.cc
+++ b/fuzztest/fuzztest_macros_test.cc
@@ -8,9 +8,9 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
 #include "absl/status/status.h"
 #include "absl/strings/match.h"
+#include "./common/logging.h"
 #include "./common/temp_dir.h"
 
 namespace fuzztest::internal {
@@ -24,7 +24,7 @@
 
 void WriteFile(const std::string& file_name, const std::string& contents) {
   std::ofstream f(file_name);
-  CHECK(f.is_open());
+  FUZZTEST_CHECK(f.is_open());
   f << contents;
   f.close();
 }
diff --git a/fuzztest/init_fuzztest.cc b/fuzztest/init_fuzztest.cc
index 39b6d59..421c0d8 100644
--- a/fuzztest/init_fuzztest.cc
+++ b/fuzztest/init_fuzztest.cc
@@ -30,6 +30,7 @@
 #include "absl/strings/string_view.h"
 #include "absl/strings/strip.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/configuration.h"
 #include "./fuzztest/internal/flag_name.h"
 #include "./fuzztest/internal/googletest_adaptor.h"
@@ -189,12 +190,12 @@
     "Internal-only flag - do not use directly. If set, only perform operations "
     "for the exact fuzz test regardless of other flags.")
     .OnUpdate([] {
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
+      FUZZTEST_PRECONDITION(
           !absl::GetFlag(FUZZTEST_FLAG(internal_override_fuzz_test))
-                  .has_value() ||
-              std::getenv("CENTIPEDE_RUNNER_FLAGS") != nullptr,
-          "must not set --" FUZZTEST_FLAG_PREFIX
-          "internal_override_fuzz_test directly");
+               .has_value() ||
+          std::getenv("CENTIPEDE_RUNNER_FLAGS") != nullptr)
+          << "must not set --" FUZZTEST_FLAG_PREFIX
+             "internal_override_fuzz_test directly";
     });
 
 FUZZTEST_DEFINE_FLAG(
@@ -205,12 +206,12 @@
     "--" FUZZTEST_FLAG_PREFIX "fuzz_for / --" FUZZTEST_FLAG_PREFIX
     "replay_corpus_for with --time_budget_type set to total.")
     .OnUpdate([] {
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
+      FUZZTEST_PRECONDITION(
           absl::GetFlag(FUZZTEST_FLAG(internal_override_total_time_limit)) ==
-                  absl::InfiniteDuration() ||
-              std::getenv("CENTIPEDE_RUNNER_FLAGS") != nullptr,
-          "must not set --" FUZZTEST_FLAG_PREFIX
-          "internal_override_total_time_limit directly");
+              absl::InfiniteDuration() ||
+          std::getenv("CENTIPEDE_RUNNER_FLAGS") != nullptr)
+          << "must not set --" FUZZTEST_FLAG_PREFIX
+             "internal_override_total_time_limit directly";
     });
 
 FUZZTEST_DEFINE_FLAG(std::optional<std::string>,
@@ -220,12 +221,12 @@
                      "internal_override_fuzz_test are set, replay "
                      "the input in the corpus database with the specified ID.")
     .OnUpdate([] {
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
+      FUZZTEST_PRECONDITION(
           !absl::GetFlag(FUZZTEST_FLAG(internal_crashing_input_to_reproduce))
-                  .has_value() ||
-              std::getenv("CENTIPEDE_RUNNER_FLAGS") != nullptr,
-          "must not set --" FUZZTEST_FLAG_PREFIX
-          "internal_crashing_input_to_reproduce directly");
+               .has_value() ||
+          std::getenv("CENTIPEDE_RUNNER_FLAGS") != nullptr)
+          << "must not set --" FUZZTEST_FLAG_PREFIX
+             "internal_crashing_input_to_reproduce directly";
     });
 
 namespace fuzztest {
@@ -324,8 +325,9 @@
           ? internal::TimeBudgetType::kTotal
           : absl::GetFlag(FUZZTEST_FLAG(time_budget_type));
   const std::optional<size_t> jobs = absl::GetFlag(FUZZTEST_FLAG(jobs));
-  FUZZTEST_INTERNAL_CHECK(!jobs.has_value() || *jobs > 0, "If specified, --",
-                          FUZZTEST_FLAG(jobs).Name(), " must be positive.");
+  FUZZTEST_CHECK(!jobs.has_value() || *jobs > 0)
+      << "If specified, --" << FUZZTEST_FLAG(jobs).Name()
+      << " must be positive.";
   return internal::Configuration{
       absl::GetFlag(FUZZTEST_FLAG(corpus_database)),
       /*stats_root=*/"",
@@ -378,9 +380,8 @@
   std::optional<absl::Duration> fuzzing_time_limit = GetFuzzingTime();
   std::optional<absl::Duration> replay_corpus_time_limit =
       GetReplayCorpusTime();
-  FUZZTEST_INTERNAL_CHECK(
-      !fuzzing_time_limit || !replay_corpus_time_limit,
-      "Cannot run in fuzzing and corpus replay mode at the same time.");
+  FUZZTEST_CHECK(!fuzzing_time_limit || !replay_corpus_time_limit)
+      << "Cannot run in fuzzing and corpus replay mode at the same time.";
   const auto test_to_fuzz = absl::GetFlag(FUZZTEST_FLAG(fuzz));
   const auto test_to_replay_corpus =
       absl::GetFlag(FUZZTEST_FLAG(replay_corpus));
diff --git a/fuzztest/internal/BUILD b/fuzztest/internal/BUILD
index 5f88da0..01f5c94 100644
--- a/fuzztest/internal/BUILD
+++ b/fuzztest/internal/BUILD
@@ -24,6 +24,7 @@
     deps = [
         ":logging",
         ":meta",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -56,7 +57,6 @@
         "@abseil-cpp//absl/algorithm:container",
         "@abseil-cpp//absl/base:no_destructor",
         "@abseil-cpp//absl/functional:any_invocable",
-        "@abseil-cpp//absl/log:absl_log",
         "@abseil-cpp//absl/memory",
         "@abseil-cpp//absl/random",
         "@abseil-cpp//absl/random:distributions",
@@ -78,6 +78,7 @@
         "@com_google_fuzztest//centipede:stop",
         "@com_google_fuzztest//centipede:workdir",
         "@com_google_fuzztest//common:defs",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
         "@com_google_fuzztest//common:temp_dir",
         "@com_google_fuzztest//fuzztest/internal/domains:core_domains_impl",
@@ -107,12 +108,12 @@
     srcs = ["configuration.cc"],
     hdrs = ["configuration.h"],
     deps = [
-        "@abseil-cpp//absl/log:absl_check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:string_view",
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -155,7 +156,7 @@
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/types:span",
-        "@com_google_fuzztest//fuzztest/internal/domains:core_domains_impl",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -196,6 +197,7 @@
         ":registration",
         "@abseil-cpp//absl/functional:any_invocable",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest:domain_core",
         "@googletest//:gtest_main",
     ],
@@ -243,6 +245,7 @@
         "@abseil-cpp//absl/types:span",
         "@com_google_fuzztest//common:blob_file",
         "@com_google_fuzztest//common:defs",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//common:remote_file",
     ] + select({
         "//conditions:default": [],
@@ -254,7 +257,6 @@
     srcs = ["io_test.cc"],
     deps = [
         ":io",
-        "@abseil-cpp//absl/log:check",
         "@abseil-cpp//absl/status",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
@@ -274,6 +276,7 @@
         "@abseil-cpp//absl/base:core_headers",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/synchronization",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -299,9 +302,9 @@
     deps = [
         "@abseil-cpp//absl/base:fast_type_id",
         "@abseil-cpp//absl/functional:function_ref",
-        "@abseil-cpp//absl/log:absl_check",
         "@abseil-cpp//absl/random:distributions",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -360,7 +363,6 @@
         "@abseil-cpp//absl/functional:any_invocable",
         "@abseil-cpp//absl/functional:bind_front",
         "@abseil-cpp//absl/functional:function_ref",
-        "@abseil-cpp//absl/log:absl_check",
         "@abseil-cpp//absl/random",
         "@abseil-cpp//absl/random:bit_gen_ref",
         "@abseil-cpp//absl/random:distributions",
@@ -371,6 +373,7 @@
         "@abseil-cpp//absl/time",
         "@abseil-cpp//absl/types:span",
         "@com_google_fuzztest//common:bazel",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal/domains:core_domains_impl",
     ],
 )
@@ -400,6 +403,7 @@
         "@abseil-cpp//absl/random",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
@@ -454,12 +458,12 @@
     srcs = ["subprocess.cc"],
     hdrs = ["subprocess.h"],
     deps = [
-        ":logging",
         "@abseil-cpp//absl/container:flat_hash_map",
         "@abseil-cpp//absl/functional:function_ref",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/time",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
     ],
 )
 
diff --git a/fuzztest/internal/any.h b/fuzztest/internal/any.h
index 6c26c97..184e3a7 100644
--- a/fuzztest/internal/any.h
+++ b/fuzztest/internal/any.h
@@ -20,6 +20,7 @@
 #include <type_traits>
 #include <utility>
 
+#include "./common/logging.h"
 #include "./fuzztest/internal/logging.h"
 #include "./fuzztest/internal/meta.h"
 
@@ -44,8 +45,8 @@
   }
 
   bool has_value() const {
-    FUZZTEST_INTERNAL_CHECK((vtable_ == nullptr) == (value_ == nullptr),
-                            "Inconsistent state between value and vtable.");
+    FUZZTEST_CHECK((vtable_ == nullptr) == (value_ == nullptr))
+        << "Inconsistent state between value and vtable.";
     return value_ != nullptr;
   }
 
@@ -56,29 +57,29 @@
 
   template <typename T>
   T& GetAs() & {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(has_value(), "Object is empty!");
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(Has<T>(), "Wrong type!");
+    FUZZTEST_PRECONDITION(has_value()) << "Object is empty!";
+    FUZZTEST_PRECONDITION(Has<T>()) << "Wrong type!";
     return *static_cast<T*>(value_);
   }
 
   template <typename T>
   const T& GetAs() const& {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(has_value(), "Object is empty!");
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(Has<T>(), "Wrong type!");
+    FUZZTEST_PRECONDITION(has_value()) << "Object is empty!";
+    FUZZTEST_PRECONDITION(Has<T>()) << "Wrong type!";
     return *static_cast<T*>(value_);
   }
 
   template <typename T>
   T&& GetAs() && {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(has_value(), "Object is empty!");
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(Has<T>(), "Wrong type!");
+    FUZZTEST_PRECONDITION(has_value()) << "Object is empty!";
+    FUZZTEST_PRECONDITION(Has<T>()) << "Wrong type!";
     return std::move(*static_cast<T*>(value_));
   }
 
   template <typename T>
   const T&& GetAs() const&& {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(has_value(), "Object is empty!");
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(Has<T>(), "Wrong type!");
+    FUZZTEST_PRECONDITION(has_value()) << "Object is empty!";
+    FUZZTEST_PRECONDITION(Has<T>()) << "Wrong type!";
     return std::move(*static_cast<const T*>(value_));
   }
 
@@ -104,7 +105,7 @@
   }
 
   void CopyFrom(const AnyBase& other) {
-    FUZZTEST_INTERNAL_CHECK(!has_value(), "CopyFrom called on a full object");
+    FUZZTEST_CHECK(!has_value()) << "CopyFrom called on a full object";
     if (other.has_value()) {
       vtable_ = other.vtable_;
       value_ = vtable_->copy(other.value_);
diff --git a/fuzztest/internal/centipede_adaptor.cc b/fuzztest/internal/centipede_adaptor.cc
index 13833ca..8266266 100644
--- a/fuzztest/internal/centipede_adaptor.cc
+++ b/fuzztest/internal/centipede_adaptor.cc
@@ -48,7 +48,6 @@
 #include "absl/algorithm/container.h"
 #include "absl/base/no_destructor.h"
 #include "absl/functional/any_invocable.h"
-#include "absl/log/absl_log.h"
 #include "absl/memory/memory.h"
 #include "absl/random/distributions.h"
 #include "absl/random/random.h"
@@ -75,6 +74,7 @@
 #include "./centipede/stop.h"
 #include "./centipede/workdir.h"
 #include "./common/defs.h"
+#include "./common/logging.h"
 #include "./common/remote_file.h"
 #include "./common/temp_dir.h"
 #include "./fuzztest/internal/any.h"
@@ -209,19 +209,17 @@
         std::numeric_limits<decltype(env.timeout_per_input)>::max());
   }
   constexpr size_t kMiB = 1024 * 1024;
-  FUZZTEST_INTERNAL_CHECK(configuration.rss_limit % kMiB == 0,
-                          "configuration.rss_limit is not a multiple of MiB.");
+  FUZZTEST_CHECK(configuration.rss_limit % kMiB == 0)
+      << "configuration.rss_limit is not a multiple of MiB.";
   env.rss_limit_mb = configuration.rss_limit / kMiB;
   constexpr size_t kKiB = 1024;
-  FUZZTEST_INTERNAL_CHECK(
-      configuration.stack_limit % kKiB == 0,
-      "configuration.stack_limit is not a multiple of KiB.");
+  FUZZTEST_CHECK(configuration.stack_limit % kKiB == 0)
+      << "configuration.stack_limit is not a multiple of KiB.";
   env.stack_limit_kb = configuration.stack_limit / kKiB;
   env.populate_binary_info = false;
   const auto args = GetProcessArgs();
-  FUZZTEST_INTERNAL_CHECK(
-      args.ok(),
-      absl::StrCat("failed to get the original process args: ", args.status()));
+  FUZZTEST_CHECK(args.ok()) << absl::StrCat(
+      "failed to get the original process args: ", args.status());
   env.binary.clear();
   for (const auto& arg : *args) {
     // We need shell escaping, because env.binary will be passed to system(),
@@ -348,9 +346,9 @@
       // needs to be properly handled.
       new_sigact.sa_flags = SA_ONSTACK;
 
-      FUZZTEST_INTERNAL_CHECK(sigaction(signum, &new_sigact, nullptr) == 0,
-                              "Error installing signal handler: %s\n",
-                              strerror(errno));
+      FUZZTEST_CHECK(sigaction(signum, &new_sigact, nullptr) == 0)
+          << "Error installing signal handler: %s\n"
+          << strerror(errno);
     }
     return true;
   }();
@@ -387,8 +385,8 @@
       // Encoding signaled exit similarly as Bash.
       return 128 + static_cast<int>(std::get<SignalT>(status.Status()));
     }
-    FUZZTEST_INTERNAL_CHECK(
-        status.Exited(), "Termination status must be Exited if not Signaled");
+    FUZZTEST_CHECK(status.Exited())
+        << "Termination status must be Exited if not Signaled";
     return static_cast<int>(std::get<ExitCodeT>(status.Status()));
   }
   static absl::NoDestructor<DefaultCallbacksFactory<CentipedeDefaultCallbacks>>
@@ -557,8 +555,8 @@
     metadata->ForEachCmpEntry(
         [&cmp_tables](fuzztest::internal::ByteSpan a,
                       fuzztest::internal::ByteSpan b) {
-          FUZZTEST_INTERNAL_CHECK(a.size() == b.size(),
-                                  "cmp operands must have the same size");
+          FUZZTEST_CHECK(a.size() == b.size())
+              << "cmp operands must have the same size";
           const size_t size = a.size();
           if (size < kMinCmpEntrySize) return;
           if (size > kMaxCmpEntrySize) return;
@@ -627,8 +625,8 @@
 
   void RunFuzzTest(absl::AnyInvocable<void() &&> run_fuzz_test_once) override {
     orig_fixture_driver_->RunFuzzTest([&, this] {
-      FUZZTEST_INTERNAL_CHECK(configuration_ != nullptr,
-                              "Setting up a fuzz test without configuration!");
+      FUZZTEST_CHECK(configuration_ != nullptr)
+          << "Setting up a fuzz test without configuration!";
       PopulateTestLimitsToCentipedeRunner(*configuration_);
       std::move(run_fuzz_test_once)();
     });
@@ -675,8 +673,8 @@
       centipede_fixture_driver_(
           new CentipedeFixtureDriver(runtime_, std::move(fixture_driver))),
       fuzzer_impl_(test_, absl::WrapUnique(centipede_fixture_driver_)) {
-  FUZZTEST_INTERNAL_CHECK(centipede_fixture_driver_ != nullptr,
-                          "Invalid fixture driver!");
+  FUZZTEST_CHECK(centipede_fixture_driver_ != nullptr)
+      << "Invalid fixture driver!";
 }
 
 bool CentipedeFuzzerAdaptor::RunInUnitTestMode(
@@ -768,9 +766,8 @@
                     output.dir_path);
       break;
     default:
-      FUZZTEST_INTERNAL_CHECK(false,
-                              "unsupported reproducer output location type "
-                              "to report reproducers from Centipede");
+      FUZZTEST_CHECK(false) << "unsupported reproducer output location type "
+                               "to report reproducers from Centipede";
   }
 
   // Will be set when there is only one reproducer - nullopt otherwise.
@@ -903,26 +900,25 @@
           runner_callbacks);
       return;
     });
-    FUZZTEST_INTERNAL_CHECK(result.has_value(),
-                            "No result is set for running fuzz test");
+    FUZZTEST_CHECK(result.has_value())
+        << "No result is set for running fuzz test";
     return *result == EXIT_SUCCESS;
   } else if (is_running_property_function_in_this_process) {
     // If `is_running_property_function_in_this_process` holds at this point. We
     // assume it is for `ReplayInputsIfAvailable` to handle `FUZZTEST_REPLAY`
     // and `FUZZTEST_MINIMIZE_REPRODUCER`, which Centipede does not support.
     // This is fine because it does not require coverage instrumentation.
-    FUZZTEST_INTERNAL_CHECK(
-        std::getenv("FUZZTEST_REPLAY") ||
-            std::getenv("FUZZTEST_MINIMIZE_REPRODUCER"),
-        "Both env vars `FUZZTEST_REPLAY` and `FUZZTEST_MINIMIZE_REPRODUCER` "
-        "are not set when calling the legacy input replaying - this is a "
-        "FuzzTest bug!");
+    FUZZTEST_CHECK(std::getenv("FUZZTEST_REPLAY") ||
+                   std::getenv("FUZZTEST_MINIMIZE_REPRODUCER"))
+        << "Both env vars `FUZZTEST_REPLAY` and `FUZZTEST_MINIMIZE_REPRODUCER` "
+           "are not set when calling the legacy input replaying - this is a "
+           "FuzzTest bug!";
     fuzzer_impl_.fixture_driver_->RunFuzzTest([&, this]() {
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-          fuzzer_impl_.ReplayInputsIfAvailable(configuration),
-          "ReplayInputsIfAvailable failed to handle env vars `FUZZTEST_REPLAY` "
-          "or `FUZZTEST_MINIMIZE_REPRODUCER`. Please check if they are set "
-          "properly.");
+      FUZZTEST_PRECONDITION(fuzzer_impl_.ReplayInputsIfAvailable(configuration))
+          << "ReplayInputsIfAvailable failed to handle env vars "
+             "`FUZZTEST_REPLAY` "
+             "or `FUZZTEST_MINIMIZE_REPRODUCER`. Please check if they are set "
+             "properly.";
       return;
     });
     return true;
@@ -942,9 +938,9 @@
       const std::string minimize_dir = minimize_dir_chars;
       const char* corpus_out_dir_chars =
           std::getenv("FUZZTEST_TESTSUITE_OUT_DIR");
-      FUZZTEST_INTERNAL_CHECK(corpus_out_dir_chars != nullptr,
-                              "FUZZTEST_TESTSUITE_OUT_DIR must be specified "
-                              "when minimizing testsuite");
+      FUZZTEST_CHECK(corpus_out_dir_chars != nullptr)
+          << "FUZZTEST_TESTSUITE_OUT_DIR must be specified "
+             "when minimizing testsuite";
       const std::string corpus_out_dir = corpus_out_dir_chars;
       absl::FPrintF(
           GetStderr(),
@@ -957,32 +953,32 @@
       // The first empty path means no output dir.
       replay_env.corpus_dir = {"", minimize_dir};
       replay_env.load_shards_only = true;
-      FUZZTEST_INTERNAL_CHECK(
-          RunCentipede(replay_env, configuration.centipede_command) == 0,
-          "Failed to replaying the testsuite for minimization");
+      FUZZTEST_CHECK(
+          RunCentipede(replay_env, configuration.centipede_command) == 0)
+          << "Failed to replaying the testsuite for minimization";
       absl::FPrintF(GetStderr(), "[.] Imported the corpus from %s.\n",
                     minimize_dir);
       // 2. Run Centipede distillation on the shard.
       auto distill_env = env;
       distill_env.distill = true;
-      FUZZTEST_INTERNAL_CHECK(
-          RunCentipede(distill_env, configuration.centipede_command) == 0,
-          "Failed to minimize the testsuite");
+      FUZZTEST_CHECK(
+          RunCentipede(distill_env, configuration.centipede_command) == 0)
+          << "Failed to minimize the testsuite";
       absl::FPrintF(GetStderr(),
                     "[.] Minimized the corpus using Centipede distillation.\n");
       // 3. Replace the shard corpus data with the distillation result.
       auto distill_workdir = fuzztest::internal::WorkDir(distill_env);
-      FUZZTEST_INTERNAL_CHECK(
+      FUZZTEST_CHECK(
           std::rename(
               distill_workdir.DistilledCorpusFilePaths().MyShard().c_str(),
-              distill_workdir.CorpusFilePaths().MyShard().c_str()) == 0,
-          "Failed to replace the corpus data with the minimized result");
+              distill_workdir.CorpusFilePaths().MyShard().c_str()) == 0)
+          << "Failed to replace the corpus data with the minimized result";
       // 4. Export the corpus of the shard.
       auto export_env = env;
       export_env.corpus_to_files = corpus_out_dir;
-      FUZZTEST_INTERNAL_CHECK(
-          RunCentipede(export_env, configuration.centipede_command) == 0,
-          "Failed to export the corpus to FUZZTEST_MINIMIZE_TESTSUITE_DIR");
+      FUZZTEST_CHECK(
+          RunCentipede(export_env, configuration.centipede_command) == 0)
+          << "Failed to export the corpus to FUZZTEST_MINIMIZE_TESTSUITE_DIR";
       absl::FPrintF(GetStderr(),
                     "[.] Exported the minimized the corpus to %s.\n",
                     corpus_out_dir);
diff --git a/fuzztest/internal/configuration.cc b/fuzztest/internal/configuration.cc
index f4f0ffc..ebe7304 100644
--- a/fuzztest/internal/configuration.cc
+++ b/fuzztest/internal/configuration.cc
@@ -22,12 +22,12 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/absl_check.h"
 #include "absl/status/status.h"
 #include "absl/status/statusor.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 
@@ -99,14 +99,14 @@
 template <int&... ExplicitArgumentBarrier, typename IntT,
           typename = std::enable_if_t<std::is_integral_v<IntT>>>
 size_t WriteIntegral(std::string& out, size_t offset, IntT val) {
-  ABSL_CHECK_GE(out.size(), offset + SpaceFor(val));
+  FUZZTEST_CHECK_GE(out.size(), offset + SpaceFor(val));
   std::memcpy(out.data() + offset, &val, SpaceFor(val));
   offset += SpaceFor(val);
   return offset;
 }
 
 size_t WriteString(std::string& out, size_t offset, absl::string_view str) {
-  ABSL_CHECK_GE(out.size(), offset + SpaceFor(str));
+  FUZZTEST_CHECK_GE(out.size(), offset + SpaceFor(str));
   offset = WriteIntegral(out, offset, str.size());
   std::memcpy(out.data() + offset, str.data(), str.size());
   offset += str.size();
@@ -115,7 +115,7 @@
 
 size_t WriteOptionalString(std::string& out, size_t offset,
                            const std::optional<std::string>& str) {
-  ABSL_CHECK_GE(out.size(), offset + SpaceFor(str));
+  FUZZTEST_CHECK_GE(out.size(), offset + SpaceFor(str));
   offset = WriteIntegral(out, offset, str.has_value());
   if (str.has_value()) {
     offset = WriteString(out, offset, *str);
@@ -125,7 +125,7 @@
 
 size_t WriteVectorOfStrings(std::string& out, size_t offset,
                             const std::vector<std::string>& vec) {
-  ABSL_CHECK_GE(out.size(), offset + SpaceFor(vec));
+  FUZZTEST_CHECK_GE(out.size(), offset + SpaceFor(vec));
   offset = WriteIntegral(out, offset, vec.size());
   for (const std::string& str : vec) {
     offset = WriteString(out, offset, str);
@@ -236,7 +236,7 @@
   offset = WriteOptionalString(out, offset, centipede_command);
   offset = WriteOptionalString(out, offset, crashing_input_to_reproduce);
   offset = WriteOptionalString(out, offset, reproduction_command_template);
-  ABSL_CHECK_EQ(offset, out.size());
+  FUZZTEST_CHECK_EQ(offset, out.size());
   return out;
 }
 
diff --git a/fuzztest/internal/coverage.cc b/fuzztest/internal/coverage.cc
index bb647d4..43c25d7 100644
--- a/fuzztest/internal/coverage.cc
+++ b/fuzztest/internal/coverage.cc
@@ -26,6 +26,7 @@
 #include "absl/base/attributes.h"
 #include "absl/strings/str_format.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/flag_name.h"
 #include "./fuzztest/internal/logging.h"
 #include "./fuzztest/internal/table_of_recent_compares.h"
@@ -198,8 +199,8 @@
 FUZZTEST_INTERNAL_NOSANITIZE bool UpdateVectorized(
     const uint8_t *execution_data, uint8_t *corpus_data, size_t size,
     size_t offset_to_align) {
-  FUZZTEST_INTERNAL_CHECK(size >= kVectorSize,
-                          "size cannot be smaller than block size!");
+  FUZZTEST_CHECK(size >= kVectorSize)
+      << "size cannot be smaller than block size!";
 
   // Avoid collapsing the "greater than" vector until the end.
   Vector any_greater{};
@@ -290,8 +291,8 @@
   absl::Span<uint8_t> execution_map = execution_coverage->GetCounterMap();
   // Note: corpus_map_size_ will be larger than execution_map.size().
   // See the constructor for more details.
-  FUZZTEST_INTERNAL_CHECK(execution_map.size() <= corpus_map_size_,
-                          "Map size mismatch.");
+  FUZZTEST_CHECK(execution_map.size() <= corpus_map_size_)
+      << "Map size mismatch.";
 
   // Calculate the offset required to align `p` to alignof(Vector).
   void* p = execution_map.data();
@@ -348,10 +349,8 @@
 // where [start,end) is the array of 8-bit counters created for the current DSO.
 extern "C" void __sanitizer_cov_8bit_counters_init(uint8_t* start,
                                                    uint8_t* stop) {
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(start != nullptr,
-                                       "Invalid counter map address.");
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(start < stop,
-                                       "Invalid counter map size.");
+  FUZZTEST_PRECONDITION(start != nullptr) << "Invalid counter map address.";
+  FUZZTEST_PRECONDITION(start < stop) << "Invalid counter map size.";
   size_t map_size = stop - start;
 
   // For now, we assume single DSO. This means that this call back should get
diff --git a/fuzztest/internal/domains/BUILD b/fuzztest/internal/domains/BUILD
index 5a1d738..5e605dd 100644
--- a/fuzztest/internal/domains/BUILD
+++ b/fuzztest/internal/domains/BUILD
@@ -21,6 +21,7 @@
     hdrs = ["absl_helpers.h"],
     deps = [
         "@abseil-cpp//absl/time",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:logging",
     ],
 )
@@ -57,8 +58,6 @@
         ":absl_helpers",
         "@abseil-cpp//absl/container:flat_hash_set",
         "@abseil-cpp//absl/functional:function_ref",
-        "@abseil-cpp//absl/log:absl_check",
-        "@abseil-cpp//absl/log:absl_log",
         "@abseil-cpp//absl/numeric:bits",
         "@abseil-cpp//absl/numeric:int128",
         "@abseil-cpp//absl/random",
@@ -69,6 +68,7 @@
         "@abseil-cpp//absl/strings:str_format",
         "@abseil-cpp//absl/time",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest:fuzzing_bit_gen",
         "@com_google_fuzztest//fuzztest/internal:any",
         "@com_google_fuzztest//fuzztest/internal:logging",
@@ -89,30 +89,18 @@
     ],
     deps = [
         ":core_domains_impl",
-        ":in_grammar_impl",
-        ":in_regexp_impl",
-        ":protobuf_domain_impl",
-        "@abseil-cpp//absl/base:core_headers",
-        "@abseil-cpp//absl/base:no_destructor",
-        "@abseil-cpp//absl/container:flat_hash_map",
-        "@abseil-cpp//absl/container:flat_hash_set",
         "@abseil-cpp//absl/functional:function_ref",
-        "@abseil-cpp//absl/random",
         "@abseil-cpp//absl/random:bit_gen_ref",
         "@abseil-cpp//absl/random:distributions",
         "@abseil-cpp//absl/status",
-        "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
-        "@abseil-cpp//absl/synchronization",
-        "@abseil-cpp//absl/types:span",
-        "@com_google_fuzztest//fuzztest:domain_core",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:any",
         "@com_google_fuzztest//fuzztest/internal:logging",
         "@com_google_fuzztest//fuzztest/internal:meta",
         "@com_google_fuzztest//fuzztest/internal:printer",
         "@com_google_fuzztest//fuzztest/internal:serialization",
-        "@com_google_fuzztest//fuzztest/internal:status",
         "@com_google_fuzztest//fuzztest/internal:type_support",
     ],
 )
@@ -154,6 +142,7 @@
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:logging",
         "@com_google_fuzztest//fuzztest/internal:serialization",
         "@com_google_fuzztest//fuzztest/internal:status",
@@ -177,6 +166,7 @@
         "@abseil-cpp//absl/strings:string_view",
         "@abseil-cpp//absl/synchronization",
         "@abseil-cpp//absl/types:span",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest:domain_core",
         "@com_google_fuzztest//fuzztest/internal:any",
         "@com_google_fuzztest//fuzztest/internal:logging",
@@ -199,6 +189,7 @@
         "@abseil-cpp//absl/status:statusor",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:string_view",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:logging",
         "@re2",
     ],
diff --git a/fuzztest/internal/domains/absl_helpers.h b/fuzztest/internal/domains/absl_helpers.h
index 57eafed..efcfe7c 100644
--- a/fuzztest/internal/domains/absl_helpers.h
+++ b/fuzztest/internal/domains/absl_helpers.h
@@ -20,6 +20,7 @@
 #include <utility>
 
 #include "absl/time/time.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/logging.h"
 
 namespace fuzztest::internal {
@@ -31,8 +32,8 @@
 inline absl::Duration MakeDuration(int64_t secs, uint32_t ticks) {
   // The granularity of a duration is as small as a quarter of a
   // nanosecond.
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(ticks >= 0u && ticks <= 3'999'999'999u,
-                                       "Ticks should be in range [0, 4B - 1]!");
+  FUZZTEST_PRECONDITION(ticks >= 0u && ticks <= 3'999'999'999u)
+      << "Ticks should be in range [0, 4B - 1]!";
   return absl::Seconds(secs) + (absl::Nanoseconds(1) / 4) * ticks;
 }
 
@@ -43,13 +44,13 @@
   int64_t ticks = (4 * rem) / absl::Nanoseconds(1);
   if (ticks < 0) {
     // It is impossible to have both a negative remainder and int64min seconds.
-    FUZZTEST_INTERNAL_CHECK(secs != std::numeric_limits<int64_t>::min(),
-                            "Seconds should not be int64 min!");
+    FUZZTEST_CHECK(secs != std::numeric_limits<int64_t>::min())
+        << "Seconds should not be int64 min!";
     secs -= 1;
     ticks += 4'000'000'000;
   }
-  FUZZTEST_INTERNAL_CHECK(0 <= ticks && ticks < 4'000'000'000,
-                          "Ticks should be in range [0, 4B - 1]!");
+  FUZZTEST_CHECK(0 <= ticks && ticks < 4'000'000'000)
+      << "Ticks should be in range [0, 4B - 1]!";
   return {secs, static_cast<uint32_t>(ticks)};
 }
 
diff --git a/fuzztest/internal/domains/bit_flag_combination_of_impl.h b/fuzztest/internal/domains/bit_flag_combination_of_impl.h
index 3ed7a52..6ad3deb 100644
--- a/fuzztest/internal/domains/bit_flag_combination_of_impl.h
+++ b/fuzztest/internal/domains/bit_flag_combination_of_impl.h
@@ -21,6 +21,7 @@
 #include "absl/random/bit_gen_ref.h"
 #include "absl/status/status.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/logging.h"
 #include "./fuzztest/internal/type_support.h"
@@ -35,19 +36,18 @@
 
   explicit BitFlagCombinationOfImpl(absl::Span<const T> flags)
       : flags_(flags.begin(), flags.end()), all_flags_combo_{} {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        !flags.empty(), "BitFlagCombinationOf requires a non empty list.");
+    FUZZTEST_PRECONDITION(!flags.empty())
+        << "BitFlagCombinationOf requires a non empty list.";
     // Make sure they are mutually exclusive metadata, only_shrink and none are
     // empty.
     for (int i = 0; i < flags.size(); ++i) {
       T v1 = flags[i];
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-          v1 != T{}, "BitFlagCombinationOf requires non zero flags.");
+      FUZZTEST_PRECONDITION(v1 != T{})
+          << "BitFlagCombinationOf requires non zero flags.";
       for (int j = i + 1; j < flags.size(); ++j) {
         T v2 = flags[j];
-        FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-            BitAnd(v1, v2) == T{},
-            "BitFlagCombinationOf requires flags to be mutually exclusive.");
+        FUZZTEST_PRECONDITION(BitAnd(v1, v2) == T{})
+            << "BitFlagCombinationOf requires flags to be mutually exclusive.";
       }
       all_flags_combo_ = BitOr(all_flags_combo_, v1);
     }
diff --git a/fuzztest/internal/domains/bit_gen_ref.h b/fuzztest/internal/domains/bit_gen_ref.h
index 980985d..824d35e 100644
--- a/fuzztest/internal/domains/bit_gen_ref.h
+++ b/fuzztest/internal/domains/bit_gen_ref.h
@@ -20,11 +20,10 @@
 #include <utility>
 #include <vector>
 
-#include "absl/log/absl_check.h"
-#include "absl/log/absl_log.h"
 #include "absl/random/bit_gen_ref.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_format.h"
+#include "./common/logging.h"
 #include "./fuzztest/fuzzing_bit_gen.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/printer.h"
@@ -52,7 +51,7 @@
       : initializer_data_(o.initializer_data_), bitgen_(std::nullopt) {}
   BitGenCorpusValue& operator=(const BitGenCorpusValue& o) {
     // The internal URBG should be unused.
-    ABSL_CHECK(!bitgen_.has_value());
+    FUZZTEST_CHECK(!bitgen_.has_value());
     initializer_data_ = o.initializer_data_;
     return *this;
   }
@@ -61,8 +60,8 @@
         bitgen_(std::nullopt) {}
   BitGenCorpusValue& operator=(BitGenCorpusValue&& o) {
     // The internal URBG should be unused.
-    ABSL_CHECK(!o.bitgen_.has_value());
-    ABSL_CHECK(!bitgen_.has_value());
+    FUZZTEST_CHECK(!o.bitgen_.has_value());
+    FUZZTEST_CHECK(!bitgen_.has_value());
     initializer_data_ = std::move(o.initializer_data_);
     return *this;
   }
@@ -137,7 +136,7 @@
 
   value_type GetRandomValue(absl::BitGenRef prng) {
     // See b/404828355
-    ABSL_LOG(FATAL) << "The domain doesn't support GetRandomValue().";
+    FUZZTEST_LOG(FATAL) << "The domain doesn't support GetRandomValue().";
   }
 
   std::optional<corpus_type> FromValue(const value_type&) const {
diff --git a/fuzztest/internal/domains/container_of_impl.h b/fuzztest/internal/domains/container_of_impl.h
index 1db432c..d4202b8 100644
--- a/fuzztest/internal/domains/container_of_impl.h
+++ b/fuzztest/internal/domains/container_of_impl.h
@@ -31,6 +31,7 @@
 #include "absl/status/status.h"
 #include "absl/strings/str_format.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/container_mutation_helpers.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/logging.h"
@@ -113,9 +114,9 @@
               const domain_implementor::MutationMetadata& metadata,
               bool only_shrink) {
     permanent_dict_candidate_ = std::nullopt;
-    FUZZTEST_INTERNAL_CHECK(
-        min_size() <= val.size() && val.size() <= max_size(), "Size ",
-        val.size(), " is not between ", min_size(), " and ", max_size());
+    FUZZTEST_CHECK(min_size() <= val.size() && val.size() <= max_size())
+        << "Size " << val.size() << " is not between " << min_size() << " and "
+        << max_size();
 
     const bool can_shrink = val.size() > min_size();
     const bool can_grow = !only_shrink && val.size() < max_size();
@@ -220,16 +221,16 @@
     return Self();
   }
   Derived& WithMinSize(size_t s) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        !max_size_.has_value() || s <= *max_size_, "Minimal size ", s,
-        " cannot be larger than maximal size ", *max_size_);
+    FUZZTEST_PRECONDITION(!max_size_.has_value() || s <= *max_size_)
+        << "Minimal size " << s << " cannot be larger than maximal size "
+        << *max_size_;
     min_size_ = s;
     return Self();
   }
   Derived& WithMaxSize(size_t s) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        min_size_ <= s, "Maximal size ", s,
-        " cannot be smaller than minimal size ", min_size_);
+    FUZZTEST_PRECONDITION(min_size_ <= s)
+        << "Maximal size " << s << " cannot be smaller than minimal size "
+        << min_size_;
     max_size_ = s;
     return Self();
   }
@@ -238,9 +239,8 @@
                   "Manual Dictionary now only supports std::vector or "
                   "std::string or std::string_view.\n");
     for (const value_type& entry : manual_dict) {
-      FUZZTEST_INTERNAL_CHECK(
-          entry.size() <= max_size(),
-          "At least one dictionary entry is larger than max container size.");
+      FUZZTEST_CHECK(entry.size() <= max_size())
+          << "At least one dictionary entry is larger than max container size.";
       manual_dict_.AddEntry({std::nullopt, entry});
     }
     return Self();
diff --git a/fuzztest/internal/domains/domain_type_erasure.h b/fuzztest/internal/domains/domain_type_erasure.h
index 2dd3b08..442af9d 100644
--- a/fuzztest/internal/domains/domain_type_erasure.h
+++ b/fuzztest/internal/domains/domain_type_erasure.h
@@ -33,6 +33,7 @@
 #include "absl/random/bit_gen_ref.h"
 #include "absl/status/status.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/any.h"
 #include "./fuzztest/internal/domains/mutation_metadata.h"
 #include "./fuzztest/internal/logging.h"
@@ -228,9 +229,8 @@
       printer.PrintFormattedAggregateValue(val.GetAs<CorpusType>(), out, mode,
                                            prefix, suffix, element_formatter);
     } else {
-      FUZZTEST_INTERNAL_CHECK(false,
-                              "PrintFormattedAggregateValue() can only be "
-                              "called on AggregatePrinter!");
+      FUZZTEST_LOG(FATAL) << "PrintFormattedAggregateValue() can only be "
+                             "called on AggregatePrinter!";
     }
   }
 
diff --git a/fuzztest/internal/domains/element_of_impl.h b/fuzztest/internal/domains/element_of_impl.h
index 38fd281..0f3783f 100644
--- a/fuzztest/internal/domains/element_of_impl.h
+++ b/fuzztest/internal/domains/element_of_impl.h
@@ -24,6 +24,7 @@
 #include "absl/random/bit_gen_ref.h"
 #include "absl/random/distributions.h"
 #include "absl/time/time.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/logging.h"
 #include "./fuzztest/internal/serialization.h"
@@ -42,8 +43,8 @@
   using typename ElementOfImpl::DomainBase::value_type;
 
   explicit ElementOfImpl(std::vector<T> values) : values_(values) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        !values.empty(), "ElementOf requires a non empty list.");
+    FUZZTEST_PRECONDITION(!values.empty())
+        << "ElementOf requires a non empty list.";
   }
 
   corpus_type Init(absl::BitGenRef prng) {
diff --git a/fuzztest/internal/domains/filter_impl.h b/fuzztest/internal/domains/filter_impl.h
index a9b3130..f37b8f9 100644
--- a/fuzztest/internal/domains/filter_impl.h
+++ b/fuzztest/internal/domains/filter_impl.h
@@ -22,6 +22,7 @@
 #include "absl/random/bit_gen_ref.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_format.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/domain.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/logging.h"
@@ -95,10 +96,10 @@
     bool res = predicate_(GetValue(v));
     if (!res) {
       ++num_skips_;
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-          num_skips_ <= 100 || static_cast<double>(num_skips_) <=
-                                   .9 * static_cast<double>(num_values_),
-          absl::StrFormat(R"(
+      FUZZTEST_PRECONDITION(num_skips_ <= 100 ||
+                            static_cast<double>(num_skips_) <=
+                                .9 * static_cast<double>(num_values_))
+          << absl::StrFormat(R"(
 
 [!] Ineffective use of Filter() detected!
 
@@ -109,7 +110,7 @@
 chunk of the input domain, consider defining a custom domain by construction.
 See more details in the User Guide.
 )",
-                          num_skips_, num_values_));
+                             num_skips_, num_values_);
     }
     return res;
   }
diff --git a/fuzztest/internal/domains/in_grammar_impl.h b/fuzztest/internal/domains/in_grammar_impl.h
index ac34361..edcb72c 100644
--- a/fuzztest/internal/domains/in_grammar_impl.h
+++ b/fuzztest/internal/domains/in_grammar_impl.h
@@ -117,9 +117,8 @@
   static bool IsMutable(const ASTNode& /*val*/) { return false; }
 
   static IRObject SerializeCorpus(const ASTNode& astnode) {
-    FUZZTEST_INTERNAL_CHECK(
-        CheckASTNodeTypeIdAndChildType<std::monostate>(astnode, id),
-        "Invalid node!");
+    FUZZTEST_CHECK(CheckASTNodeTypeIdAndChildType<std::monostate>(astnode, id))
+        << "Invalid node!";
     return WrapASTIntoIRObject(astnode, {});
   }
 
@@ -166,9 +165,8 @@
   static ASTTypeId TypeId() { return id; }
 
   static void ToString(std::string& output, const ASTNode& val) {
-    FUZZTEST_INTERNAL_CHECK(
-        CheckASTNodeTypeIdAndChildType<RegexpDFA::Path>(val, id),
-        "Not a regex literal!");
+    FUZZTEST_CHECK(CheckASTNodeTypeIdAndChildType<RegexpDFA::Path>(val, id))
+        << "Not a regex literal!";
     absl::StrAppend(&output, GetInnerRegexpDomain().GetValue(
                                  std::get<RegexpDFA::Path>(val.children)));
   }
@@ -176,9 +174,8 @@
   static bool IsMutable(const ASTNode& /*val*/) { return true; }
 
   static IRObject SerializeCorpus(const ASTNode& astnode) {
-    FUZZTEST_INTERNAL_CHECK(
-        CheckASTNodeTypeIdAndChildType<RegexpDFA::Path>(astnode, id),
-        "Not a regex literal!");
+    FUZZTEST_CHECK(CheckASTNodeTypeIdAndChildType<RegexpDFA::Path>(astnode, id))
+        << "Not a regex literal!";
     return WrapASTIntoIRObject(
         astnode, GetInnerRegexpDomain().SerializeCorpus(
                      std::get<RegexpDFA::Path>(astnode.children)));
@@ -258,9 +255,9 @@
   static void Mutate(ASTNode& val, absl::BitGenRef prng,
                      const domain_implementor::MutationMetadata& metadata,
                      bool only_shrink) {
-    FUZZTEST_INTERNAL_CHECK(
-        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(val, id),
-        "Not a vector!");
+    FUZZTEST_CHECK(
+        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(val, id))
+        << "Not a vector!";
     std::vector<ASTNode>& elements =
         std::get<std::vector<ASTNode>>(val.children);
     if (only_shrink) {
@@ -272,7 +269,7 @@
         !elements.empty() && ElementT::IsMutable(elements.back());
     constexpr bool can_change_element_num = max > min;
     if (!can_mutate_element && !can_change_element_num) {
-      FUZZTEST_INTERNAL_CHECK(false, "We shouldn't pick an unmutable node.");
+      FUZZTEST_LOG(FATAL) << "We shouldn't pick an unmutable node.";
       return;
     }
     if (!can_mutate_element) {
@@ -301,9 +298,9 @@
   static bool IsMutable(const ASTNode& /*val*/) { return true; }
 
   static IRObject SerializeCorpus(const ASTNode& astnode) {
-    FUZZTEST_INTERNAL_CHECK(
-        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(astnode, id),
-        "Not a vector!");
+    FUZZTEST_CHECK(
+        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(astnode, id))
+        << "Not a vector!";
     IRObject expansion_obj;
     auto& inner_subs = expansion_obj.MutableSubs();
     for (auto& node : std::get<std::vector<ASTNode>>(astnode.children)) {
@@ -425,11 +422,11 @@
   static void Mutate(ASTNode& val, absl::BitGenRef prng,
                      const domain_implementor::MutationMetadata& metadata,
                      bool only_shrink) {
-    FUZZTEST_INTERNAL_CHECK(
+    FUZZTEST_CHECK(
         CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(val, id) &&
-            std::get<std::vector<ASTNode>>(val.children).size() ==
-                sizeof...(ElementT),
-        "Tuple elements number doesn't match!");
+        std::get<std::vector<ASTNode>>(val.children).size() ==
+            sizeof...(ElementT))
+        << "Tuple elements number doesn't match!";
 
     std::vector<int> mutables;
     ApplyIndex<sizeof...(ElementT)>([&](auto... I) {
@@ -439,9 +436,8 @@
        ...);
     });
 
-    FUZZTEST_INTERNAL_CHECK(
-        !mutables.empty(),
-        "If the tuple is immutable it shouldn't be picked for mutation.");
+    FUZZTEST_CHECK(!mutables.empty())
+        << "If the tuple is immutable it shouldn't be picked for mutation.";
 
     int choice = mutables[absl::Uniform<int>(prng, 0, mutables.size())];
     ApplyIndex<sizeof...(ElementT)>([&](auto... I) {
@@ -472,9 +468,9 @@
   }
 
   static IRObject SerializeCorpus(const ASTNode& astnode) {
-    FUZZTEST_INTERNAL_CHECK(
-        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(astnode, id),
-        "Invalid node!");
+    FUZZTEST_CHECK(
+        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(astnode, id))
+        << "Invalid node!";
     IRObject expansion_obj;
     auto& inner_subs = expansion_obj.MutableSubs();
     ApplyIndex<sizeof...(ElementT)>([&](auto... I) {
@@ -571,8 +567,8 @@
           : (void)0),
      ...);
 
-    FUZZTEST_INTERNAL_CHECK(is_current_value_mutable || has_alternative,
-                            "Impossible at" + std::to_string(id));
+    FUZZTEST_CHECK(is_current_value_mutable || has_alternative)
+        << "Impossible at" << id;
     if (only_shrink) {
       if (is_current_value_mutable) {
         MutateCurrentValue(val, prng, metadata, only_shrink);
@@ -594,9 +590,8 @@
   }
 
   static void ToString(std::string& output, const ASTNode& val) {
-    FUZZTEST_INTERNAL_CHECK(
-        std::get<std::vector<ASTNode>>(val.children).size() == 1,
-        "This is not a variant ast node.");
+    FUZZTEST_CHECK(std::get<std::vector<ASTNode>>(val.children).size() == 1)
+        << "This is not a variant ast node.";
     auto child = std::get<std::vector<ASTNode>>(val.children).front();
     ((ElementT::TypeId() == child.type_id ? (ElementT::ToString(output, child))
                                           : (void)0),
@@ -618,9 +613,9 @@
   }
 
   static IRObject SerializeCorpus(const ASTNode& astnode) {
-    FUZZTEST_INTERNAL_CHECK(
-        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(astnode, id),
-        "Invalid node!");
+    FUZZTEST_CHECK(
+        CheckASTNodeTypeIdAndChildType<std::vector<ASTNode>>(astnode, id))
+        << "Invalid node!";
 
     ASTTypeId child_id =
         std::get<std::vector<ASTNode>>(astnode.children).front().type_id;
@@ -690,7 +685,7 @@
   }
   static void SwitchToAlternative(ASTNode& val, absl::BitGenRef prng) {
     constexpr int n_alternative = sizeof...(ElementT);
-    FUZZTEST_INTERNAL_CHECK(n_alternative > 1, "No alternative to switch!");
+    FUZZTEST_CHECK(n_alternative > 1) << "No alternative to switch!";
     int child_type_id =
         std::get<std::vector<ASTNode>>(val.children).front().type_id;
     int current_choice = 0;
@@ -751,7 +746,7 @@
   }
 
   std::optional<corpus_type> FromValue(const value_type& /*v*/) const {
-    FUZZTEST_INTERNAL_CHECK(false, "Parsing is not implemented yet!");
+    FUZZTEST_CHECK(false) << "Parsing is not implemented yet!";
     return std::nullopt;
   }
 
@@ -790,8 +785,8 @@
     size_t src_index =
         absl::Uniform<size_t>(prng, dst_index + 1, candidates.size());
 
-    FUZZTEST_INTERNAL_CHECK(src_index < candidates.size(), "Out of bound!");
-    FUZZTEST_INTERNAL_CHECK(dst_index < candidates.size(), "Out of bound!");
+    FUZZTEST_CHECK(src_index < candidates.size()) << "Out of bound!";
+    FUZZTEST_CHECK(dst_index < candidates.size()) << "Out of bound!";
     if (candidates[dst_index]->NodeCount() <
         candidates[src_index]->NodeCount()) {
       std::swap(dst_index, src_index);
diff --git a/fuzztest/internal/domains/in_range_impl.h b/fuzztest/internal/domains/in_range_impl.h
index 8b6cff5..0d77a50 100644
--- a/fuzztest/internal/domains/in_range_impl.h
+++ b/fuzztest/internal/domains/in_range_impl.h
@@ -29,6 +29,7 @@
 #include "absl/status/status.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/domains/special_values.h"
 #include "./fuzztest/internal/domains/value_mutation_helpers.h"
@@ -53,15 +54,13 @@
                          IntegerDictionary<T>, bool>;
 
   explicit InRangeImpl(T min, T max) : min_(min), max_(max) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        min <= max, "min must be less than or equal to max!");
+    FUZZTEST_PRECONDITION(min <= max)
+        << "min must be less than or equal to max!";
     if constexpr (!T_is_integer) {
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-          !(min == std::numeric_limits<T>::lowest() &&
-            max == std::numeric_limits<T>::max()),
-          "Consider using the Finite<T>() domain instead.");
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(std::isfinite(max - min),
-                                           "Range is too large!");
+      FUZZTEST_PRECONDITION(!(min == std::numeric_limits<T>::lowest() &&
+                              max == std::numeric_limits<T>::max()))
+          << "Consider using the Finite<T>() domain instead.";
+      FUZZTEST_PRECONDITION(std::isfinite(max - min)) << "Range is too large!";
     }
     if constexpr (T_is_integer) {
       // Find the longest common prefix
diff --git a/fuzztest/internal/domains/in_regexp_impl.cc b/fuzztest/internal/domains/in_regexp_impl.cc
index 81d8141..ae97e62 100644
--- a/fuzztest/internal/domains/in_regexp_impl.cc
+++ b/fuzztest/internal/domains/in_regexp_impl.cc
@@ -28,6 +28,7 @@
 #include "absl/status/statusor.h"
 #include "absl/strings/str_cat.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/domains/regexp_dfa.h"
 #include "./fuzztest/internal/logging.h"
@@ -44,8 +45,7 @@
   if (auto seed = MaybeGetRandomSeed(prng)) return *seed;
   absl::StatusOr<RegexpDFA::Path> path =
       dfa_.StringToPath(dfa_.GenerateString(prng));
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(path.ok(),
-                                       "Init should generate valid paths");
+  FUZZTEST_PRECONDITION(path.ok()) << "Init should generate valid paths";
   return *path;
 }
 
@@ -102,7 +102,7 @@
 
 InRegexpImpl::value_type InRegexpImpl::GetValue(const corpus_type& v) const {
   absl::StatusOr<std::string> val = dfa_.PathToString(v);
-  FUZZTEST_INTERNAL_CHECK(val.ok(), "Corpus is invalid!");
+  FUZZTEST_CHECK(val.ok()) << "Corpus is invalid!";
   return *val;
 }
 
@@ -150,9 +150,9 @@
 
 void InRegexpImpl::ValidatePathRoundtrip(const RegexpDFA::Path& path) const {
   absl::StatusOr<std::string> str = dfa_.PathToString(path);
-  FUZZTEST_INTERNAL_CHECK(str.ok(), "Invalid path in the DFA!");
+  FUZZTEST_CHECK(str.ok()) << "Invalid path in the DFA!";
   absl::StatusOr<RegexpDFA::Path> new_path = dfa_.StringToPath(*str);
-  FUZZTEST_INTERNAL_CHECK(new_path.ok(), "Invalid path in the DFA!");
+  FUZZTEST_CHECK(new_path.ok()) << "Invalid path in the DFA!";
 }
 
 bool InRegexpImpl::ShrinkByRemoveLoop(absl::BitGenRef prng,
diff --git a/fuzztest/internal/domains/optional_of_impl.h b/fuzztest/internal/domains/optional_of_impl.h
index e80b93d..812a92e 100644
--- a/fuzztest/internal/domains/optional_of_impl.h
+++ b/fuzztest/internal/domains/optional_of_impl.h
@@ -27,6 +27,7 @@
 #include "absl/status/status.h"
 #include "absl/strings/str_format.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/domain.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/domains/serialization_helpers.h"
@@ -98,12 +99,12 @@
 
   value_type GetValue(const corpus_type& v) const {
     if (v.index() == 0) {
-      FUZZTEST_INTERNAL_CHECK(policy_ != OptionalPolicy::kWithoutNull,
-                              "Value cannot be null!");
+      FUZZTEST_CHECK(policy_ != OptionalPolicy::kWithoutNull)
+          << "Value cannot be null!";
       return value_type();
     }
-    FUZZTEST_INTERNAL_CHECK(policy_ != OptionalPolicy::kAlwaysNull,
-                            "Value cannot be non-null!");
+    FUZZTEST_CHECK(policy_ != OptionalPolicy::kAlwaysNull)
+        << "Value cannot be non-null!";
     return value_type(inner_.GetValue(std::get<1>(v)));
   }
 
diff --git a/fuzztest/internal/domains/overlap_of_impl.h b/fuzztest/internal/domains/overlap_of_impl.h
index 92ed0b9..1e074cf 100644
--- a/fuzztest/internal/domains/overlap_of_impl.h
+++ b/fuzztest/internal/domains/overlap_of_impl.h
@@ -25,6 +25,7 @@
 #include "absl/random/distributions.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_format.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/domains/serialization_helpers.h"
 #include "./fuzztest/internal/logging.h"
@@ -88,9 +89,9 @@
         Switch<kNumDomains>(mutation_index, [&](auto I) {
           auto& domain = std::get<I>(domains_);
           auto inner_corpus = domain.FromValue(*orig_value);
-          FUZZTEST_INTERNAL_CHECK(inner_corpus.has_value(),
-                                  "Mutate() called on a user value that is not "
-                                  "valid in all overlapping domains");
+          FUZZTEST_CHECK(inner_corpus.has_value())
+              << "Mutate() called on a user value that is not "
+                 "valid in all overlapping domains";
           domain.Mutate(*inner_corpus, prng, metadata, only_shrink);
           mutant_corpus =
               corpus_type(std::in_place_index<I>, *std::move(inner_corpus));
@@ -103,8 +104,8 @@
                         only_shrink);
         });
       }
-      FUZZTEST_INTERNAL_CHECK(mutant_corpus.has_value(),
-                              "mutant corpus value is missing");
+      FUZZTEST_CHECK(mutant_corpus.has_value())
+          << "mutant corpus value is missing";
       const bool valid =
           ValidateCorpusValueForOtherDomains(*mutant_corpus).ok();
       MaybeReportOnValidationResult(valid);
@@ -169,9 +170,9 @@
     return Switch<kNumDomains>(*serialization_domain_index_, [&](auto I) {
       auto& domain = std::get<I>(domains_);
       const auto inner_corpus = domain.FromValue(user_value);
-      FUZZTEST_INTERNAL_CHECK(inner_corpus.has_value(),
-                              "Mutate() called on a user value that is not "
-                              "valid in all overlapping domains");
+      FUZZTEST_CHECK(inner_corpus.has_value())
+          << "Mutate() called on a user value that is not "
+             "valid in all overlapping domains";
       return domain.SerializeCorpus(*inner_corpus);
     });
   }
@@ -199,10 +200,8 @@
   size_t num_validation_failures_ = 0;
 
   OverlapOfImpl& WithSerializationDomain(size_t index) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        index < kNumDomains,
-        absl::StrFormat("Serialization domain index must be less than %d",
-                        kNumDomains));
+    FUZZTEST_PRECONDITION(index < kNumDomains)
+        << "Serialization domain index must be less than " << kNumDomains;
     serialization_domain_index_ = index;
     return *this;
   }
@@ -235,18 +234,19 @@
     ++num_validation_attempts_;
     if (!succeeded) {
       ++num_validation_failures_;
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
+      FUZZTEST_PRECONDITION(
           num_validation_attempts_ <= 100 ||
-              static_cast<double>(num_validation_failures_) <=
-                  .9 * static_cast<double>(num_validation_attempts_),
-          absl::StrFormat(R"(
+          static_cast<double>(num_validation_failures_) <=
+              .9 * static_cast<double>(num_validation_attempts_))
+          << absl::StrFormat(R"(
 
 [!] Ineffective use of overlapping domains detected!
 
 Values were not valid on all of the overlapping domains on more than 90%% of the samples.
 %d out of %d have failed.
 )",
-                          num_validation_failures_, num_validation_attempts_));
+                             num_validation_failures_,
+                             num_validation_attempts_);
     }
   }
 };
diff --git a/fuzztest/internal/domains/protobuf_domain_impl.h b/fuzztest/internal/domains/protobuf_domain_impl.h
index 0a71274..be0e9b0 100644
--- a/fuzztest/internal/domains/protobuf_domain_impl.h
+++ b/fuzztest/internal/domains/protobuf_domain_impl.h
@@ -40,6 +40,7 @@
 #include "absl/strings/string_view.h"
 #include "absl/synchronization/mutex.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/domain_core.h"
 #include "./fuzztest/internal/any.h"
 #include "./fuzztest/internal/domains/arbitrary_impl.h"
@@ -284,39 +285,36 @@
   }
 
   OptionalPolicy GetOptionalPolicy(const FieldDescriptor* field) const {
-    FUZZTEST_INTERNAL_CHECK(
-        !field->is_required() && !field->is_repeated(),
-        "GetOptionalPolicy should apply to optional fields only!");
+    FUZZTEST_CHECK(!field->is_required() && !field->is_repeated())
+        << "GetOptionalPolicy should apply to optional fields only!";
     std::optional<OptionalPolicy> result =
         GetPolicyValue(optional_policies_, field);
-    FUZZTEST_INTERNAL_CHECK(result.has_value(), "optional policy is not set!");
+    FUZZTEST_CHECK(result.has_value()) << "optional policy is not set!";
     return *result;
   }
 
   std::optional<int64_t> GetMinRepeatedFieldSize(
       const FieldDescriptor* field) const {
-    FUZZTEST_INTERNAL_CHECK(
-        field->is_repeated(),
-        "GetMinRepeatedFieldSize should apply to repeated fields only!");
+    FUZZTEST_CHECK(field->is_repeated())
+        << "GetMinRepeatedFieldSize should apply to repeated fields only!";
     auto min = GetPolicyValue(min_repeated_fields_sizes_, field);
     auto max = GetPolicyValue(max_repeated_fields_sizes_, field);
     if (min.has_value() && max.has_value()) {
-      FUZZTEST_INTERNAL_CHECK(*min <= *max, "Repeated field ",
-                              field->full_name(), " size range is not valid!");
+      FUZZTEST_CHECK(*min <= *max) << "Repeated field " << field->full_name()
+                                   << " size range is not valid!";
     }
     return min;
   }
 
   std::optional<int64_t> GetMaxRepeatedFieldSize(
       const FieldDescriptor* field) const {
-    FUZZTEST_INTERNAL_CHECK(
-        field->is_repeated(),
-        "GetMaxRepeatedFieldSize should apply to repeated fields only!");
+    FUZZTEST_CHECK(field->is_repeated())
+        << "GetMaxRepeatedFieldSize should apply to repeated fields only!";
     auto min = GetPolicyValue(min_repeated_fields_sizes_, field);
     auto max = GetPolicyValue(max_repeated_fields_sizes_, field);
     if (min.has_value() && max.has_value()) {
-      FUZZTEST_INTERNAL_CHECK(*min <= *max, "Repeated field ",
-                              field->full_name(), " size range is not valid!");
+      FUZZTEST_CHECK(*min <= *max) << "Repeated field " << field->full_name()
+                                   << " size range is not valid!";
     }
     return max;
   }
@@ -344,13 +342,13 @@
         auto domain = filter_to_values[i].value;
         auto obj = domain.GetValue(domain.Init(gen));
         auto* descriptor = obj->GetDescriptor();
-        FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-            descriptor->full_name() == field->message_type()->full_name(),
-            "Input domain does not match the expected message type. The "
-            "domain produced a message of type `",
-            descriptor->full_name(),
-            "` but the field needs a message of type `",
-            field->message_type()->full_name(), "`.");
+        FUZZTEST_PRECONDITION(descriptor->full_name() ==
+                              field->message_type()->full_name())
+            << "Input domain does not match the expected message type. The "
+               "domain produced a message of type `"
+            << descriptor->full_name()
+            << "` but the field needs a message of type `"
+            << field->message_type()->full_name() << "`.";
       }
       return filter_to_values[i].value;
     }
@@ -414,8 +412,8 @@
       : prototype_factory_(std::move(prototype_factory)), prototype_(nullptr) {}
   PrototypePtr(const Prototype* prototype)
       : prototype_factory_(), prototype_(prototype) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(prototype != nullptr,
-                                         "Prototype should not be nullptr");
+    FUZZTEST_PRECONDITION(prototype != nullptr)
+        << "Prototype should not be nullptr";
   }
 
   PrototypePtr& operator=(const PrototypePtr<Prototype>& other) = default;
@@ -471,10 +469,10 @@
   corpus_type Init(absl::BitGenRef prng) {
     if (auto seed = this->MaybeGetRandomSeed(prng)) return *seed;
     const auto* descriptor = prototype_.Get()->GetDescriptor();
-    FUZZTEST_INTERNAL_CHECK(
-        !IsCustomizedRecursivelyOnly() || !IsInfinitelyRecursive(descriptor),
-        absl::StrCat("Cannot set recursive fields for ",
-                     descriptor->full_name(), " by default."));
+    FUZZTEST_CHECK(!IsCustomizedRecursivelyOnly() ||
+                   !IsInfinitelyRecursive(descriptor))
+        << "Cannot set recursive fields for " << descriptor->full_name()
+        << " by default.";
     corpus_type val;
     absl::flat_hash_map<int, int> oneof_to_field;
 
@@ -593,7 +591,7 @@
     for (auto& [number, inner] : v) {
       if (IsMetadataEntry(number)) continue;
       auto* field = GetField(number);
-      FUZZTEST_INTERNAL_CHECK(field, "Field not found by number: ", number);
+      FUZZTEST_CHECK(field) << "Field not found by number: " << number;
       IRObject& pair = subs.emplace_back();
       auto& pair_subs = pair.MutableSubs();
       pair_subs.reserve(2);
@@ -1061,9 +1059,9 @@
       auto& domain = self.GetSubDomain<T, false>(field);
       auto value = domain.GetValue(data);
       if (!value.has_value()) {
-        FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-            !field->is_required(), "required field '",
-            std::string(field->full_name()), "' cannot have null values.");
+        FUZZTEST_PRECONDITION(!field->is_required())
+            << "required field '" << std::string(field->full_name())
+            << "' cannot have null values.";
         message.GetReflection()->ClearField(&message, field);
         return;
       }
@@ -1269,10 +1267,9 @@
     template <typename T, typename DomainT, bool is_repeated>
     void ApplyDomain(const FieldDescriptor* field) {
       if constexpr (!std::is_constructible_v<DomainT, Inner>) {
-        FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-            (std::is_constructible_v<DomainT, Inner>),
-            "Input domain does not match field `", field->full_name(),
-            "` type.");
+        FUZZTEST_PRECONDITION((std::is_constructible_v<DomainT, Inner>))
+            << "Input domain does not match field `" << field->full_name()
+            << "` type.";
       } else {
         if constexpr (std::is_same_v<T, ProtoMessageTag>) {
           // Verify that the type matches.
@@ -1285,22 +1282,22 @@
             domain.Mutate(val, gen, {}, false);
             descriptor = GetDescriptor<is_repeated>(val);
           }
-          FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-              !descriptor ||
-                  descriptor->full_name() == field->message_type()->full_name(),
-              "Input domain does not match the expected message type. The "
-              "domain produced a message of type `",
-              descriptor->full_name(),
-              "` but the field needs a message of type `",
-              field->message_type()->full_name(), "`.");
+          FUZZTEST_PRECONDITION(!descriptor ||
+                                descriptor->full_name() ==
+                                    field->message_type()->full_name())
+              << "Input domain does not match the expected message type. The "
+                 "domain produced a message of type `"
+              << descriptor->full_name()
+              << "` but the field needs a message of type `"
+              << field->message_type()->full_name() << "`.";
         }
         absl::MutexLock l(&self.mutex_);
         auto res = self.domains_.try_emplace(field->number(),
                                              std::in_place_type<DomainT>,
                                              std::forward<Inner>(domain));
-        FUZZTEST_INTERNAL_CHECK_PRECONDITION(res.second, "Domain for field `",
-                                             field->full_name(),
-                                             "` has been set multiple times.");
+        FUZZTEST_PRECONDITION(res.second)
+            << "Domain for field `" << field->full_name()
+            << "` has been set multiple times.";
       }
     }
 
@@ -1337,9 +1334,8 @@
 
   auto GetField(absl::string_view field_name) const {
     auto* field = GetFieldWithoutCheck(field_name);
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(field != nullptr,
-                                         "Invalid field name '",
-                                         std::string(field_name), "'.");
+    FUZZTEST_PRECONDITION(field != nullptr)
+        << "Invalid field name '" << std::string(field_name) << "'.";
     return field;
   }
 
@@ -1395,11 +1391,10 @@
   void WithOneofField(absl::string_view field_name, OptionalPolicy policy) {
     const FieldDescriptor* field = GetField(field_name);
     if (!field->containing_oneof()) return;
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        policy != OptionalPolicy::kWithoutNull ||
-            field->containing_oneof()->field_count() <= 1,
-        "Cannot always set oneof field ", field_name,
-        " (try using WithOneofAlwaysSet).");
+    FUZZTEST_PRECONDITION(policy != OptionalPolicy::kWithoutNull ||
+                          field->containing_oneof()->field_count() <= 1)
+        << "Cannot always set oneof field " << field_name
+        << " (try using WithOneofAlwaysSet).";
     if (policy == OptionalPolicy::kAlwaysNull) {
       MarkOneofFieldAsUnset(field);
     }
@@ -1416,15 +1411,13 @@
   void SetOneofAlwaysSet(absl::string_view oneof_name) {
     const std::string name(oneof_name);
     auto* oneof = prototype_.Get()->GetDescriptor()->FindOneofByName(name);
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(oneof != nullptr,
-                                         "Invalid oneof name '", name, "'.");
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        !always_set_oneofs_.contains(oneof->index()), "oneof '", name,
-        "' is AlwaysSet before.");
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        !uncustomizable_oneofs_.contains(oneof->index()),
-        "WithOneofAlwaysSet(\"", name,
-        "\") should be called before customizing sub-fields.");
+    FUZZTEST_PRECONDITION(oneof != nullptr)
+        << "Invalid oneof name '" << name << "'.";
+    FUZZTEST_PRECONDITION(!always_set_oneofs_.contains(oneof->index()))
+        << "oneof '" << name << "' is AlwaysSet before.";
+    FUZZTEST_PRECONDITION(!uncustomizable_oneofs_.contains(oneof->index()))
+        << "WithOneofAlwaysSet(\"" << name
+        << "\") should be called before customizing sub-fields.";
     always_set_oneofs_.insert(oneof->index());
   }
 
@@ -1478,11 +1471,10 @@
 
     template <typename T>
     auto VisitSingular(const FieldDescriptor* field) {
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-          false,
-          "Customizing repeated field size is not applicable to non-repeated "
-          "field ",
-          field->full_name(), ".");
+      FUZZTEST_PRECONDITION(false) << "Customizing repeated field size is not "
+                                      "applicable to non-repeated "
+                                      "field "
+                                   << field->full_name() << ".";
     }
 
     template <typename T>
@@ -1550,10 +1542,9 @@
   }
 
   OptionalPolicy GetOneofFieldPolicy(const FieldDescriptor* field) const {
-    FUZZTEST_INTERNAL_CHECK(
-        field->containing_oneof(),
-        "GetOneofFieldPolicy should apply to oneof fields only! ",
-        field->full_name());
+    FUZZTEST_CHECK(field->containing_oneof())
+    "GetOneofFieldPolicy should apply to oneof fields only! "
+        << field->full_name();
     auto field_policy = policy_.GetOptionalPolicy(field);
     // Field being unset via a policy overwrites the oneof policy.
     if (field_policy == OptionalPolicy::kAlwaysNull) return field_policy;
@@ -1568,11 +1559,11 @@
   }
 
   void CheckIfPolicyCanBeUpdated() const {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        customized_fields_.empty(),
-        "All singular modifiers (i.e., .With_Field_()) should come after "
-        "plural modifiers (i.e., .With_Fields_()). Consider reordering .With_ "
-        "modifiers.");
+    FUZZTEST_PRECONDITION(customized_fields_.empty())
+        << "All singular modifiers (i.e., .With_Field_()) should come after "
+           "plural modifiers (i.e., .With_Fields_()). Consider reordering "
+           ".With_ "
+           "modifiers.";
   }
   // Get the existing domain for `field`, if exists.
   // Otherwise, create the appropriate `Arbitrary<>` domain for the field and
@@ -1730,7 +1721,7 @@
   // Returns true if there are subprotos in the `descriptor` that form an
   // infinite recursion.
   bool IsInfinitelyRecursive(const Descriptor* descriptor) const {
-    FUZZTEST_INTERNAL_CHECK(IsCustomizedRecursivelyOnly(), "Internal error.");
+    FUZZTEST_CHECK(IsCustomizedRecursivelyOnly()) << "Internal error.";
     absl::flat_hash_set<const FieldDescriptor*> parents;
     return IsProtoRecursive(/*field=*/nullptr, parents,
                             RecursionType::kInfinitelyRecursive, descriptor);
@@ -1741,14 +1732,14 @@
   // because all Fi-s have to be set (e.g., Fi is a required field, or is
   // customized using `WithFieldsAlwaysSet`).
   bool IsInfinitelyRecursive(const FieldDescriptor* field) const {
-    FUZZTEST_INTERNAL_CHECK(IsCustomizedRecursivelyOnly(), "Internal error.");
+    FUZZTEST_CHECK(IsCustomizedRecursivelyOnly()) << "Internal error.";
     absl::flat_hash_set<const FieldDescriptor*> parents;
     return IsProtoRecursive(field, parents,
                             RecursionType::kInfinitelyRecursive);
   }
 
   bool IsFieldFinitelyRecursive(const FieldDescriptor* field) {
-    FUZZTEST_INTERNAL_CHECK(IsCustomizedRecursivelyOnly(), "Internal error.");
+    FUZZTEST_CHECK(IsCustomizedRecursivelyOnly()) << "Internal error.";
     if (!field->message_type()) return false;
     ABSL_CONST_INIT static absl::Mutex mutex(absl::kConstInit);
     static absl::NoDestructor<
@@ -1801,7 +1792,7 @@
   }
 
   bool MustBeSet(const FieldDescriptor* field) const {
-    FUZZTEST_INTERNAL_CHECK(IsCustomizedRecursivelyOnly(), "Internal error.");
+    FUZZTEST_CHECK(IsCustomizedRecursivelyOnly()) << "Internal error.";
     if (IsRequired(field)) {
       return true;
     } else if (field->containing_oneof()) {
@@ -1812,13 +1803,12 @@
       return policy_.GetMinRepeatedFieldSize(field).has_value() &&
              *policy_.GetMinRepeatedFieldSize(field) > 0;
     }
-    FUZZTEST_INTERNAL_CHECK(false,
-                            "Field is not optional, repeated, or required");
+    FUZZTEST_CHECK(false) << "Field is not optional, repeated, or required";
     return false;
   }
 
   bool MustBeUnset(const FieldDescriptor* field) const {
-    FUZZTEST_INTERNAL_CHECK(IsCustomizedRecursivelyOnly(), "Internal error.");
+    FUZZTEST_CHECK(IsCustomizedRecursivelyOnly()) << "Internal error.";
     if (field->message_type() && IsInfinitelyRecursive(field)) {
       absl::FPrintF(
           GetStderr(),
@@ -1836,8 +1826,7 @@
       return policy_.GetMaxRepeatedFieldSize(field).has_value() &&
              *policy_.GetMaxRepeatedFieldSize(field) == 0;
     }
-    FUZZTEST_INTERNAL_CHECK(false,
-                            "Field is not optional, repeated, or required");
+    FUZZTEST_CHECK(false) << "Field is not optional, repeated, or required";
     return false;
   }
 
@@ -1851,8 +1840,8 @@
       parents.insert(field);
       descriptor = field->message_type();
     } else {
-      FUZZTEST_INTERNAL_CHECK(descriptor,
-                              "one of field or descriptor must be non-null!");
+      FUZZTEST_CHECK(descriptor)
+          << "one of field or descriptor must be non-null!";
     }
     for (int i = 0; i < descriptor->oneof_decl_count(); ++i) {
       const auto* oneof = descriptor->oneof_decl(i);
@@ -2314,10 +2303,10 @@
  private:
   void FailIfIsOneof(absl::string_view field) {
     const FieldDescriptor* descriptor = inner_.GetField(field);
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        !descriptor->containing_oneof(), "Cannot customize oneof field ", field,
-        " with WithOptional<Type>Field (try using "
-        "WithOneofAlwaysSet or WithOptional<Type>Unset).");
+    FUZZTEST_PRECONDITION(!descriptor->containing_oneof())
+        << "Cannot customize oneof field " << field
+        << " with WithOptional<Type>Field (try using "
+           "WithOneofAlwaysSet or WithOptional<Type>Unset).";
   }
 
   template <typename Inner>
diff --git a/fuzztest/internal/domains/regexp_dfa.cc b/fuzztest/internal/domains/regexp_dfa.cc
index ff6fa70..acca7e1 100644
--- a/fuzztest/internal/domains/regexp_dfa.cc
+++ b/fuzztest/internal/domains/regexp_dfa.cc
@@ -33,6 +33,7 @@
 #include "absl/status/statusor.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/logging.h"
 #include "re2/prog.h"
 #include "re2/regexp.h"
@@ -57,9 +58,8 @@
     result.insert(result.end(), fragment.begin(), fragment.end());
     state = &states_[next_id];
     if (state->is_end_state()) {
-      FUZZTEST_INTERNAL_CHECK(
-          fragment.back() == kEndOfString,
-          "The last character leading to the end state should be EOS!");
+      FUZZTEST_CHECK(fragment.back() == kEndOfString)
+          << "The last character leading to the end state should be EOS!";
       result.pop_back();
       break;
     }
@@ -73,8 +73,8 @@
   Path path;
   int cur_state_id = from_state_id;
   State* cur_state = &states_[cur_state_id];
-  FUZZTEST_INTERNAL_CHECK(!cur_state->is_end_state(),
-                          "Cannot start a DFA path from an end state!");
+  FUZZTEST_CHECK(!cur_state->is_end_state())
+      << "Cannot start a DFA path from an end state!";
   while (true) {
     // Pick a random next state.
     int offset = cur_state->edge_weight_distribution(prng);
@@ -146,7 +146,7 @@
       candidate_lens.push_back(len);
     }
   }
-  FUZZTEST_INTERNAL_CHECK(!candidate_lens.empty(), "Cannot find a path!");
+  FUZZTEST_CHECK(!candidate_lens.empty()) << "Cannot find a path!";
 
   int state_id = to_state_id;
   Path result;
@@ -156,8 +156,8 @@
     result.push_back(*(last_edges_and_counters[state_id][len].edge));
     state_id = result.back().from_state_id;
   }
-  FUZZTEST_INTERNAL_CHECK(state_id == from_state_id,
-                          "Cannot find a path from from_state");
+  FUZZTEST_CHECK(state_id == from_state_id)
+      << "Cannot find a path from from_state";
   std::reverse(result.begin(), result.end());
   return result;
 }
@@ -209,9 +209,8 @@
     const std::vector<std::int16_t>& fragment = transition.chars_to_match;
     result.insert(result.end(), fragment.begin(), fragment.end());
     if (next_state_id == end_state_id_) {
-      FUZZTEST_INTERNAL_CHECK(
-          fragment.back() == kEndOfString,
-          "The last character leading to the end state should be EOS!");
+      FUZZTEST_CHECK(fragment.back() == kEndOfString)
+          << "The last character leading to the end state should be EOS!";
       result.pop_back();
     }
   }
@@ -230,7 +229,7 @@
                   const std::vector<std::int16_t>& chars) {
         const size_t compare_size = std::min(transition.chars_to_match.size(),
                                              chars.size() - cur_index);
-        FUZZTEST_INTERNAL_CHECK(compare_size != 0, "Nothing to compare!");
+        FUZZTEST_CHECK(compare_size != 0) << "Nothing to compare!";
         for (size_t i = 0; i < compare_size; ++i) {
           if (transition.chars_to_match[i] == chars[cur_index + i]) continue;
           return transition.chars_to_match[i] < chars[cur_index + i];
@@ -262,10 +261,9 @@
       re2::Regexp::Parse(full_text_regexp, re2::Regexp::LikePerl, nullptr);
 
   // Is the regexp valid?
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(re != nullptr,
-                                       "Invalid RE2 regular expression.");
+  FUZZTEST_PRECONDITION(re != nullptr) << "Invalid RE2 regular expression.";
   re2::Prog* prog = re->CompileToProg(0);
-  FUZZTEST_INTERNAL_CHECK(prog != nullptr, "RE2 compilation failed!");
+  FUZZTEST_CHECK(prog != nullptr) << "RE2 compilation failed!";
   re->Decref();
   return std::unique_ptr<re2::Prog>(prog);
 }
@@ -279,14 +277,13 @@
   // Full match has no effect on re2::Prog::BuildEntireDFA.
   int state_n = compiled_regexp->BuildEntireDFA(
       re2::Prog::kFirstMatch, [&](const int* next, bool match) {
-        FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-            next != nullptr,
-            "The memory budget for building the state machine (DFA) for the "
-            "given regular expression has been exhausted. "
-            "You might try to reduce the number of states by using more "
-            "specific character classes (e.g., [[:alpha:]] instead of `.`, "
-            "i.e., any character) in your regular expression, or wait until "
-            "the issue is fixed.");
+        FUZZTEST_PRECONDITION(next != nullptr)
+            << "The memory budget for building the state machine (DFA) for the "
+               "given regular expression has been exhausted. "
+               "You might try to reduce the number of states by using more "
+               "specific character classes (e.g., [[:alpha:]] instead of `.`, "
+               "i.e., any character) in your regular expression, or wait until "
+               "the issue is fixed.";
 
         transition_table.emplace_back(
             next, next + compiled_regexp->bytemap_range() + 1);
@@ -328,8 +325,8 @@
           return a.chars_to_match.front() < b.chars_to_match.front();
         });
     if (end_vec[i]) end_state_id_ = i;
-    FUZZTEST_INTERNAL_CHECK((!end_vec[i] || state.next.empty()),
-                            "An end state must have no outgoing edges!");
+    FUZZTEST_CHECK((!end_vec[i] || state.next.empty()))
+        << "An end state must have no outgoing edges!";
   }
 }
 
@@ -365,9 +362,8 @@
         edge_to_unsafe_nodes.push_back(j);
       }
     }
-    FUZZTEST_INTERNAL_CHECK(
-        state_id == end_state_id_ || !edge_to_safe_nodes.empty(),
-        "A non-end node must have at least one safe edge");
+    FUZZTEST_CHECK(state_id == end_state_id_ || !edge_to_safe_nodes.empty())
+        << "A non-end node must have at least one safe edge";
     double probability_to_safe_node =
         edge_to_unsafe_nodes.empty() ? 1 : kProbToSafeNode;
 
@@ -402,9 +398,8 @@
     State& state = states_[i];
     if (state.next.size() != 1) continue;
     const auto& [chars_to_match, next_state_id] = state.next[0];
-    FUZZTEST_INTERNAL_CHECK(
-        next_state_id != i,
-        "A self-loop state should have at least two outgoing edges.");
+    FUZZTEST_CHECK(next_state_id != i)
+        << "A self-loop state should have at least two outgoing edges.";
     for (size_t j = 0; j < states_.size(); ++j) {
       for (auto& [next_chars_to_match, state_id] : states_[j].next) {
         if (state_id == i) {
diff --git a/fuzztest/internal/fixture_driver.h b/fuzztest/internal/fixture_driver.h
index 43286e3..e489e9f 100644
--- a/fuzztest/internal/fixture_driver.h
+++ b/fuzztest/internal/fixture_driver.h
@@ -260,10 +260,9 @@
         target_function_(target_function) {}
 
   void Test(MoveOnlyAny&& args_untyped) const override {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        fixture_ != nullptr,
-        "fixture is nullptr. Did you forget to instantiate it in one of the "
-        "SetUp methods?");
+    FUZZTEST_PRECONDITION(fixture_ != nullptr)
+        << "fixture is nullptr. Did you forget to instantiate it in one of the "
+           "SetUp methods?";
     std::apply(
         [&](auto&&... args) {
           (fixture_.get()->*target_function_)(
@@ -277,10 +276,10 @@
     if constexpr (std::is_invocable_v<SeedProvider, Fixture*>) {
       static_assert(std::is_same_v<std::invoke_result_t<SeedProvider, Fixture*>,
                                    std::vector<value_type_t<DomainT>>>);
-      FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-          fixture_ != nullptr,
-          "fixture is nullptr. Did you forget to instantiate it in one of the "
-          "SetUp methods?");
+      FUZZTEST_PRECONDITION(fixture_ != nullptr)
+          << "fixture is nullptr. Did you forget to instantiate it in one of "
+             "the "
+             "SetUp methods?";
       return this->GetSeedsFromUserValues(
           std::invoke(this->seed_provider(), fixture_.get()));
     } else if constexpr (std::is_invocable_v<SeedProvider>) {
diff --git a/fuzztest/internal/fixture_driver_test.cc b/fuzztest/internal/fixture_driver_test.cc
index b296e65..7995061 100644
--- a/fuzztest/internal/fixture_driver_test.cc
+++ b/fuzztest/internal/fixture_driver_test.cc
@@ -22,6 +22,7 @@
 #include "gtest/gtest.h"
 #include "absl/functional/any_invocable.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/domain_core.h"
 #include "./fuzztest/internal/any.h"
 #include "./fuzztest/internal/logging.h"
@@ -273,8 +274,7 @@
   std::vector<T> values;
   values.reserve(generic_values.size());
   for (const auto& generic_value : generic_values) {
-    FUZZTEST_INTERNAL_CHECK(generic_value.Has<T>(),
-                            "Generic value of a wrong type.");
+    FUZZTEST_CHECK(generic_value.Has<T>()) << "Generic value of a wrong type.";
     values.push_back(generic_value.GetAs<T>());
   }
   return values;
diff --git a/fuzztest/internal/io.cc b/fuzztest/internal/io.cc
index 760c830..70ba1c7 100644
--- a/fuzztest/internal/io.cc
+++ b/fuzztest/internal/io.cc
@@ -37,6 +37,7 @@
 #include "absl/types/span.h"
 #include "./common/blob_file.h"
 #include "./common/defs.h"
+#include "./common/logging.h"
 #include "./common/remote_file.h"
 #include "./fuzztest/internal/logging.h"
 
@@ -47,27 +48,27 @@
 // TODO(lszekeres): Return absl::Status instead of bool for these.
 
 bool WriteFile(absl::string_view path, absl::string_view contents) {
-  FUZZTEST_INTERNAL_CHECK(false, "Filesystem API not supported in iOS/MacOS");
+  FUZZTEST_LOG(FATAL)( << "Filesystem API not supported in iOS/MacOS";
 }
 
 std::optional<std::string> ReadFile(absl::string_view path) {
-  FUZZTEST_INTERNAL_CHECK(false, "Filesystem API not supported in iOS/MacOS");
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 bool IsDirectory(absl::string_view path) {
-  FUZZTEST_INTERNAL_CHECK(false, "Filesystem API not supported in iOS/MacOS");
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 bool CreateDirectory(absl::string_view path) {
-  FUZZTEST_INTERNAL_CHECK(false, "Filesystem API not supported in iOS/MacOS");
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 std::vector<std::string> ListDirectory(absl::string_view path) {
-  FUZZTEST_INTERNAL_CHECK(false, "Filesystem API not supported in iOS/MacOS");
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 std::vector<std::string> ListDirectoryRecursively(absl::string_view path) {
-  FUZZTEST_INTERNAL_CHECK(false, "Filesystem API not supported in iOS/MacOS");
+  FUZZTEST_LOG(FATAL) << "Filesystem API not supported in iOS/MacOS";
 }
 
 #else
@@ -214,12 +215,10 @@
   int total_invalid_inputs = 0;
   const absl::Time start_time = absl::Now();
   for (const std::string& file_path : file_paths) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        fuzztest::internal::RemotePathExists(file_path), "File path ",
-        file_path, " does not exist.");
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        !fuzztest::internal::RemotePathIsDirectory(file_path), "File path ",
-        file_path, " is a directory.");
+    FUZZTEST_PRECONDITION(fuzztest::internal::RemotePathExists(file_path))
+        << "File path " << file_path << " does not exist.";
+    FUZZTEST_PRECONDITION(!fuzztest::internal::RemotePathIsDirectory(file_path))
+        << "File path " << file_path << " is a directory.";
     int loaded_inputs_from_file = 0;
     int invalid_inputs_from_file = 0;
     // The reader cannot be reused for multiple files because of the way it
@@ -273,9 +272,9 @@
     std::string contents;
     const absl::Status get_contents_status =
         fuzztest::internal::RemoteFileGetContents(file_path, contents);
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        get_contents_status.ok(), "RemoteFileGetContents failed on ", file_path,
-        ", status: ", get_contents_status.message());
+    FUZZTEST_PRECONDITION(get_contents_status.ok())
+        << "RemoteFileGetContents failed on " << file_path
+        << ", status: " << get_contents_status.message();
     absl::Status result = consume(file_path, std::nullopt, std::move(contents));
     if (result.ok()) {
       ++total_loaded_inputs;
diff --git a/fuzztest/internal/io_test.cc b/fuzztest/internal/io_test.cc
index be07851..5eb7c17 100644
--- a/fuzztest/internal/io_test.cc
+++ b/fuzztest/internal/io_test.cc
@@ -31,7 +31,6 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/log/check.h"
 #include "absl/status/status.h"
 #include "absl/strings/str_cat.h"
 #include "absl/time/clock.h"
@@ -200,14 +199,14 @@
   TestWrite(serialized_file, "Input1");
   std::unique_ptr<fuzztest::internal::BlobFileWriter> writer =
       fuzztest::internal::DefaultBlobFileWriterFactory();
-  CHECK(writer->Open(blob_file, "w").ok());
-  CHECK(
+  FUZZTEST_CHECK(writer->Open(blob_file, "w").ok());
+  FUZZTEST_CHECK(
       writer->Write(fuzztest::internal::AsByteSpan(absl::string_view("Input2")))
           .ok());
-  CHECK(
+  FUZZTEST_CHECK(
       writer->Write(fuzztest::internal::AsByteSpan(absl::string_view("Input3")))
           .ok());
-  CHECK(writer->Close().ok());
+  FUZZTEST_CHECK(writer->Close().ok());
 
   using InputInFile = std::tuple<std::string, std::optional<int>, std::string>;
   std::vector<InputInFile> inputs;
@@ -229,14 +228,14 @@
   const std::string file = tmp_dir.path() / "file";
   std::unique_ptr<fuzztest::internal::BlobFileWriter> writer =
       fuzztest::internal::DefaultBlobFileWriterFactory();
-  CHECK(writer->Open(file, "w").ok());
-  CHECK(
+  FUZZTEST_CHECK(writer->Open(file, "w").ok());
+  FUZZTEST_CHECK(
       writer->Write(fuzztest::internal::AsByteSpan(absl::string_view("Ignore")))
           .ok());
-  CHECK(
+  FUZZTEST_CHECK(
       writer->Write(fuzztest::internal::AsByteSpan(absl::string_view("Accept")))
           .ok());
-  CHECK(writer->Close().ok());
+  FUZZTEST_CHECK(writer->Close().ok());
 
   using InputInFile = std::tuple<std::string, std::optional<int>, std::string>;
   std::vector<InputInFile> inputs;
diff --git a/fuzztest/internal/logging.cc b/fuzztest/internal/logging.cc
index 4521afe..1418360 100644
--- a/fuzztest/internal/logging.cc
+++ b/fuzztest/internal/logging.cc
@@ -21,6 +21,7 @@
 #include "absl/base/const_init.h"
 #include "absl/base/thread_annotations.h"
 #include "absl/synchronization/mutex.h"
+#include "./common/logging.h"
 
 #if defined(__linux__)
 #include <unistd.h>
@@ -47,10 +48,10 @@
 
 void Silence(int fd) {
   FILE* tmp = fopen("/dev/null", "w");
-  FUZZTEST_INTERNAL_CHECK(tmp, "fopen() error:", strerror(errno));
-  FUZZTEST_INTERNAL_CHECK(dup2(fileno(tmp), fd) != -1,
-                          "dup2() error:", strerror(errno));
-  FUZZTEST_INTERNAL_CHECK(fclose(tmp) == 0, "fclose() error:", strerror(errno));
+  FUZZTEST_CHECK(tmp) << "fopen() error: " << strerror(errno);
+  FUZZTEST_CHECK(dup2(fileno(tmp), fd) != -1) << "dup2() error: ",
+      strerror(errno);
+  FUZZTEST_CHECK(fclose(tmp) == 0) << "fclose() error: " << strerror(errno);
 }
 
 // Only accepts 1 or 2 (stdout or stderr).
@@ -59,12 +60,12 @@
 // If it's a stderr, silence it after duping it as the global stderr, which
 // will be used internally to log and be used when restoring the stderr.
 void DupAndSilence(int fd) {
-  FUZZTEST_INTERNAL_CHECK(fd == STDOUT_FILENO || fd == STDERR_FILENO,
-                          "DupAndSilence only accepts stderr or stdout.");
+  FUZZTEST_CHECK(fd == STDOUT_FILENO || fd == STDERR_FILENO)
+      << "DupAndSilence only accepts stderr or stdout.";
   int new_fd = dup(fd);
-  FUZZTEST_INTERNAL_CHECK(new_fd != -1, "dup() error:", strerror(errno));
+  FUZZTEST_CHECK(new_fd != -1) << "dup() error:" << strerror(errno);
   FILE* new_output_file = fdopen(new_fd, "w");
-  FUZZTEST_INTERNAL_CHECK(new_output_file, "fdopen error:", strerror(errno));
+  FUZZTEST_CHECK(new_output_file) << "fdopen error:" << strerror(errno);
   if (new_output_file) {
     if (fd == STDOUT_FILENO) {
       stdout_file_ = new_output_file;
@@ -90,21 +91,21 @@
   FILE* silenced_stderr = stderr_file_;
   stderr_file_ = stderr;
   stderr_file_guard_.Unlock();
-  FUZZTEST_INTERNAL_CHECK(silenced_stderr != stderr,
-                          "Error, calling RestoreStderr without calling"
-                          "DupandSilenceStderr first.");
-  FUZZTEST_INTERNAL_CHECK(dup2(fileno(silenced_stderr), STDERR_FILENO) != -1,
-                          "dup2 error:", strerror(errno));
-  FUZZTEST_INTERNAL_CHECK(fclose(silenced_stderr) == 0,
-                          "close() error:", strerror(errno));
+  FUZZTEST_CHECK(silenced_stderr != stderr)
+      << "Error, calling RestoreStderr without calling"
+         "DupandSilenceStderr first.";
+  FUZZTEST_CHECK(dup2(fileno(silenced_stderr), STDERR_FILENO) != -1)
+      << "dup2 error:" << strerror(errno);
+  FUZZTEST_CHECK(fclose(silenced_stderr) == 0)
+      << "close() error:" << strerror(errno);
 
-  FUZZTEST_INTERNAL_CHECK(stdout_file_ != stdout,
-                          "Error, calling RestoreStdout without calling"
-                          "DupandSilenceStdout first.");
-  FUZZTEST_INTERNAL_CHECK(dup2(fileno(stdout_file_), STDOUT_FILENO) != -1,
-                          "dup2() error:", strerror(errno));
-  FUZZTEST_INTERNAL_CHECK(fclose(stdout_file_) == 0,
-                          "close() error:", strerror(errno));
+  FUZZTEST_CHECK(stdout_file_ != stdout)
+      << "Error, calling RestoreStdout without calling"
+         "DupandSilenceStdout first.";
+  FUZZTEST_CHECK(dup2(fileno(stdout_file_), STDOUT_FILENO) != -1)
+      << "dup2() error:" << strerror(errno);
+  FUZZTEST_CHECK(fclose(stdout_file_) == 0)
+      << "close() error:" << strerror(errno);
   stdout_file_ = stdout;
 }
 
@@ -130,11 +131,6 @@
   return stderr_file_;
 }
 
-void Abort(const char* file, int line, const std::string& message) {
-  fprintf(GetStderr(), "%s:%d: %s\n", file, line, message.c_str());
-  std::abort();
-}
-
 const std::string* volatile test_abort_message = nullptr;
 void AbortInTest(const std::string& message) {
   // When we are within a test, we set the message here and call abort().
diff --git a/fuzztest/internal/logging.h b/fuzztest/internal/logging.h
index b7b8d4a..94c9b53 100644
--- a/fuzztest/internal/logging.h
+++ b/fuzztest/internal/logging.h
@@ -20,6 +20,7 @@
 
 #include "absl/strings/str_cat.h"
 
+// TODO(b/422182911): Remove this library.
 namespace fuzztest::internal {
 
 // Returns the current FILE pointing to the original stderr.
@@ -36,21 +37,6 @@
 // Check if FUZZTEST_SILENCE_TARGET env set.
 bool IsSilenceTargetEnabled();
 
-[[noreturn]] void Abort(const char* file, int line, const std::string& message);
-
-#define FUZZTEST_INTERNAL_CHECK_PRECONDITION(P, ...) \
-  ((P) ? (void)0                                     \
-       : ::fuzztest::internal::Abort(                \
-             __FILE__, __LINE__,                     \
-             absl::StrCat("Failed precondition (", #P, "): ", __VA_ARGS__)))
-
-#define FUZZTEST_INTERNAL_CHECK(cond, ...)                     \
-  ((cond) ? (void)0                                            \
-          : ::fuzztest::internal::Abort(                       \
-                __FILE__, __LINE__,                            \
-                absl::StrCat("Internal error! Check (", #cond, \
-                             ") failed: ", __VA_ARGS__)))
-
 // This Abort function will inject `message` into the signal handler's output
 // along with the file, line and test name of the currently running test.
 // Meant for failures related to test setup and not the code under test itself.
diff --git a/fuzztest/internal/register_fuzzing_mocks.cc b/fuzztest/internal/register_fuzzing_mocks.cc
index 1a51cea..6bb05df 100644
--- a/fuzztest/internal/register_fuzzing_mocks.cc
+++ b/fuzztest/internal/register_fuzzing_mocks.cc
@@ -26,7 +26,6 @@
 
 #include "absl/base/fast_type_id.h"
 #include "absl/functional/function_ref.h"
-#include "absl/log/absl_check.h"
 #include "absl/random/bernoulli_distribution.h"
 #include "absl/random/beta_distribution.h"
 #include "absl/random/distributions.h"
@@ -36,6 +35,7 @@
 #include "absl/random/poisson_distribution.h"
 #include "absl/random/zipf_distribution.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 
 namespace fuzztest::internal {
 namespace {
@@ -103,7 +103,7 @@
   // Returns a value in the closed-closed range [min, max].
   template <typename T>
   T ConsumeValueInRange(T min, T max) {
-    ABSL_CHECK_LE(min, max);
+    FUZZTEST_CHECK_LE(min, max);
 
     if (min == max) return min;
 
diff --git a/fuzztest/internal/runtime.cc b/fuzztest/internal/runtime.cc
index 6bb21fe..9db208f 100644
--- a/fuzztest/internal/runtime.cc
+++ b/fuzztest/internal/runtime.cc
@@ -40,7 +40,6 @@
 
 #include "absl/functional/bind_front.h"
 #include "absl/functional/function_ref.h"
-#include "absl/log/absl_check.h"
 #include "absl/random/bit_gen_ref.h"
 #include "absl/random/discrete_distribution.h"
 #include "absl/random/random.h"
@@ -58,6 +57,7 @@
 #include "absl/time/time.h"
 #include "absl/types/span.h"
 #include "./common/bazel.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/configuration.h"
 #include "./fuzztest/internal/corpus_database.h"
 #include "./fuzztest/internal/coverage.h"
@@ -107,7 +107,7 @@
                                    absl::string_view test_name) {
   const bool is_reproducer_in_corpus_db =
       configuration && configuration->crashing_input_to_reproduce;
-  ABSL_CHECK(!reproducer_path.empty() || is_reproducer_in_corpus_db);
+  FUZZTEST_CHECK(!reproducer_path.empty() || is_reproducer_in_corpus_db);
   if (!configuration || !configuration->reproduction_command_template) {
     absl::string_view reproducer =
         is_reproducer_in_corpus_db ? *configuration->crashing_input_to_reproduce
@@ -121,8 +121,8 @@
   }
   const std::string command_template =
       *configuration->reproduction_command_template;
-  ABSL_CHECK(absl::StrContains(command_template, kTestFilterPlaceholder));
-  ABSL_CHECK(absl::StrContains(command_template, kExtraArgsPlaceholder));
+  FUZZTEST_CHECK(absl::StrContains(command_template, kTestFilterPlaceholder));
+  FUZZTEST_CHECK(absl::StrContains(command_template, kExtraArgsPlaceholder));
   if (is_reproducer_in_corpus_db) {
     const std::string corpus_db = configuration->corpus_database;
     std::vector<std::string> extra_args = {absl::StrCat(
@@ -218,9 +218,8 @@
                                        Basename(reproducer_path));
         break;
       default:
-        FUZZTEST_INTERNAL_CHECK(false,
-                                "unsupported reproducer output location type "
-                                "to print reproduction command for");
+        FUZZTEST_CHECK(false) << "unsupported reproducer output location type "
+                                 "to print reproduction command for";
     }
   }
   absl::Format(
@@ -258,9 +257,9 @@
                   "- not writing the reproducer file.\n");
     return "";
   }
-  FUZZTEST_INTERNAL_CHECK(!out_location.dir_path.empty(),
-                          "Reproducer output directory must not be empty if "
-                          "not reporting to controller.");
+  FUZZTEST_CHECK(!out_location.dir_path.empty())
+      << "Reproducer output directory must not be empty if "
+         "not reporting to controller.";
   const std::string content =
       current_args_->domain.SerializeCorpus(current_args_->corpus_value)
           .ToString();
@@ -474,7 +473,7 @@
 
 void Runtime::SetCurrentTest(const FuzzTest* test,
                              const Configuration* configuration) {
-  ABSL_CHECK((test != nullptr) == (configuration != nullptr));
+  FUZZTEST_CHECK((test != nullptr) == (configuration != nullptr));
   current_test_ = test;
   current_configuration_ = configuration;
   if (configuration == nullptr) return;
@@ -484,11 +483,9 @@
         fuzztest::internal::VerifyBazelHasEnoughTimeToRunTest(
             creation_time_, test_time_limit, test_counter_,
             configuration->fuzz_tests.size());
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        has_enough_time.ok(),
-        absl::StrCat("Not enough time for running the fuzz test ",
-                     test->full_name(), " for ", test_time_limit, ": ",
-                     has_enough_time));
+    FUZZTEST_PRECONDITION(has_enough_time.ok())
+        << "Not enough time for running the fuzz test " << test->full_name()
+        << " for " << test_time_limit << ": " << has_enough_time;
   }
   ++test_counter_;
 }
@@ -678,8 +675,8 @@
       corpus_coverage_(execution_coverage_ != nullptr
                            ? execution_coverage_->GetCounterMap().size()
                            : 0) {
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(fixture_driver_ != nullptr,
-                                       "Invalid fixture driver!");
+  FUZZTEST_PRECONDITION(fixture_driver_ != nullptr)
+      << "Invalid fixture driver!";
   stats_.start_time = absl::Now();
   const char* corpus_out_dir_chars = getenv("FUZZTEST_TESTSUITE_OUT_DIR");
   if (corpus_out_dir_chars) corpus_out_dir_ = corpus_out_dir_chars;
@@ -807,12 +804,11 @@
   std::optional<corpus_type> reproducer;
   ForEachInput({std::string(file)},
                [&](absl::string_view, std::optional<int>, Input input) {
-                 FUZZTEST_INTERNAL_CHECK(!reproducer.has_value(),
-                                         "Multiple inputs found in ", file);
+                 FUZZTEST_CHECK(!reproducer.has_value())
+                     << "Multiple inputs found in " << file;
                  reproducer = std::move(input.args);
                });
-  FUZZTEST_INTERNAL_CHECK(reproducer.has_value(),
-                          "Failed to read minimizer file!");
+  FUZZTEST_CHECK(reproducer.has_value()) << "Failed to read minimizer file!";
   return *reproducer;
 }
 
@@ -1066,9 +1062,8 @@
     auto duration = absl::Seconds(1);
     const auto fuzz_for = absl::NullSafeStringView(getenv("FUZZTEST_FUZZ_FOR"));
     if (!fuzz_for.empty()) {
-      FUZZTEST_INTERNAL_CHECK(
-          absl::ParseDuration(fuzz_for, &duration),
-          "Could not parse duration in FUZZTEST_FUZZ_FOR=", fuzz_for);
+      FUZZTEST_CHECK(absl::ParseDuration(fuzz_for, &duration))
+          << "Could not parse duration in FUZZTEST_FUZZ_FOR=" << fuzz_for;
     }
     const auto time_limit = stats_.start_time + duration;
     Input mutation{params_domain_.Init(prng)};
@@ -1158,9 +1153,8 @@
   constexpr int kMaxTriedWithoutFailure = 10000;
   while (tries_without_failure < kMaxTriedWithoutFailure &&
          absl::Now() < deadline) {
-    FUZZTEST_INTERNAL_CHECK(
-        minimal_non_fatal_counterexample_.has_value(),
-        "Caller didn't populate minimal_non_fatal_counterexample_");
+    FUZZTEST_CHECK(minimal_non_fatal_counterexample_.has_value())
+        << "Caller didn't populate minimal_non_fatal_counterexample_";
     auto copy = *minimal_non_fatal_counterexample_;
     // Mutate a random number of times, in case one is not enough to
     // reach another failure, but prefer a low number of mutations (thus Zipf).
@@ -1238,9 +1232,9 @@
         corpus_database.GetCoverageInputsIfAny(test_.full_name()));
     InitializeCorpus(prng);
 
-    FUZZTEST_INTERNAL_CHECK(!corpus_.empty(),
-                            "No seed input coverage registered. Test function "
-                            "might be uninstrumented?");
+    FUZZTEST_CHECK(!corpus_.empty())
+        << "No seed input coverage registered. Test function "
+           "might be uninstrumented?";
 
     constexpr size_t kRunsPerInit = 32000;
     size_t next_init = kRunsPerInit;
@@ -1305,8 +1299,8 @@
           return {params_domain_.Init(prng)};
         } else {
           size_t idx = static_cast<size_t>(corpus_distribution_(prng));
-          FUZZTEST_INTERNAL_CHECK(0 <= idx && idx < corpus_.size(),
-                                  "Corpus input weights are outdated!\n");
+          FUZZTEST_CHECK(0 <= idx && idx < corpus_.size())
+              << "Corpus input weights are outdated!\n";
           return corpus_[idx];
         }
       }();
diff --git a/fuzztest/internal/seed_seq.cc b/fuzztest/internal/seed_seq.cc
index 1bf485c..2f8896b 100644
--- a/fuzztest/internal/seed_seq.cc
+++ b/fuzztest/internal/seed_seq.cc
@@ -29,6 +29,7 @@
 #include "absl/strings/escaping.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/span.h"
+#include "./common/logging.h"
 #include "./fuzztest/internal/logging.h"
 
 namespace fuzztest::internal {
@@ -51,9 +52,9 @@
   }
   std::optional<std::vector<uint32_t>> seed_material =
       DecodeSeedMaterial(encoded_seed_material);
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-      seed_material.has_value(),
-      "Failed to decode seed material from the environment variable ", env_var);
+  FUZZTEST_PRECONDITION(seed_material.has_value())
+      << "Failed to decode seed material from the environment variable "
+      << env_var;
   return *std::move(seed_material);
 }
 
diff --git a/fuzztest/internal/subprocess.cc b/fuzztest/internal/subprocess.cc
index 1dbf7e8..54e0aff 100644
--- a/fuzztest/internal/subprocess.cc
+++ b/fuzztest/internal/subprocess.cc
@@ -45,7 +45,7 @@
 #include "absl/time/clock.h"
 #include "absl/time/time.h"
 #include "absl/types/span.h"
-#include "./fuzztest/internal/logging.h"
+#include "./common/logging.h"
 
 #if !defined(_MSC_VER)
 // Needed to pass the current environment to posix_spawn, which needs an
@@ -68,7 +68,7 @@
 
 std::variant<ExitCodeT, SignalT> TerminationStatus::Status() const {
   if (Exited()) return static_cast<ExitCodeT>(WEXITSTATUS(status_));
-  FUZZTEST_INTERNAL_CHECK(Signaled(), "!Exited && !Signaled");
+  FUZZTEST_CHECK(Signaled()) << "!Exited && !Signaled";
   return static_cast<SignalT>(WTERMSIG(status_));
 }
 
@@ -108,29 +108,28 @@
 void SubProcess::CreatePipes() {
   for (int channel : {kStdOutIdx, kStdErrIdx}) {
     int pipe_fds[2];
-    FUZZTEST_INTERNAL_CHECK(pipe(pipe_fds) == 0,
-                            "Cannot create pipe: ", strerror(errno));
+    FUZZTEST_CHECK(pipe(pipe_fds) == 0) << "Cannot create pipe: ",
+        strerror(errno);
 
     parent_pipe_[channel] = pipe_fds[0];
     child_pipe_[channel] = pipe_fds[1];
 
-    FUZZTEST_INTERNAL_CHECK(
-        fcntl(parent_pipe_[channel], F_SETFL, O_NONBLOCK) != -1,
-        "Cannot make pipe non-blocking: ", strerror(errno));
+    FUZZTEST_CHECK(fcntl(parent_pipe_[channel], F_SETFL, O_NONBLOCK) != -1)
+        << "Cannot make pipe non-blocking: " << strerror(errno);
   }
 }
 
 void SubProcess::CloseChildPipes() {
   for (int channel : {kStdOutIdx, kStdErrIdx}) {
-    FUZZTEST_INTERNAL_CHECK(close(child_pipe_[channel]) != -1,
-                            "Cannot close pipe: ", strerror(errno));
+    FUZZTEST_CHECK(close(child_pipe_[channel]) != -1)
+        << "Cannot close pipe: " << strerror(errno);
   }
 }
 
 void SubProcess::CloseParentPipes() {
   for (int channel : {kStdOutIdx, kStdErrIdx}) {
-    FUZZTEST_INTERNAL_CHECK(close(parent_pipe_[channel]) != -1,
-                            "Cannot close pipe: ", strerror(errno));
+    FUZZTEST_CHECK(close(parent_pipe_[channel]) != -1)
+        << "Cannot close pipe: " << strerror(errno);
   }
 }
 
@@ -141,28 +140,24 @@
 
   int err;
   err = posix_spawn_file_actions_init(&actions);
-  FUZZTEST_INTERNAL_CHECK(err == 0,
-                          "Cannot initialize file actions: ", strerror(err));
+  FUZZTEST_CHECK(err == 0) << "Cannot initialize file actions: "
+                           << strerror(err);
 
   // Close stdin.
   err = posix_spawn_file_actions_addclose(&actions, STDIN_FILENO);
-  FUZZTEST_INTERNAL_CHECK(err == 0,
-                          "Cannot add close() action: ", strerror(err));
+  FUZZTEST_CHECK(err == 0) << "Cannot add close() action: " << strerror(err);
 
   for (int channel : {kStdOutIdx, kStdErrIdx}) {
     // Close parent-side pipes.
     err = posix_spawn_file_actions_addclose(&actions, parent_pipe_[channel]);
-    FUZZTEST_INTERNAL_CHECK(err == 0,
-                            "Cannot add close() action: ", strerror(err));
+    FUZZTEST_CHECK(err == 0) << "Cannot add close() action: " << strerror(err);
 
     // Replace stdout/stderr file descriptors with the pipes.
     int fd = channel == kStdOutIdx ? STDOUT_FILENO : STDERR_FILENO;
     err = posix_spawn_file_actions_adddup2(&actions, child_pipe_[channel], fd);
-    FUZZTEST_INTERNAL_CHECK(err == 0,
-                            "Cannot add dup2() action: ", strerror(err));
+    FUZZTEST_CHECK(err == 0) << "Cannot add dup2() action: " << strerror(err);
     err = posix_spawn_file_actions_addclose(&actions, child_pipe_[channel]);
-    FUZZTEST_INTERNAL_CHECK(err == 0,
-                            "Cannot add close() action: ", strerror(err));
+    FUZZTEST_CHECK(err == 0) << "Cannot add close() action: " << strerror(err);
   }
 
   return actions;
@@ -198,16 +193,15 @@
   int err;
   err = posix_spawnp(&child_pid, argv[0], &actions, nullptr, argv.data(),
                      environment.has_value() ? envp.data() : environ);
-  FUZZTEST_INTERNAL_CHECK(err == 0,
-                          "Cannot spawn child process: ", strerror(err));
+  FUZZTEST_CHECK(err == 0) << "Cannot spawn child process: ", strerror(err);
 
   // Free up the used parameters.
   for (char* p : argv) free(p);
   for (char* p : envp) free(p);
 
   err = posix_spawn_file_actions_destroy(&actions);
-  FUZZTEST_INTERNAL_CHECK(err == 0,
-                          "Cannot destroy file actions: ", strerror(err));
+  FUZZTEST_CHECK(err == 0)
+  "Cannot destroy file actions: " << strerror(err);
 
   return child_pid;
 }
@@ -235,9 +229,9 @@
   while (fd_remain > 0) {
     int ret = poll(pfd, fd_count, -1);
     if ((ret == -1) && !ShouldRetry(errno)) {
-      FUZZTEST_INTERNAL_CHECK(false, "Cannot poll(): ", strerror(errno));
+      FUZZTEST_CHECK(false) << "Cannot poll(): " << strerror(errno);
     } else if (ret == 0) {
-      FUZZTEST_INTERNAL_CHECK(false, "Impossible timeout: ", strerror(errno));
+      FUZZTEST_CHECK(false) << "Impossible timeout: " << strerror(errno);
     } else if (ret > 0) {
       for (int channel : {kStdOutIdx, kStdErrIdx}) {
         // According to the poll() spec, use -1 for ignored entries.
@@ -274,7 +268,7 @@
     } else if (ret == pid && (WIFEXITED(status) || WIFSIGNALED(status))) {
       return status;
     } else {
-      FUZZTEST_INTERNAL_CHECK(false, "wait() error: ", strerror(errno));
+      FUZZTEST_CHECK(false) << "wait() error: " << strerror(errno);
     }
   }
 }
@@ -291,8 +285,8 @@
       continue;
     } else if (ret == 0) {  // Still running.
       if (should_stop()) {
-        FUZZTEST_INTERNAL_CHECK(kill(pid, SIGTERM) == 0,
-                                "Cannot kill(): ", strerror(errno));
+        FUZZTEST_CHECK(kill(pid, SIGTERM) == 0)
+            << "Cannot kill(): " << strerror(errno);
         return Wait(pid);
       } else {
         absl::SleepFor(sleep_duration);
@@ -301,7 +295,7 @@
     } else if (ret == pid && (WIFEXITED(status) || WIFSIGNALED(status))) {
       return status;
     } else {
-      FUZZTEST_INTERNAL_CHECK(false, "wait() error: ", strerror(errno));
+      FUZZTEST_CHECK(false) "wait() error: " << strerror(errno);
     }
   }
 }
@@ -336,15 +330,13 @@
     const std::optional<absl::flat_hash_map<std::string, std::string>>&
         environment) {
 #if defined(_MSC_VER)
-  FUZZTEST_INTERNAL_CHECK(false,
-                          "Subprocess library not implemented on Windows yet.");
+  FUZZTEST_CHECK(false) << "Subprocess library not implemented on Windows yet.";
 #elif defined(__ANDROID_MIN_SDK_VERSION__) && __ANDROID_MIN_SDK_VERSION__ < 28
-  FUZZTEST_INTERNAL_CHECK(
-      false,
-      "Subprocess library not implemented on older Android NDK versions yet");
+  FUZZTEST_CHECK(false)
+      << "Subprocess library not implemented on older Android NDK versions yet";
 #elif defined(TARGET_OS_TV) && TARGET_OS_TV
-  FUZZTEST_INTERNAL_CHECK(
-      false, "Subprocess library not implemented on Apple tvOS yet");
+  FUZZTEST_INTERNAL_CHECK(false)
+      << "Subprocess library not implemented on Apple tvOS yet";
 #else
   SubProcess proc;
   return proc.Run(command_line, on_stdout_output, on_stderr_output, should_stop,
diff --git a/fuzztest/llvm_fuzzer_wrapper.cc b/fuzztest/llvm_fuzzer_wrapper.cc
index 49c3235..c187773 100644
--- a/fuzztest/llvm_fuzzer_wrapper.cc
+++ b/fuzztest/llvm_fuzzer_wrapper.cc
@@ -12,17 +12,16 @@
 #include "absl/base/thread_annotations.h"
 #include "absl/flags/declare.h"
 #include "absl/flags/flag.h"
-#include "absl/log/absl_check.h"
 #include "absl/random/bit_gen_ref.h"
 #include "absl/random/random.h"
 #include "absl/synchronization/mutex.h"
+#include "./common/logging.h"
 #include "./fuzztest/fuzztest.h"
 #include "./fuzztest/fuzztest_macros.h"
 #include "./fuzztest/internal/domains/arbitrary_impl.h"
 #include "./fuzztest/internal/domains/container_of_impl.h"
 #include "./fuzztest/internal/domains/domain_base.h"
 #include "./fuzztest/internal/io.h"
-#include "./fuzztest/internal/logging.h"
 
 ABSL_DECLARE_FLAG(std::string, llvm_fuzzer_wrapper_dict_file);
 ABSL_DECLARE_FLAG(std::string, llvm_fuzzer_wrapper_corpus_dir);
@@ -75,7 +74,7 @@
   for (const fuzztest::internal::FilePathAndData& file : files) {
     absl::StatusOr<std::vector<std::string>> parsed_entries =
         fuzztest::ParseDictionary(file.data);
-    ABSL_CHECK(parsed_entries.status().ok())
+    FUZZTEST_CHECK(parsed_entries.status().ok())
         << "Could not parse dictionary file " << file.path << ": "
         << parsed_entries.status();
     for (const std::string& parsed_entry : *parsed_entries) {
@@ -104,45 +103,38 @@
  public:
   void Activate(MutationMetadata mutation_metadata) {
     absl::MutexLock lock(&mu_);
-    FUZZTEST_INTERNAL_CHECK(
-        !mutation_metadata_.has_value(),
-        "MutationMetadata is already active before calling Activate()!");
-    FUZZTEST_INTERNAL_CHECK(
-        acquire_count_ == 0,
-        "MutationMetadata still has readers before being calling Activate()!");
+    FUZZTEST_CHECK(!mutation_metadata_.has_value())
+        << "MutationMetadata is already active before calling Activate()!";
+    FUZZTEST_CHECK(acquire_count_ == 0) << "MutationMetadata still has readers "
+                                           "before being calling Activate()!";
     mutation_metadata_ = std::move(mutation_metadata);
   }
 
   void Deactivate() {
     absl::MutexLock lock(&mu_);
-    FUZZTEST_INTERNAL_CHECK(
-        mutation_metadata_.has_value(),
-        "MutationMetadata is not active before calling Deactivate()!");
-    FUZZTEST_INTERNAL_CHECK(
-        acquire_count_ == 0,
-        "MutationMetadata still has readers before calling Deactivate()!");
+    FUZZTEST_CHECK(mutation_metadata_.has_value())
+        << "MutationMetadata is not active before calling Deactivate()!";
+    FUZZTEST_CHECK(acquire_count_ == 0)
+        << "MutationMetadata still has readers before calling Deactivate()!";
     mutation_metadata_ = std::nullopt;
   }
 
   const MutationMetadata& Acquire() {
     absl::MutexLock lock(&mu_);
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-        mutation_metadata_.has_value(),
-        "Cannot acquire unavailable mutation metadata, likely due to the "
-        "fuzzer calling LLVMFuzzerMutate() outside of "
-        "LLVMFuzzerCustomMutator() invocation, which is not allowed.");
+    FUZZTEST_PRECONDITION(mutation_metadata_.has_value())
+        << "Cannot acquire unavailable mutation metadata, likely due to the "
+           "fuzzer calling LLVMFuzzerMutate() outside of "
+           "LLVMFuzzerCustomMutator() invocation, which is not allowed.";
     ++acquire_count_;
     return *mutation_metadata_;
   }
 
   void Release() {
     absl::MutexLock lock(&mu_);
-    FUZZTEST_INTERNAL_CHECK(
-        mutation_metadata_.has_value(),
-        "MutationMetadata is not active before calling Release()!");
-    FUZZTEST_INTERNAL_CHECK(
-        acquire_count_ > 0,
-        "MutationMetadata has no readers before calling Release()!");
+    FUZZTEST_CHECK(mutation_metadata_.has_value())
+        << "MutationMetadata is not active before calling Release()!";
+    FUZZTEST_CHECK(acquire_count_ > 0)
+        << "MutationMetadata has no readers before calling Release()!";
     --acquire_count_;
   }
 
diff --git a/grammar_codegen/BUILD b/grammar_codegen/BUILD
index 8b6b140..f7155bd 100644
--- a/grammar_codegen/BUILD
+++ b/grammar_codegen/BUILD
@@ -29,9 +29,11 @@
     features = ["-use_header_modules"],  # Incompatible with -fexceptions.
     deps = [
         ":grammar_info",
+        "@abseil-cpp//absl/log:absl_check",
+        "@abseil-cpp//absl/log:absl_log",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
-        "@com_google_fuzztest//fuzztest/internal:logging",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//grammar_codegen/generated_antlr_parser",
     ],
 )
@@ -46,6 +48,7 @@
         "@abseil-cpp//absl/container:flat_hash_set",
         "@abseil-cpp//absl/strings",
         "@abseil-cpp//absl/strings:str_format",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//fuzztest/internal:logging",
     ],
 )
diff --git a/grammar_codegen/antlr_frontend.cc b/grammar_codegen/antlr_frontend.cc
index cabb68b..4174fdf 100644
--- a/grammar_codegen/antlr_frontend.cc
+++ b/grammar_codegen/antlr_frontend.cc
@@ -25,9 +25,9 @@
 #include "absl/strings/str_cat.h"
 #include "absl/strings/str_format.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./grammar_codegen/generated_antlr_parser/ANTLRv4Lexer.h"
 #include "./grammar_codegen/grammar_info.h"
-#include "./fuzztest/internal/logging.h"
 
 namespace fuzztest::internal::grammar {
 
@@ -56,9 +56,9 @@
 // Add '^' to the char set if it is a NOT set.
 std::string ConstructCharSetString(absl::string_view raw_str,
                                    bool is_not_set = false) {
-  FUZZTEST_INTERNAL_CHECK(
-      raw_str.size() > 2 && raw_str.front() == '[' && raw_str.back() == ']',
-      "Passed argument is not a range string: `" + std::string(raw_str) + "`");
+  FUZZTEST_CHECK(raw_str.size() > 2 && raw_str.front() == '[' &&
+                 raw_str.back() == ']')
+      << "Passed argument is not a range string: `" << raw_str << "`";
   std::string result(raw_str);
   if (is_not_set) {
     result = absl::StrFormat("[^%s]", result.substr(1, result.size() - 2));
@@ -104,7 +104,7 @@
   if (lexer_atom_ctx->terminal() && lexer_atom_ctx->terminal()->TOKEN_REF()) {
     auto k = block.element.emplace<kNonTerminal>(
         NonTerminal{lexer_atom_ctx->getText()});
-    FUZZTEST_INTERNAL_CHECK(!k.name.empty(), "Empty name!");
+    FUZZTEST_CHECK(!k.name.empty()) << "Empty name!";
   } else {
     auto& terminal = block.element.emplace<kTerminal>();
     std::string text = lexer_atom_ctx->getText();
@@ -123,16 +123,16 @@
           terminal.content =
               ConstructCharSetString(set_element_p->getText(), true);
         } else {
-          FUZZTEST_INTERNAL_CHECK(false, "Not lexer char set!");
+          FUZZTEST_CHECK(false) << "Not lexer char set!";
         }
       } else {
-        FUZZTEST_INTERNAL_CHECK(false, "Unhandled case!");
+        FUZZTEST_CHECK(false) << "Unhandled case!";
       }
     } else if (lexer_atom_ctx->DOT()) {
       terminal.type = TerminalType::kCharSet;
       terminal.content = EscapeString(lexer_atom_ctx->DOT()->getText());
     } else {
-      FUZZTEST_INTERNAL_CHECK(false, "Unhandled case!");
+      FUZZTEST_CHECK(false) << "Unhandled case!";
     }
   }
   return block;
@@ -152,7 +152,7 @@
     } else if (element->lexerAtom() != NULL) {
       block = ConstructBlock(element->lexerAtom());
     } else {
-      FUZZTEST_INTERNAL_CHECK(false, "Unhandled case!");
+      FUZZTEST_CHECK(false) << "Unhandled case!";
     }
     if (element->ebnfSuffix()) {
       block.range = ParseRange(element->ebnfSuffix()->getText());
@@ -175,13 +175,14 @@
 }
 
 Range GrammarInfoBuilder::ParseRange(absl::string_view s) {
-  return (s == "?")                ? Range::kOptional
-         : (s == "+" || s == "+?") ? Range::kNonEmpty
-         : (s == "*" || s == "*?")
-             ? Range::kUnlimited
-             : (FUZZTEST_INTERNAL_CHECK(false,
-                                        absl::StrCat("Unhandled case: ", s)),
-                Range::kNoRange);
+  if (s == "?") {
+    return Range::kOptional;
+  } else if (s == "+" || s == "*?") {
+    return Range::kNonEmpty;
+  } else if (s == "*" || s == "*?") {
+    return Range::kUnlimited;
+  }
+  FUZZTEST_CHECK(false) << "Unhandled case: " << s;
 }
 
 Block GrammarInfoBuilder::ConstructBlock(
@@ -209,7 +210,7 @@
     ChangeStringQuote(node_name);
     terminal_node.content = node_name;
   } else {
-    FUZZTEST_INTERNAL_CHECK(false, "Unhandled case!");
+    FUZZTEST_CHECK(false) << "Unhandled case!";
   }
   return constructed_block;
 }
@@ -231,15 +232,14 @@
     } else if (labeled_element->block()) {
       constructed_block = ConstructBlock(labeled_element->block());
     } else {
-      FUZZTEST_INTERNAL_CHECK(false, "Impossible case!");
+      FUZZTEST_CHECK(false) << "Impossible case!";
     }
   } else {
-    FUZZTEST_INTERNAL_CHECK(false, "Unhandled case!");
+    FUZZTEST_CHECK(false) << "Unhandled case!";
   }
 
   if (element->ebnfSuffix()) {
-    FUZZTEST_INTERNAL_CHECK(!suffix.has_value(),
-                            "It should have only one suffix.");
+    FUZZTEST_CHECK(!suffix.has_value()) << "It should have only one suffix.";
     suffix = element->ebnfSuffix()->getText();
   }
 
@@ -272,7 +272,7 @@
   auto labeledAlt_vec = pctx->ruleBlock()->ruleAltList()->labeledAlt();
   for (auto labeled_alt : pctx->ruleBlock()->ruleAltList()->labeledAlt()) {
     auto ctx = labeled_alt->alternative();
-    FUZZTEST_INTERNAL_CHECK(ctx != nullptr, "Unhandeled case!");
+    FUZZTEST_CHECK(ctx != nullptr) << "Unhandeled case!";
     grammar_rule.productions.production_rules.push_back(
         ConstructProductionRule(ctx));
   }
@@ -282,8 +282,7 @@
 Grammar GrammarInfoBuilder::BuildGrammarInfo(
     const std::vector<std::string>& input_grammar_specs,
     std::optional<std::string> grammar_name, bool insert_space_between_blocks) {
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(!input_grammar_specs.empty(),
-                                       "No input files!");
+  FUZZTEST_PRECONDITION(!input_grammar_specs.empty()) << "No input files!";
 
   insert_space_between_blocks_ = insert_space_between_blocks;
 
@@ -297,18 +296,18 @@
       antlr4::tree::ParseTree* tree = parser.grammarSpec();
       antlr4::tree::ParseTreeWalker::DEFAULT.walk(this, tree);
     } catch (antlr4::ParseCancellationException) {
-      FUZZTEST_INTERNAL_CHECK(false, "Cannot parse the grammar files!");
+      FUZZTEST_CHECK(false) << "Cannot parse the grammar files!";
     } catch (...) {
       // The ParseCancellationException might miss some errors. So we need to
       // catch everything here.
-      FUZZTEST_INTERNAL_CHECK(false, "Unknown errors!");
+      FUZZTEST_CHECK(false) << "Unknown errors!";
     }
   }
   if (grammar_name.has_value()) {
     grammar_name_ = *grammar_name;
   }
-  FUZZTEST_INTERNAL_CHECK(!grammar_name_.empty() && !rules_.empty(),
-                          "Wrong grammar file!");
+  FUZZTEST_CHECK(!grammar_name_.empty() && !rules_.empty())
+      << "Wrong grammar file!";
   return Grammar{std::move(grammar_name_), std::move(rules_)};
 }
 
diff --git a/grammar_codegen/backend.cc b/grammar_codegen/backend.cc
index c3dae47..532318f 100644
--- a/grammar_codegen/backend.cc
+++ b/grammar_codegen/backend.cc
@@ -24,6 +24,7 @@
 #include "absl/strings/str_format.h"
 #include "absl/strings/str_join.h"
 #include "absl/strings/string_view.h"
+#include "./common/logging.h"
 #include "./grammar_codegen/grammar_info.h"
 #include "./fuzztest/internal/logging.h"
 
@@ -45,11 +46,9 @@
 
 std::string CreateIRNodeNameForClass(absl::string_view symbol_name) {
   static int counter = 0;
-  FUZZTEST_INTERNAL_CHECK(
-      symbol_name.size() > 4 &&
-          symbol_name.substr(symbol_name.size() - 4) == "Node",
-      std::string("Not a valid symbol class name: ") + "  " +
-          std::string(symbol_name));
+  FUZZTEST_CHECK(symbol_name.size() > 4 &&
+                 symbol_name.substr(symbol_name.size() - 4) == "Node")
+      << "Not a valid symbol class name: " << symbol_name;
   return absl::StrFormat(
       "%sSubNode%d", symbol_name.substr(0, symbol_name.size() - 4), counter++);
 }
@@ -284,18 +283,16 @@
   std::string class_name = GetClassNameForSymbol(rule.symbol_name);
   const std::vector<ProductionRule>& prod_rules =
       rule.productions.production_rules;
-  FUZZTEST_INTERNAL_CHECK(!prod_rules.empty(), "No expansion!");
+  FUZZTEST_CHECK(!prod_rules.empty()) << "No expansion!";
   if (prod_rules.size() > 1) {
     // This is a variant.
     std::vector<std::string> production_child_types;
     for (const ProductionRule& prod_rule : prod_rules) {
-      FUZZTEST_INTERNAL_CHECK(prod_rule.blocks.size() == 1,
-                              "Incorrect preprocess.");
+      FUZZTEST_CHECK(prod_rule.blocks.size() == 1) << "Incorrect preprocess.";
       auto block = prod_rule.blocks[0];
-      FUZZTEST_INTERNAL_CHECK(
-          block.range == Range::kNoRange &&
-              block.element.index() != BlockType::kSubProductions,
-          "Incorrect preprocess.");
+      FUZZTEST_CHECK(block.range == Range::kNoRange &&
+                     block.element.index() != BlockType::kSubProductions)
+          << "Incorrect preprocess.";
       production_child_types.push_back(GetClassName(block));
     }
     return absl::StrFormat("VariantDomain<k%s, %d, %s>", class_name,
@@ -312,10 +309,9 @@
     std::vector<std::string> production_child_types;
     auto blocks = prod_rules[0].blocks;
     for (const auto& block : blocks) {
-      FUZZTEST_INTERNAL_CHECK(
-          block.range == Range::kNoRange &&
-              block.element.index() != BlockType::kSubProductions,
-          "Incorrect preprocess.");
+      FUZZTEST_CHECK(block.range == Range::kNoRange &&
+                     block.element.index() != BlockType::kSubProductions)
+          << "Incorrect preprocess.";
       production_child_types.push_back(GetClassName(block));
     }
     return absl::StrFormat("TupleDomain<k%s, %s>", class_name,
@@ -390,7 +386,7 @@
       return is_safe;
     }
     default:
-      FUZZTEST_INTERNAL_CHECK(false, "The execution should never reach here!");
+      FUZZTEST_LOG(FATAL) << "unreachable";
   }
 }
 
@@ -422,9 +418,8 @@
   } while (has_change);
 
   for (size_t i = 0; i < safe_rule_indexes.size(); ++i) {
-    FUZZTEST_INTERNAL_CHECK(
-        safe_rule_indexes[i],
-        absl::StrCat("Some node is not safe: ", rules[i].symbol_name));
+    FUZZTEST_CHECK(safe_rule_indexes[i])
+        << "Some node is not safe: " << rules[i].symbol_name;
   }
 
   // Ensure that every sub-block is marked safe. For example, a grammar rule
@@ -453,13 +448,13 @@
       return GetClassNameForSymbol(
           std::get<BlockType::kNonTerminal>(block.element).name);
     default:
-      FUZZTEST_INTERNAL_CHECK(false, "A sub-block doesn't have a name!");
+      FUZZTEST_LOG(FATAL) << "A sub-block doesn't have a name!";
   }
   return "";
 }
 
 std::string CodeGenerator::GetClassNameForSymbol(std::string id) {
-  FUZZTEST_INTERNAL_CHECK(!id.empty(), "Empty node name!");
+  FUZZTEST_CHECK(!id.empty()) << "Empty node name!";
   id[0] = toupper(id[0]);
   if (std::isdigit(id.back())) {
     return id;
diff --git a/tools/BUILD b/tools/BUILD
index 4587e7a..e441ce5 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -29,7 +29,7 @@
     deps = [
         "@abseil-cpp//absl/flags:flag",
         "@abseil-cpp//absl/flags:parse",
-        "@com_google_fuzztest//fuzztest/internal:logging",
+        "@com_google_fuzztest//common:logging",
         "@com_google_fuzztest//grammar_codegen:code_generation",
     ],
 )
diff --git a/tools/grammar_domain_code_generator.cc b/tools/grammar_domain_code_generator.cc
index 66ba9bc..0e0377e 100644
--- a/tools/grammar_domain_code_generator.cc
+++ b/tools/grammar_domain_code_generator.cc
@@ -27,8 +27,8 @@
 
 #include "absl/flags/flag.h"
 #include "absl/flags/parse.h"
+#include "./common/logging.h"
 #include "./grammar_codegen/code_generation.h"
-#include "./fuzztest/internal/logging.h"
 
 ABSL_FLAG(std::string, output_header_file_path, "",
           "Required. The path of the generated grammar header file.");
@@ -62,19 +62,16 @@
   absl::ParseCommandLine(argc, argv);
 
   std::string output_file_path = absl::GetFlag(FLAGS_output_header_file_path);
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-      !output_file_path.empty(),
-      "You must specify output file with --output_header_file_path");
+  FUZZTEST_PRECONDITION(!output_file_path.empty())
+      << "You must specify output file with --output_header_file_path";
   std::ofstream output_file(output_file_path);
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(output_file.is_open(),
-                                       "Cannot open output file!");
+  FUZZTEST_PRECONDITION(output_file.is_open()) << "Cannot open output file!";
 
   std::vector<std::string> input_files =
       absl::GetFlag(FLAGS_input_grammar_files);
 
-  FUZZTEST_INTERNAL_CHECK_PRECONDITION(
-      !input_files.empty(),
-      "You must provide the list of input files, separated by ','");
+  FUZZTEST_PRECONDITION(!input_files.empty())
+      << "You must provide the list of input files, separated by ','";
 
   std::optional<std::string> grammar_name = std::nullopt;
   if (!absl::GetFlag(FLAGS_top_level_rule).empty()) {
@@ -83,8 +80,8 @@
 
   std::vector<std::string> input_grammar_specs;
   for (const std::string& input_file : input_files) {
-    FUZZTEST_INTERNAL_CHECK_PRECONDITION(std::filesystem::exists(input_file),
-                                         input_file.c_str(), " not exist!");
+    FUZZTEST_PRECONDITION(std::filesystem::exists(input_file))
+        << input_file.c_str() << " not exist!";
     input_grammar_specs.push_back(GetContents(input_file));
   }
   output_file << fuzztest::internal::grammar::GenerateGrammarHeader(