diff --git a/tensorflow/lite/delegates/utils/dummy_delegate/dummy_delegate_provider.cc b/tensorflow/lite/delegates/utils/dummy_delegate/dummy_delegate_provider.cc
index dec6584555c..caf73613ca4 100644
--- a/tensorflow/lite/delegates/utils/dummy_delegate/dummy_delegate_provider.cc
+++ b/tensorflow/lite/delegates/utils/dummy_delegate/dummy_delegate_provider.cc
@@ -29,7 +29,7 @@ class DummyDelegateProvider : public DelegateProvider {
 
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
 
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
 
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
 
@@ -43,9 +43,10 @@ std::vector<Flag> DummyDelegateProvider::CreateFlags(ToolParams* params) const {
   return flags;
 }
 
-void DummyDelegateProvider::LogParams(const ToolParams& params) const {
-  TFLITE_LOG(INFO) << "Use dummy test delegate : ["
-                   << params.Get<bool>("use_dummy_delegate") << "]";
+void DummyDelegateProvider::LogParams(const ToolParams& params,
+                                      bool verbose) const {
+  LOG_TOOL_PARAM(params, bool, "use_dummy_delegate", "Use dummy test delegate",
+                 verbose);
 }
 
 TfLiteDelegatePtr DummyDelegateProvider::CreateTfLiteDelegate(
diff --git a/tensorflow/lite/tools/benchmark/README.md b/tensorflow/lite/tools/benchmark/README.md
index 6226888d676..2e2967a50be 100644
--- a/tensorflow/lite/tools/benchmark/README.md
+++ b/tensorflow/lite/tools/benchmark/README.md
@@ -53,6 +53,10 @@ and the following optional parameters:
     `stdout` if option is not set. Requires `enable_op_profiling` to be `true`
     and the path to include the name of the output CSV; otherwise results are
     printed to `stdout`.
+*  `verbose`: `bool` (default=false) \
+    Whether to log parameters whose values are not set. By default, only log
+    those parameters that are set by parsing their values from the commandline
+    flags.
 
 ### TFLite delegate parameters
 The tool supports all runtime/delegate parameters introduced by
diff --git a/tensorflow/lite/tools/benchmark/benchmark_model.cc b/tensorflow/lite/tools/benchmark/benchmark_model.cc
index 2cccab4e136..617fa7d84b6 100644
--- a/tensorflow/lite/tools/benchmark/benchmark_model.cc
+++ b/tensorflow/lite/tools/benchmark/benchmark_model.cc
@@ -104,28 +104,28 @@ std::vector<Flag> BenchmarkModel::GetFlags() {
       CreateFlag<bool>("verbose", &params_,
                        "Whether to log parameters whose values are not set. "
                        "By default, only log those parameters that are set by "
-                       "parsing their values from the commandline flag.."),
+                       "parsing their values from the commandline flags."),
   };
 }
 
-#define LOG_PARAM(type, name, prefix, suffix) \
-  LOG_BENCHMARK_PARAM(params_, type, name, prefix, suffix, verbose)
 void BenchmarkModel::LogParams() {
   const bool verbose = params_.Get<bool>("verbose");
-  LOG_PARAM(int32_t, "num_runs", "Min num runs: [", "]");
-  LOG_PARAM(int32_t, "num_runs", "Min num runs: [", "]");
-  LOG_PARAM(float, "min_secs", "Min runs duration (seconds): [", "]");
-  LOG_PARAM(float, "max_secs", "Max runs duration (seconds): [", "]");
-  LOG_PARAM(float, "run_delay", "Inter-run delay (seconds): [", "]");
-  LOG_PARAM(int32_t, "num_threads", "Num threads: [", "]");
-  LOG_PARAM(bool, "use_caching", "Use caching: [", "]");
-  LOG_PARAM(std::string, "benchmark_name", "Benchmark name: [", "]");
-  LOG_PARAM(std::string, "output_prefix", "Output prefix: [", "]");
-  LOG_PARAM(int32_t, "warmup_runs", "Min warmup runs: [", "]");
-  LOG_PARAM(float, "warmup_min_secs", "Min warmup runs duration (seconds): [",
-            "]");
+  TFLITE_LOG(INFO) << "Log parameter values verbosely: [" << verbose << "]";
+
+  LOG_BENCHMARK_PARAM(int32_t, "num_runs", "Min num runs", verbose);
+  LOG_BENCHMARK_PARAM(float, "min_secs", "Min runs duration (seconds)",
+                      verbose);
+  LOG_BENCHMARK_PARAM(float, "max_secs", "Max runs duration (seconds)",
+                      verbose);
+  LOG_BENCHMARK_PARAM(float, "run_delay", "Inter-run delay (seconds)", verbose);
+  LOG_BENCHMARK_PARAM(int32_t, "num_threads", "Num threads", verbose);
+  LOG_BENCHMARK_PARAM(bool, "use_caching", "Use caching", verbose);
+  LOG_BENCHMARK_PARAM(std::string, "benchmark_name", "Benchmark name", verbose);
+  LOG_BENCHMARK_PARAM(std::string, "output_prefix", "Output prefix", verbose);
+  LOG_BENCHMARK_PARAM(int32_t, "warmup_runs", "Min warmup runs", verbose);
+  LOG_BENCHMARK_PARAM(float, "warmup_min_secs",
+                      "Min warmup runs duration (seconds)", verbose);
 }
-#undef LOG_PARAM
 
 TfLiteStatus BenchmarkModel::PrepareInputData() { return kTfLiteOk; }
 
diff --git a/tensorflow/lite/tools/benchmark/benchmark_params.h b/tensorflow/lite/tools/benchmark/benchmark_params.h
index 6fb903f7c26..6ed8f5afae7 100644
--- a/tensorflow/lite/tools/benchmark/benchmark_params.h
+++ b/tensorflow/lite/tools/benchmark/benchmark_params.h
@@ -22,11 +22,10 @@ namespace benchmark {
 using BenchmarkParam = tflite::tools::ToolParam;
 using BenchmarkParams = tflite::tools::ToolParams;
 
-#define LOG_BENCHMARK_PARAM(params, type, name, prefix, suffix, verbose) \
-  do {                                                                   \
-    TFLITE_MAY_LOG(INFO, verbose || params.HasValueSet<type>(name))      \
-        << prefix << params.Get<type>(name) << suffix;                   \
-  } while (0)
+// To be used in BenchmarkModel::LogParams() and its overrides as we assume
+// logging the parameters defined in BenchmarkModel as 'params_'.
+#define LOG_BENCHMARK_PARAM(type, name, description, verbose) \
+  LOG_TOOL_PARAM(params_, type, name, description, verbose)
 }  // namespace benchmark
 }  // namespace tflite
 #endif  // TENSORFLOW_LITE_TOOLS_BENCHMARK_BENCHMARK_PARAMS_H_
diff --git a/tensorflow/lite/tools/benchmark/benchmark_tflite_model.cc b/tensorflow/lite/tools/benchmark/benchmark_tflite_model.cc
index d70afe69a76..f816bbdedfe 100644
--- a/tensorflow/lite/tools/benchmark/benchmark_tflite_model.cc
+++ b/tensorflow/lite/tools/benchmark/benchmark_tflite_model.cc
@@ -352,38 +352,35 @@ std::vector<Flag> BenchmarkTfLiteModel::GetFlags() {
 
 void BenchmarkTfLiteModel::LogParams() {
   BenchmarkModel::LogParams();
-  TFLITE_LOG(INFO) << "Graph: [" << params_.Get<std::string>("graph") << "]";
-
   const bool verbose = params_.Get<bool>("verbose");
-
-#define LOG_PARAM(type, name, prefix, suffix) \
-  LOG_BENCHMARK_PARAM(params_, type, name, prefix, suffix, verbose)
-
-  LOG_PARAM(std::string, "input_layer", "Input layers: [", "]");
-  LOG_PARAM(std::string, "input_layer_shape", "Input shapes: [", "]");
-  LOG_PARAM(std::string, "input_layer_value_range", "Input value ranges: [",
-            "]");
-  LOG_PARAM(std::string, "input_layer_value_files", "Input value files: [",
-            "]");
+  // Always log the value of --graph.
+  LOG_BENCHMARK_PARAM(std::string, "graph", "Graph", /*verbose*/ true);
+  LOG_BENCHMARK_PARAM(std::string, "input_layer", "Input layers", verbose);
+  LOG_BENCHMARK_PARAM(std::string, "input_layer_shape", "Input shapes",
+                      verbose);
+  LOG_BENCHMARK_PARAM(std::string, "input_layer_value_range",
+                      "Input value ranges", verbose);
+  LOG_BENCHMARK_PARAM(std::string, "input_layer_value_files",
+                      "Input value files", verbose);
 
 #if defined(__ANDROID__)
-  LOG_PARAM(bool, "use_legacy_nnapi", "Use legacy nnapi: [", "]");
+  LOG_BENCHMARK_PARAM(bool, "use_legacy_nnapi", "Use legacy nnapi", verbose);
 #endif
-  LOG_PARAM(bool, "allow_fp16", "Allow fp16: [", "]");
-  LOG_PARAM(bool, "require_full_delegation", "Require full delegation: [", "]");
-  LOG_PARAM(bool, "enable_op_profiling", "Enable op profiling: [", "]");
-  LOG_PARAM(int32_t, "max_profiling_buffer_entries",
-            "Max profiling buffer entries: [", "]");
-  LOG_PARAM(std::string, "profiling_output_csv_file",
-            "CSV File to export profiling data to: [", "]");
-  LOG_PARAM(bool, "enable_platform_tracing", "Enable platform-wide tracing: [",
-            "]");
-
-#undef LOG_PARAM
+  LOG_BENCHMARK_PARAM(bool, "allow_fp16", "Allow fp16", verbose);
+  LOG_BENCHMARK_PARAM(bool, "require_full_delegation",
+                      "Require full delegation", verbose);
+  LOG_BENCHMARK_PARAM(bool, "enable_op_profiling", "Enable op profiling",
+                      verbose);
+  LOG_BENCHMARK_PARAM(int32_t, "max_profiling_buffer_entries",
+                      "Max profiling buffer entries", verbose);
+  LOG_BENCHMARK_PARAM(std::string, "profiling_output_csv_file",
+                      "CSV File to export profiling data to", verbose);
+  LOG_BENCHMARK_PARAM(bool, "enable_platform_tracing",
+                      "Enable platform-wide tracing", verbose);
 
   for (const auto& delegate_provider :
        tools::GetRegisteredDelegateProviders()) {
-    delegate_provider->LogParams(params_);
+    delegate_provider->LogParams(params_, verbose);
   }
 }
 
diff --git a/tensorflow/lite/tools/delegates/coreml_delegate_provider.cc b/tensorflow/lite/tools/delegates/coreml_delegate_provider.cc
index 7d88f04c8b4..4f270e3fa94 100644
--- a/tensorflow/lite/tools/delegates/coreml_delegate_provider.cc
+++ b/tensorflow/lite/tools/delegates/coreml_delegate_provider.cc
@@ -38,7 +38,7 @@ class CoreMlDelegateProvider : public DelegateProvider {
   }
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
 
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
 
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
 
@@ -62,10 +62,11 @@ std::vector<Flag> CoreMlDelegateProvider::CreateFlags(
 #endif
 }
 
-void CoreMlDelegateProvider::LogParams(const ToolParams& params) const {
+void CoreMlDelegateProvider::LogParams(const ToolParams& params,
+                                       bool verbose) const {
 #if defined(REAL_IPHONE_DEVICE)
-  TFLITE_LOG(INFO) << "Use Core ML : [" << params.Get<bool>("use_coreml")
-                   << "]";
+  LOG_TOOL_PARAM(params, bool, "use_coreml", "Use CoreML", verbose);
+  LOG_TOOL_PARAM(params, int, "coreml_version", "CoreML version", verbose);
 #endif
 }
 
diff --git a/tensorflow/lite/tools/delegates/default_execution_provider.cc b/tensorflow/lite/tools/delegates/default_execution_provider.cc
index f75fd791072..e9427ccccfa 100644
--- a/tensorflow/lite/tools/delegates/default_execution_provider.cc
+++ b/tensorflow/lite/tools/delegates/default_execution_provider.cc
@@ -33,7 +33,7 @@ class DefaultExecutionProvider : public DelegateProvider {
   }
 
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
   std::string GetName() const final { return "Default-NoDelegate"; }
 };
@@ -54,13 +54,14 @@ std::vector<Flag> DefaultExecutionProvider::CreateFlags(
   return flags;
 }
 
-void DefaultExecutionProvider::LogParams(const ToolParams& params) const {
-  TFLITE_LOG(INFO) << "#threads used for CPU inference: ["
-                   << params.Get<int32_t>("num_threads") << "]";
-  TFLITE_LOG(INFO) << "Max number of delegated partitions : ["
-                   << params.Get<int32_t>("max_delegated_partitions") << "]";
-  TFLITE_LOG(INFO) << "Min nodes per partition : ["
-                   << params.Get<int32_t>("min_nodes_per_partition") << "]";
+void DefaultExecutionProvider::LogParams(const ToolParams& params,
+                                         bool verbose) const {
+  LOG_TOOL_PARAM(params, int32_t, "num_threads",
+                 "#threads used for CPU inference", verbose);
+  LOG_TOOL_PARAM(params, int32_t, "max_delegated_partitions",
+                 "Max number of delegated partitions", verbose);
+  LOG_TOOL_PARAM(params, int32_t, "min_nodes_per_partition",
+                 "Min nodes per partition", verbose);
 }
 
 TfLiteDelegatePtr DefaultExecutionProvider::CreateTfLiteDelegate(
diff --git a/tensorflow/lite/tools/delegates/delegate_provider.h b/tensorflow/lite/tools/delegates/delegate_provider.h
index 91dd3b17b79..80bb2843f0b 100644
--- a/tensorflow/lite/tools/delegates/delegate_provider.h
+++ b/tensorflow/lite/tools/delegates/delegate_provider.h
@@ -40,8 +40,10 @@ class DelegateProvider {
   // 'params' whose value will be set to the corresponding runtime flag value.
   virtual std::vector<Flag> CreateFlags(ToolParams* params) const = 0;
 
-  // Log tool params.
-  virtual void LogParams(const ToolParams& params) const = 0;
+  // Log tool params. If 'verbose' is set to false, the param is going to be
+  // only logged if its value has been set, say via being parsed from
+  // commandline flags.
+  virtual void LogParams(const ToolParams& params, bool verbose) const = 0;
 
   // Create a TfLiteDelegate based on tool params.
   virtual TfLiteDelegatePtr CreateTfLiteDelegate(
diff --git a/tensorflow/lite/tools/delegates/external_delegate_provider.cc b/tensorflow/lite/tools/delegates/external_delegate_provider.cc
index 4f7dfeb8646..f61f90127a9 100644
--- a/tensorflow/lite/tools/delegates/external_delegate_provider.cc
+++ b/tensorflow/lite/tools/delegates/external_delegate_provider.cc
@@ -33,7 +33,6 @@ std::vector<std::string> SplitString(const std::string& str, char delimiter) {
   return tokens;
 }
 
-
 // External delegate provider used to dynamically load delegate libraries
 // Note: Assumes the lifetime of the provider exceeds the usage scope of
 // the generated delegates.
@@ -48,7 +47,7 @@ class ExternalDelegateProvider : public DelegateProvider {
 
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
 
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
 
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
 
@@ -63,16 +62,18 @@ std::vector<Flag> ExternalDelegateProvider::CreateFlags(
                               "The library path for the underlying external."),
       CreateFlag<std::string>(
           "external_delegate_options", params,
-          "Comma-separated options to be passed to the external delegate")};
+          "A list of comma-separated options to be passed to the external "
+          "delegate. Each option is a colon-separated key-value pair, e.g. "
+          "option_name:option_value.")};
   return flags;
 }
 
-void ExternalDelegateProvider::LogParams(const ToolParams& params) const {
-  TFLITE_LOG(INFO) << "External delegate path : ["
-                   << params.Get<std::string>("external_delegate_path") << "]";
-  TFLITE_LOG(INFO) << "External delegate options : ["
-                   << params.Get<std::string>("external_delegate_options")
-                   << "]";
+void ExternalDelegateProvider::LogParams(const ToolParams& params,
+                                         bool verbose) const {
+  LOG_TOOL_PARAM(params, std::string, "external_delegate_path",
+                 "External delegate path", verbose);
+  LOG_TOOL_PARAM(params, std::string, "external_delegate_options",
+                 "External delegate options", verbose);
 }
 
 TfLiteDelegatePtr ExternalDelegateProvider::CreateTfLiteDelegate(
diff --git a/tensorflow/lite/tools/delegates/gpu_delegate_provider.cc b/tensorflow/lite/tools/delegates/gpu_delegate_provider.cc
index 8dc46dcaaac..32e5e1b117f 100644
--- a/tensorflow/lite/tools/delegates/gpu_delegate_provider.cc
+++ b/tensorflow/lite/tools/delegates/gpu_delegate_provider.cc
@@ -51,7 +51,7 @@ class GpuDelegateProvider : public DelegateProvider {
 
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
 
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
 
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
 
@@ -86,21 +86,21 @@ std::vector<Flag> GpuDelegateProvider::CreateFlags(ToolParams* params) const {
   return flags;
 }
 
-void GpuDelegateProvider::LogParams(const ToolParams& params) const {
-  TFLITE_LOG(INFO) << "Use gpu : [" << params.Get<bool>("use_gpu") << "]";
+void GpuDelegateProvider::LogParams(const ToolParams& params,
+                                    bool verbose) const {
+  LOG_TOOL_PARAM(params, bool, "use_gpu", "Use gpu", verbose);
 #if defined(__ANDROID__) || defined(REAL_IPHONE_DEVICE)
-  TFLITE_LOG(INFO) << "Allow lower precision in gpu : ["
-                   << params.Get<bool>("gpu_precision_loss_allowed") << "]";
-  TFLITE_LOG(INFO) << "Enable running quant models in gpu : ["
-                   << params.Get<bool>("gpu_experimental_enable_quant") << "]";
+  LOG_TOOL_PARAM(params, bool, "gpu_precision_loss_allowed",
+                 "Allow lower precision in gpu", verbose);
+  LOG_TOOL_PARAM(params, bool, "gpu_experimental_enable_quant",
+                 "Enable running quant models in gpu", verbose);
 #endif
 #if defined(__ANDROID__)
-  TFLITE_LOG(INFO) << "GPU backend : ["
-                   << params.Get<std::string>("gpu_backend") << "]";
+  LOG_TOOL_PARAM(params, std::string, "gpu_backend", "GPU backend", verbose);
 #endif
 #if defined(REAL_IPHONE_DEVICE)
-  TFLITE_LOG(INFO) << "GPU delegate wait type : ["
-                   << params.Get<std::string>("gpu_wait_type") << "]";
+  LOG_TOOL_PARAM(params, std::string, "gpu_wait_type", "GPU delegate wait type",
+                 verbose);
 #endif
 }
 
diff --git a/tensorflow/lite/tools/delegates/hexagon_delegate_provider.cc b/tensorflow/lite/tools/delegates/hexagon_delegate_provider.cc
index 002246df6e4..1103a48465e 100644
--- a/tensorflow/lite/tools/delegates/hexagon_delegate_provider.cc
+++ b/tensorflow/lite/tools/delegates/hexagon_delegate_provider.cc
@@ -43,7 +43,7 @@ class HexagonDelegateProvider : public DelegateProvider {
 
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
 
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
 
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
 
@@ -67,14 +67,14 @@ std::vector<Flag> HexagonDelegateProvider::CreateFlags(
 #endif
 }
 
-void HexagonDelegateProvider::LogParams(const ToolParams& params) const {
+void HexagonDelegateProvider::LogParams(const ToolParams& params,
+                                        bool verbose) const {
 #if defined(TFLITE_ENABLE_HEXAGON)
-  TFLITE_LOG(INFO) << "Use Hexagon : [" << params.Get<bool>("use_hexagon")
-                   << "]";
-  TFLITE_LOG(INFO) << "Hexagon lib path : ["
-                   << params.Get<std::string>("hexagon_lib_path") << "]";
-  TFLITE_LOG(INFO) << "Hexagon Profiling : ["
-                   << params.Get<bool>("hexagon_profiling") << "]";
+  LOG_TOOL_PARAM(params, bool, "use_hexagon", "Use Hexagon", verbose);
+  LOG_TOOL_PARAM(params, std::string, "hexagon_lib_path", "Hexagon lib path",
+                 verbose);
+  LOG_TOOL_PARAM(params, bool, "hexagon_profiling", "Hexagon profiling",
+                 verbose);
 #endif
 }
 
diff --git a/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc b/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc
index b673c8b7bbb..feede598fb7 100644
--- a/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc
+++ b/tensorflow/lite/tools/delegates/nnapi_delegate_provider.cc
@@ -43,7 +43,7 @@ class NnapiDelegateProvider : public DelegateProvider {
 
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
 
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
 
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
 
@@ -76,38 +76,30 @@ std::vector<Flag> NnapiDelegateProvider::CreateFlags(ToolParams* params) const {
   return flags;
 }
 
-void NnapiDelegateProvider::LogParams(const ToolParams& params) const {
+void NnapiDelegateProvider::LogParams(const ToolParams& params,
+                                      bool verbose) const {
 #if defined(__ANDROID__)
-  TFLITE_LOG(INFO) << "Use nnapi : [" << params.Get<bool>("use_nnapi") << "]";
-  if (params.Get<bool>("use_nnapi")) {
-    if (!params.Get<std::string>("nnapi_execution_preference").empty()) {
-      TFLITE_LOG(INFO) << "nnapi execution preference: ["
-                       << params.Get<std::string>("nnapi_execution_preference")
-                       << "]";
-    }
-    if (!params.Get<std::string>("nnapi_execution_priority").empty()) {
-      TFLITE_LOG(INFO) << "model execution priority in nnapi: ["
-                       << params.Get<std::string>("nnapi_execution_priority")
-                       << "]";
-    }
-    std::string log_string = "nnapi accelerator name: [" +
-                             params.Get<std::string>("nnapi_accelerator_name") +
-                             "]";
-    std::string string_device_names_list = nnapi::GetStringDeviceNamesList();
-    // Print available devices when possible
-    if (!string_device_names_list.empty()) {
-      log_string += " (Available: " + string_device_names_list + ")";
-    }
-    TFLITE_LOG(INFO) << log_string;
-    if (params.Get<bool>("disable_nnapi_cpu")) {
-      TFLITE_LOG(INFO) << "disable_nnapi_cpu: ["
-                       << params.Get<bool>("disable_nnapi_cpu") << "]";
-    }
-    if (params.Get<bool>("nnapi_allow_fp16")) {
-      TFLITE_LOG(INFO) << "Allow fp16 in NNAPI: ["
-                       << params.Get<bool>("nnapi_allow_fp16") << "]";
-    }
+  LOG_TOOL_PARAM(params, bool, "use_nnapi", "Use NNAPI", verbose);
+  if (!params.Get<bool>("use_nnapi")) return;
+
+  LOG_TOOL_PARAM(params, std::string, "nnapi_execution_preference",
+                 "NNAPI execution preference", verbose);
+  LOG_TOOL_PARAM(params, std::string, "nnapi_execution_priority",
+                 "Model execution priority in nnapi", verbose);
+  LOG_TOOL_PARAM(params, std::string, "nnapi_accelerator_name",
+                 "NNAPI accelerator name", verbose);
+
+  std::string string_device_names_list = nnapi::GetStringDeviceNamesList();
+  // Print available devices when possible as it's informative.
+  if (!string_device_names_list.empty()) {
+    TFLITE_LOG(INFO) << "NNAPI accelerators available: ["
+                     << string_device_names_list << "]";
   }
+
+  LOG_TOOL_PARAM(params, bool, "disable_nnapi_cpu", "Disable NNAPI cpu",
+                 verbose);
+  LOG_TOOL_PARAM(params, bool, "nnapi_allow_fp16", "Allow fp16 in NNAPI",
+                 verbose);
 #endif
 }
 
diff --git a/tensorflow/lite/tools/delegates/xnnpack_delegate_provider.cc b/tensorflow/lite/tools/delegates/xnnpack_delegate_provider.cc
index e9bdfb4b533..4661f44463d 100644
--- a/tensorflow/lite/tools/delegates/xnnpack_delegate_provider.cc
+++ b/tensorflow/lite/tools/delegates/xnnpack_delegate_provider.cc
@@ -28,7 +28,7 @@ class XnnpackDelegateProvider : public DelegateProvider {
 
   std::vector<Flag> CreateFlags(ToolParams* params) const final;
 
-  void LogParams(const ToolParams& params) const final;
+  void LogParams(const ToolParams& params, bool verbose) const final;
 
   TfLiteDelegatePtr CreateTfLiteDelegate(const ToolParams& params) const final;
 
@@ -43,9 +43,9 @@ std::vector<Flag> XnnpackDelegateProvider::CreateFlags(
   return flags;
 }
 
-void XnnpackDelegateProvider::LogParams(const ToolParams& params) const {
-  TFLITE_LOG(INFO) << "Use xnnpack : [" << params.Get<bool>("use_xnnpack")
-                   << "]";
+void XnnpackDelegateProvider::LogParams(const ToolParams& params,
+                                        bool verbose) const {
+  LOG_TOOL_PARAM(params, bool, "use_xnnpack", "Use xnnpack", verbose);
 }
 
 TfLiteDelegatePtr XnnpackDelegateProvider::CreateTfLiteDelegate(
diff --git a/tensorflow/lite/tools/tool_params.h b/tensorflow/lite/tools/tool_params.h
index c70fc18046f..b3e6975e7dc 100644
--- a/tensorflow/lite/tools/tool_params.h
+++ b/tensorflow/lite/tools/tool_params.h
@@ -143,6 +143,12 @@ class ToolParams {
   std::unordered_map<std::string, std::unique_ptr<ToolParam>> params_;
 };
 
+#define LOG_TOOL_PARAM(params, type, name, description, verbose)      \
+  do {                                                                \
+    TFLITE_MAY_LOG(INFO, (verbose) || params.HasValueSet<type>(name)) \
+        << description << ": [" << params.Get<type>(name) << "]";     \
+  } while (0)
+
 }  // namespace tools
 }  // namespace tflite
 #endif  // TENSORFLOW_LITE_TOOLS_TOOL_PARAMS_H_