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

sdanilov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 61c8cb26e6 IGNITE-17786 Add --verbose option to all commands (#1249)
61c8cb26e6 is described below

commit 61c8cb26e6d02c06dfb0ade9d4bf032503e3d2d1
Author: Vadim Pakhnushev <[email protected]>
AuthorDate: Wed Nov 2 08:42:32 2022 +0300

    IGNITE-17786 Add --verbose option to all commands (#1249)
---
 .../internal/cli/call/cluster/ClusterInitCall.java |   5 +-
 .../cli/call/cluster/status/ClusterStatusCall.java |   4 +-
 .../call/configuration/ClusterConfigShowCall.java  |   5 +-
 .../configuration/ClusterConfigUpdateCall.java     |   5 +-
 .../cli/call/configuration/NodeConfigShowCall.java |   5 +-
 .../call/configuration/NodeConfigUpdateCall.java   |   5 +-
 .../cli/call/node/status/NodeStatusCall.java       |   4 +-
 .../cli/call/node/version/NodeVersionCall.java     |   4 +-
 .../ignite/internal/cli/commands/BaseCommand.java  |   3 +
 .../commands/cliconfig/CliConfigGetCommand.java    |   1 +
 .../cliconfig/CliConfigGetReplCommand.java         |   1 +
 .../commands/cliconfig/CliConfigSetCommand.java    |   1 +
 .../cliconfig/CliConfigSetReplCommand.java         |   1 +
 .../commands/cliconfig/CliConfigShowCommand.java   |   1 +
 .../cliconfig/CliConfigShowReplCommand.java        |   1 +
 .../profile/CliConfigProfileActivateCommand.java   |   1 +
 .../profile/CliConfigProfileCreateCommand.java     |   1 +
 .../profile/CliConfigProfileListCommand.java       |   1 +
 .../profile/CliConfigProfileShowCommand.java       |   1 +
 .../cluster/config/ClusterConfigShowCommand.java   |   1 +
 .../config/ClusterConfigShowReplCommand.java       |   1 +
 .../cluster/config/ClusterConfigUpdateCommand.java |   1 +
 .../config/ClusterConfigUpdateReplCommand.java     |   1 +
 .../commands/cluster/init/ClusterInitCommand.java  |   1 +
 .../cluster/init/ClusterInitReplCommand.java       |   1 +
 .../cluster/status/ClusterStatusCommand.java       |   1 +
 .../cluster/status/ClusterStatusReplCommand.java   |   1 +
 .../cli/commands/connect/ConnectCommand.java       |   1 +
 .../cli/commands/connect/DisconnectCommand.java    |   1 +
 .../node/config/NodeConfigShowCommand.java         |   1 +
 .../node/config/NodeConfigShowReplCommand.java     |   1 +
 .../node/config/NodeConfigUpdateCommand.java       |   1 +
 .../node/config/NodeConfigUpdateReplCommand.java   |   1 +
 .../node/metric/NodeMetricDisableCommand.java      |   1 +
 .../node/metric/NodeMetricDisableReplCommand.java  |   1 +
 .../node/metric/NodeMetricEnableCommand.java       |   1 +
 .../node/metric/NodeMetricEnableReplCommand.java   |   1 +
 .../node/metric/NodeMetricListCommand.java         |   1 +
 .../commands/node/status/NodeStatusCommand.java    |   1 +
 .../node/status/NodeStatusReplCommand.java         |   1 +
 .../commands/node/version/NodeVersionCommand.java  |   1 +
 .../node/version/NodeVersionReplCommand.java       |   1 +
 .../internal/cli/commands/sql/SqlCommand.java      |   1 +
 .../internal/cli/commands/sql/SqlReplCommand.java  |   2 +
 .../commands/topology/LogicalTopologyCommand.java  |   1 +
 .../commands/topology/PhysicalTopologyCommand.java |   1 +
 .../internal/cli/config/ini/IniConfigManager.java  |   6 +-
 .../cli/core/call/CallExecutionPipeline.java       |  31 ++++-
 .../ClusterNotInitializedExceptionHandler.java     |   1 +
 .../handler/IgniteCliApiExceptionHandler.java      |   6 +-
 .../exception/handler/SqlExceptionHandler.java     |   6 +-
 .../cli/core/flow/builder/FlowBuilder.java         |   8 ++
 .../cli/core/flow/builder/FlowBuilderImpl.java     |  27 ++++-
 .../cli/core/style/component/ErrorUiComponent.java |  39 ++++++-
 .../ignite/internal/cli/logger/CliLoggers.java     | 126 +++++++++++++++++++++
 .../ignite/internal/cli/logger/HttpLogging.java    |  64 +++++++++++
 .../internal/cli/commands/flow/FlowTest.java       |  36 +++++-
 .../ignite/internal/cli/commands/flow/StrCall.java |   7 +-
 .../internal/cli/commands/flow/StrCallInput.java   |  28 -----
 .../internal/cli/core/call/PipelineTest.java       |  52 +++++++++
 .../flow => core/call}/ThrowingStrCall.java        |  11 +-
 .../exception}/TestExceptionHandler.java           |  13 ++-
 .../internal/cli/logger/HttpLoggingTest.java       |  63 +++++++++++
 63 files changed, 510 insertions(+), 92 deletions(-)

diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
index cc7efae316..456e7ee024 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
@@ -22,7 +22,6 @@ import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterManagementApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
 import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.InitCommand;
@@ -50,8 +49,6 @@ public class ClusterInitCall implements 
Call<ClusterInitCallInput, String> {
     }
 
     private ClusterManagementApi createApiClient(ClusterInitCallInput input) {
-        ApiClient client = Configuration.getDefaultApiClient();
-        client.setBasePath(input.getClusterUrl());
-        return new ClusterManagementApi(client);
+        return new 
ClusterManagementApi(Configuration.getDefaultApiClient().setBasePath(input.getClusterUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
index b1e624765b..dbcdce5e6c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
@@ -26,8 +26,8 @@ import 
org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterManagementApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
+import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.ClusterState;
 
 /**
@@ -72,6 +72,6 @@ public class ClusterStatusCall implements Call<UrlCallInput, 
ClusterStatus> {
     }
 
     private ClusterState fetchClusterState(String url) throws ApiException {
-        return new ClusterManagementApi(new 
ApiClient().setBasePath(url)).clusterState();
+        return new 
ClusterManagementApi(Configuration.getDefaultApiClient().setBasePath(url)).clusterState();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
index a88dda16a3..80cadbb91c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
@@ -22,7 +22,6 @@ import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterConfigurationApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
 import org.apache.ignite.rest.client.invoker.Configuration;
 
@@ -51,8 +50,6 @@ public class ClusterConfigShowCall implements 
Call<ClusterConfigShowCallInput, J
     }
 
     private ClusterConfigurationApi createApiClient(ClusterConfigShowCallInput 
input) {
-        ApiClient client = Configuration.getDefaultApiClient();
-        client.setBasePath(input.getClusterUrl());
-        return new ClusterConfigurationApi(client);
+        return new 
ClusterConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getClusterUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
index c48f06327d..5e6b9b7453 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
@@ -22,7 +22,6 @@ import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterConfigurationApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
 import org.apache.ignite.rest.client.invoker.Configuration;
 
@@ -50,8 +49,6 @@ public class ClusterConfigUpdateCall implements 
Call<ClusterConfigUpdateCallInpu
     }
 
     private ClusterConfigurationApi 
createApiClient(ClusterConfigUpdateCallInput input) {
-        ApiClient client = Configuration.getDefaultApiClient();
-        client.setBasePath(input.getClusterUrl());
-        return new ClusterConfigurationApi(client);
+        return new 
ClusterConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getClusterUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
index 505c065d6b..bc7f0e9d8d 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
@@ -22,7 +22,6 @@ import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeConfigurationApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
 import org.apache.ignite.rest.client.invoker.Configuration;
 
@@ -51,8 +50,6 @@ public class NodeConfigShowCall implements 
Call<NodeConfigShowCallInput, JsonStr
     }
 
     private NodeConfigurationApi createApiClient(NodeConfigShowCallInput 
input) {
-        ApiClient client = Configuration.getDefaultApiClient();
-        client.setBasePath(input.getNodeUrl());
-        return new NodeConfigurationApi(client);
+        return new 
NodeConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getNodeUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
index 94d4b5ccc2..d4a20d1969 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
@@ -22,7 +22,6 @@ import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeConfigurationApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
 import org.apache.ignite.rest.client.invoker.Configuration;
 
@@ -50,8 +49,6 @@ public class NodeConfigUpdateCall implements 
Call<NodeConfigUpdateCallInput, Str
     }
 
     private NodeConfigurationApi createApiClient(NodeConfigUpdateCallInput 
input) {
-        ApiClient client = Configuration.getDefaultApiClient();
-        client.setBasePath(input.getNodeUrl());
-        return new NodeConfigurationApi(client);
+        return new 
NodeConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getNodeUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
index 7e179d7f93..9da964f5d4 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
@@ -24,8 +24,8 @@ import 
org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeManagementApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
+import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.NodeState;
 
 /**
@@ -51,6 +51,6 @@ public class NodeStatusCall implements Call<UrlCallInput, 
NodeStatus> {
     }
 
     private NodeState fetchNodeState(String url) throws ApiException {
-        return new NodeManagementApi(new 
ApiClient().setBasePath(url)).nodeState();
+        return new 
NodeManagementApi(Configuration.getDefaultApiClient().setBasePath(url)).nodeState();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
index 619f86ba70..4ffb932121 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
@@ -24,8 +24,8 @@ import 
org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeManagementApi;
-import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
+import org.apache.ignite.rest.client.invoker.Configuration;
 
 /** Call to get node version. */
 @Singleton
@@ -40,6 +40,6 @@ public class NodeVersionCall implements Call<UrlCallInput, 
String> {
     }
 
     private String getNodeVersion(String url) throws ApiException {
-        return new NodeManagementApi(new 
ApiClient().setBasePath(url)).nodeVersion();
+        return new 
NodeManagementApi(Configuration.getDefaultApiClient().setBasePath(url)).nodeVersion();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/BaseCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/BaseCommand.java
index f375068158..e3e919cef9 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/BaseCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/BaseCommand.java
@@ -29,6 +29,9 @@ public abstract class BaseCommand {
     @Option(names = {"-h", "--help"}, usageHelp = true, description = "Show 
this help message and exit.")
     protected boolean usageHelpRequested;
 
+    @Option(names = {"-v", "--verbose"}, description = "Show additional 
information.")
+    protected boolean verbose;
+
     @Spec
     protected CommandSpec spec;
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommand.java
index c5e213203f..1250fd62b6 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommand.java
@@ -50,6 +50,7 @@ public class CliConfigGetCommand extends BaseCommand 
implements Callable<Integer
                         .profileName(profileName.getProfileName())::build)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetReplCommand.java
index e975668c5a..c164b2a600 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetReplCommand.java
@@ -44,6 +44,7 @@ public class CliConfigGetReplCommand extends BaseCommand 
implements Callable<Int
                         .key(key)::build)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetCommand.java
index 6849fa4aef..0425cb528e 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetCommand.java
@@ -51,6 +51,7 @@ public class CliConfigSetCommand extends BaseCommand 
implements Callable<Integer
                         .profileName(profileName.getProfileName())::build)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetReplCommand.java
index d0f3f7a03b..cc51a5da31 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigSetReplCommand.java
@@ -45,6 +45,7 @@ public class CliConfigSetReplCommand extends BaseCommand 
implements Callable<Int
                         .parameters(parameters)::build)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowCommand.java
index 41a6314903..a6dd786cee 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowCommand.java
@@ -46,6 +46,7 @@ public class CliConfigShowCommand extends BaseCommand 
implements Callable<Intege
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new ProfileDecorator())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowReplCommand.java
index 9a40f49fbd..a10b012d3e 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigShowReplCommand.java
@@ -41,6 +41,7 @@ public class CliConfigShowReplCommand extends BaseCommand 
implements Callable<In
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new ProfileDecorator())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileActivateCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileActivateCommand.java
index 9784d76391..a5b5feeb88 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileActivateCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileActivateCommand.java
@@ -43,6 +43,7 @@ public class CliConfigProfileActivateCommand extends 
BaseCommand implements Call
                 .inputProvider(() -> new StringCallInput(profileName))
                 .errOutput(spec.commandLine().getErr())
                 .output(spec.commandLine().getOut())
+                .verbose(verbose)
                 .build().runPipeline();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileCreateCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileCreateCommand.java
index 057497a476..594120d149 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileCreateCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileCreateCommand.java
@@ -53,6 +53,7 @@ public class CliConfigProfileCreateCommand extends 
BaseCommand implements Callab
                         .activate(activate)::build)
                 .errOutput(spec.commandLine().getErr())
                 .output(spec.commandLine().getOut())
+                .verbose(verbose)
                 .build().runPipeline();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileListCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileListCommand.java
index 93300b9494..f18dda2c1b 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileListCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileListCommand.java
@@ -42,6 +42,7 @@ public class CliConfigProfileListCommand extends BaseCommand 
implements Callable
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new ProfileListDecorator())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileShowCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileShowCommand.java
index e5ef52f884..b1f21bb8a3 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileShowCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/profile/CliConfigProfileShowCommand.java
@@ -40,6 +40,7 @@ public class CliConfigProfileShowCommand extends BaseCommand 
implements Callable
                 .inputProvider(EmptyCallInput::new)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowCommand.java
index 6c80a5df16..6f02941981 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowCommand.java
@@ -59,6 +59,7 @@ public class ClusterConfigShowCommand extends BaseCommand 
implements Callable<In
                 .exceptionHandler(new ClusterNotInitializedExceptionHandler(
                         "Cannot show cluster config", "ignite cluster init"
                 ))
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowReplCommand.java
index e105bb0527..2fb643747c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigShowReplCommand.java
@@ -58,6 +58,7 @@ public class ClusterConfigShowReplCommand extends BaseCommand 
implements Runnabl
                 .map(this::configShowCallInput)
                 .then(Flows.fromCall(call))
                 .exceptionHandler(new 
ClusterNotInitializedExceptionHandler("Cannot show cluster config", "cluster 
init"))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateCommand.java
index fc4e0892a3..1b41c0629c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateCommand.java
@@ -55,6 +55,7 @@ public class ClusterConfigUpdateCommand extends BaseCommand 
implements Callable<
                 .exceptionHandler(new ClusterNotInitializedExceptionHandler(
                         "Cannot update cluster config", "ignite cluster init"
                 ))
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateReplCommand.java
index 516078d64e..82218cf540 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/config/ClusterConfigUpdateReplCommand.java
@@ -55,6 +55,7 @@ public class ClusterConfigUpdateReplCommand extends 
BaseCommand implements Runna
                 .map(this::configUpdateCallInput)
                 .then(Flows.fromCall(call))
                 .exceptionHandler(new 
ClusterNotInitializedExceptionHandler("Cannot update cluster config", "cluster 
init"))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitCommand.java
index 9dd25accb2..045a69ec46 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitCommand.java
@@ -49,6 +49,7 @@ public class ClusterInitCommand extends BaseCommand 
implements Callable<Integer>
                 .inputProvider(this::buildCallInput)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitReplCommand.java
index 43e6b70bc3..26bcec55a9 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/init/ClusterInitReplCommand.java
@@ -52,6 +52,7 @@ public class ClusterInitReplCommand extends BaseCommand 
implements Runnable {
         question.askQuestionIfNotConnected(clusterUrl.getClusterUrl())
                 .map(this::buildCallInput)
                 .then(Flows.fromCall(call))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusCommand.java
index 74f51fa33c..928638f754 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusCommand.java
@@ -50,6 +50,7 @@ public class ClusterStatusCommand extends BaseCommand 
implements Callable<Intege
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new ClusterStatusDecorator())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusReplCommand.java
index 7aab07bf24..6d86df83ed 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cluster/status/ClusterStatusReplCommand.java
@@ -48,6 +48,7 @@ public class ClusterStatusReplCommand extends BaseCommand 
implements Runnable {
         question.askQuestionIfNotConnected(clusterUrl.getClusterUrl())
                 .map(UrlCallInput::new)
                 .then(Flows.fromCall(call))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/ConnectCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/ConnectCommand.java
index 38aa97c2c7..536b5e872a 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/ConnectCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/ConnectCommand.java
@@ -49,6 +49,7 @@ public class ConnectCommand extends BaseCommand implements 
Runnable {
                 .inputProvider(() -> new ConnectCallInput(nodeUrl.toString()))
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/DisconnectCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/DisconnectCommand.java
index 4b78de3146..4b35ae269b 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/DisconnectCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/connect/DisconnectCommand.java
@@ -39,6 +39,7 @@ public class DisconnectCommand extends BaseCommand implements 
Runnable {
                 .inputProvider(EmptyCallInput::new)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowCommand.java
index 039fb9a8a1..27c66b620f 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowCommand.java
@@ -53,6 +53,7 @@ public class NodeConfigShowCommand extends BaseCommand 
implements Callable<Integ
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new JsonDecorator())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowReplCommand.java
index 5e24c35a3f..7d876f0c98 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigShowReplCommand.java
@@ -53,6 +53,7 @@ public class NodeConfigShowReplCommand extends BaseCommand 
implements Runnable {
         question.askQuestionIfNotConnected(nodeUrl.getNodeUrl())
                 .map(this::nodeConfigShowCallInput)
                 .then(Flows.fromCall(call))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateCommand.java
index 6088c80764..bc2ba03f68 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateCommand.java
@@ -51,6 +51,7 @@ public class NodeConfigUpdateCommand extends BaseCommand 
implements Callable<Int
                 .inputProvider(this::buildCallInput)
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateReplCommand.java
index 2fcc176d18..03dc2635d4 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/config/NodeConfigUpdateReplCommand.java
@@ -53,6 +53,7 @@ public class NodeConfigUpdateReplCommand extends BaseCommand 
implements Runnable
         question.askQuestionIfNotConnected(nodeUrl.getNodeUrl())
                 .map(this::nodeConfigUpdateCallInput)
                 .then(Flows.fromCall(call))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableCommand.java
index 7b69bad6a6..fdefe92bef 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableCommand.java
@@ -47,6 +47,7 @@ public class NodeMetricDisableCommand extends BaseCommand 
implements Callable<In
                 .inputProvider(() -> 
metricSource.buildDisableCallInput(nodeUrl.getNodeUrl()))
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableReplCommand.java
index 3a4c97735f..c549fe4747 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricDisableReplCommand.java
@@ -48,6 +48,7 @@ public class NodeMetricDisableReplCommand extends BaseCommand 
implements Runnabl
         question.askQuestionIfNotConnected(nodeUrl.getNodeUrl())
                 .map(metricSource::buildDisableCallInput)
                 .then(Flows.fromCall(call))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableCommand.java
index 5ab69a5bed..efd67828d8 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableCommand.java
@@ -47,6 +47,7 @@ public class NodeMetricEnableCommand extends BaseCommand 
implements Callable<Int
                 .inputProvider(() -> 
metricSource.buildEnableCallInput(nodeUrl.getNodeUrl()))
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableReplCommand.java
index 09fd277774..290d2f929f 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricEnableReplCommand.java
@@ -48,6 +48,7 @@ public class NodeMetricEnableReplCommand extends BaseCommand 
implements Runnable
         question.askQuestionIfNotConnected(nodeUrl.getNodeUrl())
                 .map(metricSource::buildEnableCallInput)
                 .then(Flows.fromCall(call))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricListCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricListCommand.java
index 278c26a781..adfe1ce727 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricListCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/metric/NodeMetricListCommand.java
@@ -46,6 +46,7 @@ public class NodeMetricListCommand extends BaseCommand 
implements Callable<Integ
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new MetricListDecorator())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusCommand.java
index 0030c804e6..ae27e8ea99 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusCommand.java
@@ -48,6 +48,7 @@ public class NodeStatusCommand extends BaseCommand implements 
Callable<Integer>
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new NodeStatusDecorator())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusReplCommand.java
index 2beb29b0a4..fb1c202568 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/status/NodeStatusReplCommand.java
@@ -48,6 +48,7 @@ public class NodeStatusReplCommand extends BaseCommand 
implements Runnable {
         question.askQuestionIfNotConnected(nodeUrl.getNodeUrl())
                 .map(UrlCallInput::new)
                 .then(Flows.fromCall(call))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionCommand.java
index 14387ef28e..a2bd318e71 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionCommand.java
@@ -43,6 +43,7 @@ public class NodeVersionCommand extends BaseCommand 
implements Callable<Integer>
                 .inputProvider(() -> new UrlCallInput(nodeUrl.getNodeUrl()))
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionReplCommand.java
index 326080bea6..69006b9175 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/node/version/NodeVersionReplCommand.java
@@ -45,6 +45,7 @@ public class NodeVersionReplCommand extends BaseCommand 
implements Runnable {
         question.askQuestionIfNotConnected(nodeUrl.getNodeUrl())
                 .map(UrlCallInput::new)
                 .then(Flows.fromCall(nodeVersionCall))
+                .verbose(verbose)
                 .print()
                 .start();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlCommand.java
index 1a7b351b6c..f853c2b714 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlCommand.java
@@ -83,6 +83,7 @@ public class SqlCommand extends BaseCommand implements 
Callable<Integer> {
                     .output(spec.commandLine().getOut())
                     .errOutput(spec.commandLine().getErr())
                     .decorator(new SqlQueryResultDecorator(tableDecorator))
+                    .verbose(verbose)
                     .build().runPipeline();
         } catch (SQLException e) {
             return new 
SqlExceptionHandler().handle(ExceptionWriter.fromPrintWriter(spec.commandLine().getErr()),
 e);
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlReplCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlReplCommand.java
index 36938b5b6b..9dfde2f49f 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlReplCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/sql/SqlReplCommand.java
@@ -116,6 +116,7 @@ public class SqlReplCommand extends BaseCommand implements 
Runnable {
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(new SqlQueryResultDecorator(tableDecorator))
+                .verbose(verbose)
                 .build();
     }
 
@@ -127,6 +128,7 @@ public class SqlReplCommand extends BaseCommand implements 
Runnable {
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .exceptionHandlers(exceptionHandlers)
+                .verbose(verbose)
                 .build();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyCommand.java
index 0f09ee89be..ac3342edfe 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/LogicalTopologyCommand.java
@@ -58,6 +58,7 @@ public class LogicalTopologyCommand extends BaseCommand 
implements Callable<Inte
                 .exceptionHandler(new ClusterNotInitializedExceptionHandler(
                         "Cannot show logical topology", "ignite cluster init"
                 ))
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyCommand.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyCommand.java
index 0c6ed08a8d..4bf9fdf704 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyCommand.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/topology/PhysicalTopologyCommand.java
@@ -54,6 +54,7 @@ public class PhysicalTopologyCommand extends BaseCommand 
implements Callable<Int
                 .output(spec.commandLine().getOut())
                 .errOutput(spec.commandLine().getErr())
                 .decorator(topologyDecorator)
+                .verbose(verbose)
                 .build()
                 .runPipeline();
     }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
index 9d747a6e82..89070121ed 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java
@@ -29,14 +29,14 @@ import 
org.apache.ignite.internal.cli.config.ConfigInitializationException;
 import org.apache.ignite.internal.cli.config.ConfigManager;
 import org.apache.ignite.internal.cli.config.Profile;
 import org.apache.ignite.internal.cli.config.ProfileNotFoundException;
+import org.apache.ignite.internal.cli.logger.CliLoggers;
 import org.apache.ignite.internal.logger.IgniteLogger;
-import org.apache.ignite.internal.logger.Loggers;
 
 /**
  * Implementation of {@link ConfigManager} based on {@link IniFile}.
  */
 public class IniConfigManager implements ConfigManager {
-    private static final IgniteLogger log = 
Loggers.forClass(IniConfigManager.class);
+    private static final IgniteLogger LOG = 
CliLoggers.forClass(IniConfigManager.class);
 
     private static final String DEFAULT_PROFILE_NAME = "default";
 
@@ -55,7 +55,7 @@ public class IniConfigManager implements ConfigManager {
             configFile = new IniFile(file);
             findCurrentProfileName(configFile);
         } catch (IOException | NoSuchElementException e) {
-            log.warn("User config is corrupted or doesn't exist.", e);
+            LOG.warn("User config is corrupted or doesn't exist.", e);
             configFile = createDefaultConfig(file);
         }
         this.configFile = configFile;
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/call/CallExecutionPipeline.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/call/CallExecutionPipeline.java
index 05fb1109d2..5d265b0d87 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/call/CallExecutionPipeline.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/call/CallExecutionPipeline.java
@@ -28,6 +28,7 @@ import 
org.apache.ignite.internal.cli.core.exception.ExceptionHandlers;
 import org.apache.ignite.internal.cli.core.exception.ExceptionWriter;
 import 
org.apache.ignite.internal.cli.core.exception.handler.DefaultExceptionHandlers;
 import org.apache.ignite.internal.cli.decorators.DefaultDecorator;
+import org.apache.ignite.internal.cli.logger.CliLoggers;
 
 /**
  * Call execution pipeline.
@@ -54,18 +55,24 @@ public class CallExecutionPipeline<I extends CallInput, T> {
     /** Provider for call's input. */
     private final Supplier<I> inputProvider;
 
+    /** If {@code true}, debug output will be printed to console. */
+    private final boolean verbose;
+
     private CallExecutionPipeline(Call<I, T> call,
             PrintWriter output,
             PrintWriter errOutput,
             ExceptionHandlers exceptionHandlers,
             Decorator<T, TerminalOutput> decorator,
-            Supplier<I> inputProvider) {
+            Supplier<I> inputProvider,
+            boolean verbose
+    ) {
         this.call = call;
         this.output = output;
         this.exceptionHandlers = exceptionHandlers;
         this.errOutput = errOutput;
         this.decorator = decorator;
         this.inputProvider = inputProvider;
+        this.verbose = verbose;
     }
 
     /**
@@ -83,6 +90,19 @@ public class CallExecutionPipeline<I extends CallInput, T> {
      * @return exit code.
      */
     public int runPipeline() {
+        try {
+            if (verbose) {
+                CliLoggers.startOutputRedirect(errOutput);
+            }
+            return runPipelineInternal();
+        } finally {
+            if (verbose) {
+                CliLoggers.stopOutputRedirect();
+            }
+        }
+    }
+
+    private int runPipelineInternal() {
         I callInput = inputProvider.get();
 
         CallOutput<T> callOutput = call.execute(callInput);
@@ -113,6 +133,8 @@ public class CallExecutionPipeline<I extends CallInput, T> {
 
         private Decorator<T, TerminalOutput> decorator = new 
DefaultDecorator<>();
 
+        private boolean verbose;
+
         public CallExecutionPipelineBuilder(Call<I, T> call) {
             this.call = call;
         }
@@ -155,8 +177,13 @@ public class CallExecutionPipeline<I extends CallInput, T> 
{
             return this;
         }
 
+        public CallExecutionPipelineBuilder<I, T> verbose(boolean verbose) {
+            this.verbose = verbose;
+            return this;
+        }
+
         public CallExecutionPipeline<I, T> build() {
-            return new CallExecutionPipeline<>(call, output, errOutput, 
exceptionHandlers, decorator, inputProvider);
+            return new CallExecutionPipeline<>(call, output, errOutput, 
exceptionHandlers, decorator, inputProvider, verbose);
         }
 
         private static PrintWriter wrapOutputStream(OutputStream output) {
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ClusterNotInitializedExceptionHandler.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ClusterNotInitializedExceptionHandler.java
index 1e53c4f40a..459a9f15a8 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ClusterNotInitializedExceptionHandler.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ClusterNotInitializedExceptionHandler.java
@@ -52,6 +52,7 @@ public class ClusterNotInitializedExceptionHandler extends 
IgniteCliApiException
                                 .header(header)
                                 .details("Probably, you have not initialized 
the cluster, try to run %s command",
                                         UiElements.command(command))
+                                .verbose(apiException.getMessage())
                                 .build()
                                 .render()
                 );
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/IgniteCliApiExceptionHandler.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/IgniteCliApiExceptionHandler.java
index 3a090cead9..79b15f6a0c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/IgniteCliApiExceptionHandler.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/IgniteCliApiExceptionHandler.java
@@ -53,11 +53,13 @@ public class IgniteCliApiExceptionHandler implements 
ExceptionHandler<IgniteCliA
             Throwable apiCause = cause.getCause();
             if (apiCause instanceof UnknownHostException) {
                 errorComponentBuilder
-                        .header("Unknown host: %s", 
UiElements.url(e.getUrl()));
+                        .header("Unknown host: %s", UiElements.url(e.getUrl()))
+                        .verbose(apiCause.getMessage());
             } else if (apiCause instanceof ConnectException) {
                 errorComponentBuilder
                         .header("Node unavailable")
-                        .details("Could not connect to node with URL %s", 
UiElements.url(e.getUrl()));
+                        .details("Could not connect to node with URL %s", 
UiElements.url(e.getUrl()))
+                        .verbose(apiCause.getMessage());
             } else if (apiCause != null) {
                 errorComponentBuilder.header(apiCause.getMessage());
             } else {
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/SqlExceptionHandler.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/SqlExceptionHandler.java
index 03716e334b..b5bb181661 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/SqlExceptionHandler.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/SqlExceptionHandler.java
@@ -102,16 +102,16 @@ public class SqlExceptionHandler implements 
ExceptionHandler<SQLException> {
             case SqlStateCode.CONNECTION_FAILURE:
             case SqlStateCode.CONNECTION_CLOSED:
             case SqlStateCode.CONNECTION_REJECTED:
-                errorComponentBuilder.header(CONNECTION_BROKE_MESSAGE);
+                
errorComponentBuilder.header(CONNECTION_BROKE_MESSAGE).verbose(ErrorGroup.extractCauseMessage(e.getMessage()));
                 break;
             case SqlStateCode.PARSING_EXCEPTION:
                 
errorComponentBuilder.header(PARSING_ERROR_MESSAGE).details(ErrorGroup.extractCauseMessage(e.getMessage()));
                 break;
             case SqlStateCode.INVALID_PARAMETER_VALUE:
-                errorComponentBuilder.header(INVALID_PARAMETER_MESSAGE);
+                
errorComponentBuilder.header(INVALID_PARAMETER_MESSAGE).verbose(ErrorGroup.extractCauseMessage(e.getMessage()));
                 break;
             case SqlStateCode.CLIENT_CONNECTION_FAILED:
-                errorComponentBuilder.header(CLIENT_CONNECTION_FAILED_MESSAGE);
+                
errorComponentBuilder.header(CLIENT_CONNECTION_FAILED_MESSAGE).verbose(ErrorGroup.extractCauseMessage(e.getMessage()));
                 break;
             default:
                 LOG.error("Unrecognized error", e);
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilder.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilder.java
index f55c9d7099..a51dfb0295 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilder.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilder.java
@@ -102,6 +102,14 @@ public interface FlowBuilder<I, O>  {
      */
     FlowBuilder<I, O> exceptionHandler(ExceptionHandler<?> exceptionHandler);
 
+    /**
+     * Adds verbose output from debug log to the output.
+     *
+     * @param verbose If @{code true}, flow execution will print debug logs.
+     * @return Builder instance.
+     */
+    FlowBuilder<I, O> verbose(boolean verbose);
+
     /**
      * Appends print operation which will print the result of the current flow 
using provided {@code decorator} or call the exception
      * handler.
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilderImpl.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilderImpl.java
index ab66313ef3..b4cdc8bc20 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilderImpl.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/flow/builder/FlowBuilderImpl.java
@@ -35,6 +35,7 @@ import 
org.apache.ignite.internal.cli.core.flow.question.QuestionAnswer;
 import org.apache.ignite.internal.cli.core.flow.question.QuestionAskerFactory;
 import 
org.apache.ignite.internal.cli.core.repl.context.CommandLineContextProvider;
 import org.apache.ignite.internal.cli.decorators.DefaultDecoratorRegistry;
+import org.apache.ignite.internal.cli.logger.CliLoggers;
 
 /**
  * Implementation of {@link FlowBuilder}.
@@ -46,9 +47,10 @@ public class FlowBuilderImpl<I, O> implements FlowBuilder<I, 
O> {
     private final Flow<I, O> flow;
     private final ExceptionHandlers exceptionHandlers;
     private final DecoratorRegistry decoratorRegistry;
+    private boolean verbose;
 
     FlowBuilderImpl(Flow<I, O> flow) {
-        this(flow, new DefaultExceptionHandlers(), new 
DefaultDecoratorRegistry());
+        this(flow, new DefaultExceptionHandlers(), new 
DefaultDecoratorRegistry(), false);
     }
 
     /**
@@ -57,16 +59,18 @@ public class FlowBuilderImpl<I, O> implements 
FlowBuilder<I, O> {
      * @param flow flow instance.
      * @param exceptionHandlers exception handlers.
      * @param decoratorRegistry decorator registry.
+     * @param verbose if @{code true}, flow execution will print debug logs
      */
-    private FlowBuilderImpl(Flow<I, O> flow, ExceptionHandlers 
exceptionHandlers, DecoratorRegistry decoratorRegistry) {
+    private FlowBuilderImpl(Flow<I, O> flow, ExceptionHandlers 
exceptionHandlers, DecoratorRegistry decoratorRegistry, boolean verbose) {
         this.flow = flow;
         this.exceptionHandlers = exceptionHandlers;
         this.decoratorRegistry = decoratorRegistry;
+        this.verbose = verbose;
     }
 
     @Override
     public <OT> FlowBuilder<I, OT> then(Flow<O, OT> flow) {
-        return new FlowBuilderImpl<>(this.flow.composite(flow), 
exceptionHandlers, decoratorRegistry);
+        return new FlowBuilderImpl<>(this.flow.composite(flow), 
exceptionHandlers, decoratorRegistry, verbose);
     }
 
     @Override
@@ -102,6 +106,12 @@ public class FlowBuilderImpl<I, O> implements 
FlowBuilder<I, O> {
         return this;
     }
 
+    @Override
+    public FlowBuilder<I, O> verbose(boolean verbose) {
+        this.verbose = verbose;
+        return this;
+    }
+
     @Override
     public FlowBuilder<I, O> print(Decorator<O, TerminalOutput> decorator) {
         return then(input -> printResult(input, type -> decorator));
@@ -133,7 +143,16 @@ public class FlowBuilderImpl<I, O> implements 
FlowBuilder<I, O> {
      * @return output flowable
      */
     private Flowable<O> run(Flowable<I> input) {
-        return flow.start(input);
+        try {
+            if (verbose) {
+                
CliLoggers.startOutputRedirect(CommandLineContextProvider.getContext().err());
+            }
+            return flow.start(input);
+        } finally {
+            if (verbose) {
+                CliLoggers.stopOutputRedirect();
+            }
+        }
     }
 
     /**
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/style/component/ErrorUiComponent.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/style/component/ErrorUiComponent.java
index 1aaffc5a67..c268118cb6 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/style/component/ErrorUiComponent.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/style/component/ErrorUiComponent.java
@@ -25,6 +25,7 @@ import 
org.apache.ignite.internal.cli.core.style.AnsiStringSupport.Color;
 import org.apache.ignite.internal.cli.core.style.AnsiStringSupport.Style;
 import org.apache.ignite.internal.cli.core.style.element.UiElement;
 import org.apache.ignite.internal.cli.core.style.element.UiString;
+import org.apache.ignite.internal.cli.logger.CliLoggers;
 
 /**
  * UI component that represent any error message.
@@ -38,6 +39,10 @@ public class ErrorUiComponent implements UiComponent {
 
     private final UiElement[] detailsUiElements;
 
+    private final String verbose;
+
+    private final UiElement[] verboseUiElements;
+
     private final UUID traceId;
 
     private final String errorCode;
@@ -45,12 +50,15 @@ public class ErrorUiComponent implements UiComponent {
     private ErrorUiComponent(
             String header, UiElement[] headerUiElements,
             String details, UiElement[] detailsUiElements,
+            String verbose, UiElement[] verboseUiElements,
             UUID traceId,
             String errorCode) {
         this.header = header;
         this.headerUiElements = headerUiElements;
         this.details = details;
         this.detailsUiElements = detailsUiElements;
+        this.verbose = verbose;
+        this.verboseUiElements = verboseUiElements;
         this.traceId = traceId;
         this.errorCode = errorCode;
     }
@@ -80,6 +88,7 @@ public class ErrorUiComponent implements UiComponent {
                         + traceDetails()
                         + 
fg(Color.RED).with(Style.BOLD).mark(ansi(UiString.format(header, 
headerUiElements)))
                         + (details == null ? "" : System.lineSeparator() + 
UiString.format(details, detailsUiElements))
+                        + verboseDetails()
         );
     }
 
@@ -87,6 +96,10 @@ public class ErrorUiComponent implements UiComponent {
         return traceId == null ? "" : fg(Color.GRAY).mark(" Trace ID: " + 
traceId + System.lineSeparator());
     }
 
+    private String verboseDetails() {
+        return verbose == null || !CliLoggers.isVerbose() ? "" : 
System.lineSeparator() + UiString.format(verbose, verboseUiElements);
+    }
+
     /** Builder. */
     public static class ErrorComponentBuilder {
         private String header;
@@ -95,7 +108,11 @@ public class ErrorUiComponent implements UiComponent {
 
         private String details;
 
-        private UiElement[] detailsUiElement;
+        private UiElement[] detailsUiElements;
+
+        private String verbose;
+
+        private UiElement[] verboseUiElements;
 
         private UUID traceId;
 
@@ -111,22 +128,38 @@ public class ErrorUiComponent implements UiComponent {
         /** Sets details. */
         public ErrorComponentBuilder details(String details, UiElement... 
uiElements) {
             this.details = details;
-            this.detailsUiElement = uiElements;
+            this.detailsUiElements = uiElements;
+            return this;
+        }
+
+        /** Sets verbose. */
+        public ErrorComponentBuilder verbose(String verbose, UiElement... 
uiElements) {
+            this.verbose = verbose;
+            this.verboseUiElements = uiElements;
             return this;
         }
 
+        /** Sets trace id. */
         public ErrorComponentBuilder traceId(UUID traceId) {
             this.traceId = traceId;
             return this;
         }
 
+        /** Sets error code. */
         public ErrorComponentBuilder errorCode(String errorCode) {
             this.errorCode = errorCode;
             return this;
         }
 
+        /** Builds the component. */
         public ErrorUiComponent build() {
-            return new ErrorUiComponent(header, headerUiElements, details, 
detailsUiElement, traceId, errorCode);
+            return new ErrorUiComponent(
+                    header, headerUiElements,
+                    details, detailsUiElements,
+                    verbose, verboseUiElements,
+                    traceId,
+                    errorCode
+            );
         }
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java
new file mode 100644
index 0000000000..ce393abb15
--- /dev/null
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.cli.logger;
+
+import java.io.PrintWriter;
+import java.lang.System.Logger;
+import java.util.ResourceBundle;
+import org.apache.ignite.internal.logger.IgniteLogger;
+import org.apache.ignite.internal.logger.Loggers;
+import org.apache.ignite.lang.LoggerFactory;
+import org.apache.ignite.rest.client.invoker.Configuration;
+
+/**
+ * This class is used when verbose output for command is needed. Instances of 
loggers created by the {@link CliLoggers#forClass(Class)} and
+ * {@link CliLoggers#forName(String)} methods will redirect their output to 
the console when commands are started with the {@code -v} flag.
+ */
+public class CliLoggers {
+    private static PrintWriter output;
+
+    private static boolean isVerbose;
+
+    /** Http logger for the default REST API client. */
+    private static final HttpLogging httpLogger = new 
HttpLogging(Configuration.getDefaultApiClient());
+
+    private static final LoggerFactory loggerFactory = name -> new 
CliLogger(System.getLogger(name));
+
+    /**
+     * Creates logger for given class.
+     *
+     * @param cls The class for a logger.
+     * @return Ignite logger.
+     */
+    public static IgniteLogger forClass(Class<?> cls) {
+        return Loggers.forClass(cls, loggerFactory);
+    }
+
+    /**
+     * Creates logger for given name.
+     *
+     * @param name The name for a logger.
+     * @return Ignite logger.
+     */
+    public static IgniteLogger forName(String name) {
+        return Loggers.forName(name, loggerFactory);
+    }
+
+    /**
+     * Starts redirecting output from loggers and from REST API client to the 
specified print writer.
+     *
+     * @param out Print writer to write logs to.
+     */
+    public static void startOutputRedirect(PrintWriter out) {
+        output = out;
+        isVerbose = true;
+        httpLogger.startHttpLogging(out);
+    }
+
+    /**
+     * Stops redirecting output previously started by {@link 
CliLoggers#startOutputRedirect(PrintWriter)}.
+     */
+    public static void stopOutputRedirect() {
+        output = null;
+        isVerbose = false;
+        httpLogger.stopHttpLogging();
+    }
+
+    /**
+     * Determine whether the output is redirected or not.
+     *
+     * @return {@code true} if output is redirected.
+     */
+    public static boolean isVerbose() {
+        return isVerbose;
+    }
+
+    private static class CliLogger implements Logger {
+
+        private final Logger delegate;
+
+        private CliLogger(Logger delegate) {
+            this.delegate = delegate;
+        }
+
+        @Override
+        public String getName() {
+            return delegate.getName();
+        }
+
+        @Override
+        public boolean isLoggable(Level level) {
+            return delegate.isLoggable(level) || isVerbose;
+        }
+
+        @Override
+        public void log(Level level, ResourceBundle bundle, String msg, 
Throwable thrown) {
+            if (isVerbose) {
+                output.println(msg);
+                output.println(thrown.getMessage());
+            }
+            delegate.log(level, bundle, msg, thrown);
+        }
+
+        @Override
+        public void log(Level level, ResourceBundle bundle, String format, 
Object... params) {
+            if (isVerbose) {
+                output.println(format);
+            }
+            delegate.log(level, bundle, format, params);
+        }
+    }
+}
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/HttpLogging.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/HttpLogging.java
new file mode 100644
index 0000000000..dc8bf52db0
--- /dev/null
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/HttpLogging.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.cli.logger;
+
+import java.io.PrintWriter;
+import okhttp3.OkHttpClient.Builder;
+import okhttp3.logging.HttpLoggingInterceptor;
+import okhttp3.logging.HttpLoggingInterceptor.Level;
+import org.apache.ignite.rest.client.invoker.ApiClient;
+
+/** Helper class for logging HTTP requests/responses from generated REST API 
client. */
+class HttpLogging {
+    private final ApiClient client;
+    private HttpLoggingInterceptor interceptor;
+
+    HttpLogging(ApiClient client) {
+        this.client = client;
+    }
+
+    /**
+     * Starts logging HTTP requests/responses to specified {@code PrintWriter}.
+     *
+     * @param output Print writer to print logs to.
+     */
+    void startHttpLogging(PrintWriter output) {
+        if (interceptor == null) {
+            Builder builder = client.getHttpClient().newBuilder();
+
+            interceptor = new HttpLoggingInterceptor(output::println);
+            interceptor.setLevel(Level.BASIC);
+            builder.interceptors().add(interceptor);
+
+            client.setHttpClient(builder.build());
+        }
+    }
+
+    /**
+     * Stops logging previously started by {@link 
HttpLogging#startHttpLogging(PrintWriter)}.
+     */
+    void stopHttpLogging() {
+        if (interceptor != null) {
+            Builder builder = client.getHttpClient().newBuilder();
+
+            builder.interceptors().remove(interceptor);
+
+            client.setHttpClient(builder.build());
+        }
+    }
+}
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/FlowTest.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/FlowTest.java
index 2267d6ac20..5b6521b14b 100644
--- 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/FlowTest.java
+++ 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/FlowTest.java
@@ -18,8 +18,10 @@
 package org.apache.ignite.internal.cli.commands.flow;
 
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.emptyString;
 import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.startsWith;
 
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
@@ -29,6 +31,9 @@ import java.io.StringWriter;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
+import org.apache.ignite.internal.cli.core.call.StringCallInput;
+import org.apache.ignite.internal.cli.core.call.ThrowingStrCall;
+import org.apache.ignite.internal.cli.core.exception.TestExceptionHandler;
 import org.apache.ignite.internal.cli.core.flow.Flow;
 import org.apache.ignite.internal.cli.core.flow.Flowable;
 import org.apache.ignite.internal.cli.core.flow.builder.FlowBuilder;
@@ -53,13 +58,32 @@ class FlowTest {
     private StringWriter out;
     private StringWriter errOut;
 
+    @Test
+    void testVerbose() throws IOException {
+        // Given
+        bindAnswers("no");
+
+        // When start flow with print and verbose
+        askQuestion()
+                .then(Flows.fromCall(new ThrowingStrCall(), 
StringCallInput::new))
+                .exceptionHandler(new TestExceptionHandler())
+                .verbose(true)
+                .print()
+                .start();
+
+        // Then error output starts with the message from exception and 
contains verbose output
+        assertThat(out.toString(), emptyString());
+        assertThat(errOut.toString(), startsWith("Ooops!" + 
System.lineSeparator()));
+        assertThat(errOut.toString(), containsString("verbose output"));
+    }
+
     private static Flow<Object, Integer> createFlow() {
         return askQuestion()
                 .question(s -> "Here is your number " + s + ":, would you like 
to multiply it by 2?",
                         List.of(new QuestionAnswer<>("yes"::equals, (a, i) -> 
Integer.parseInt(i) * 2),
                                 new QuestionAnswer<>("no"::equals, (a, i) -> 
Integer.parseInt(i))))
                 .ifThen(num -> num == 1, Flows.fromCall(new IntCall(), 
IntCallInput::new))
-                .ifThen(num -> num > 1, Flows.fromCall(new StrCall(), integer 
-> new StrCallInput(String.valueOf(integer))))
+                .ifThen(num -> num > 1, Flows.fromCall(new StrCall(), integer 
-> new StringCallInput(String.valueOf(integer))))
                 .build();
     }
 
@@ -130,7 +154,7 @@ class FlowTest {
         // When build flow and start
         askQuestion()
                 .exceptionHandler(new TestExceptionHandler())
-                .then(Flows.fromCall(new ThrowingStrCall(), StrCallInput::new))
+                .then(Flows.fromCall(new ThrowingStrCall(), 
StringCallInput::new))
                 .print()
                 .start();
 
@@ -147,7 +171,7 @@ class FlowTest {
         // When build flow and start
         askQuestion()
                 .print()
-                .then(Flows.fromCall(new ThrowingStrCall(), StrCallInput::new))
+                .then(Flows.fromCall(new ThrowingStrCall(), 
StringCallInput::new))
                 .exceptionHandler(new TestExceptionHandler())
                 .start();
 
@@ -163,7 +187,7 @@ class FlowTest {
 
         // When build flow and start
         askQuestion()
-                .then(Flows.fromCall(new ThrowingStrCall(), StrCallInput::new))
+                .then(Flows.fromCall(new ThrowingStrCall(), 
StringCallInput::new))
                 .exceptionHandler(new TestExceptionHandler())
                 .print()
                 .start();
@@ -196,7 +220,7 @@ class FlowTest {
 
         // When build flow and start
         askQuestion()
-                .then(Flows.fromCall(new ThrowingStrCall(), StrCallInput::new))
+                .then(Flows.fromCall(new ThrowingStrCall(), 
StringCallInput::new))
                 .exceptionHandler(new TestExceptionHandler())
                 .print()
                 .print()
@@ -230,7 +254,7 @@ class FlowTest {
 
         // When start flow with print
         askQuestion()
-                .then(Flows.fromCall(new ThrowingStrCall(), StrCallInput::new))
+                .then(Flows.fromCall(new ThrowingStrCall(), 
StringCallInput::new))
                 .exceptionHandler(new TestExceptionHandler())
                 .print()
                 .start();
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/StrCall.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/StrCall.java
index 4acbe2fb21..b46bc5b90a 100644
--- 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/StrCall.java
+++ 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/StrCall.java
@@ -20,11 +20,12 @@ package org.apache.ignite.internal.cli.commands.flow;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
+import org.apache.ignite.internal.cli.core.call.StringCallInput;
 
-class StrCall implements Call<StrCallInput, String> {
+class StrCall implements Call<StringCallInput, String> {
 
     @Override
-    public CallOutput<String> execute(StrCallInput input) {
-        return DefaultCallOutput.success("You are unlucky, your number |" + 
input.value + "|");
+    public CallOutput<String> execute(StringCallInput input) {
+        return DefaultCallOutput.success("You are unlucky, your number |" + 
input.getString() + "|");
     }
 }
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/StrCallInput.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/StrCallInput.java
deleted file mode 100644
index d0be1dab78..0000000000
--- 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/StrCallInput.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.cli.commands.flow;
-
-import org.apache.ignite.internal.cli.core.call.CallInput;
-
-class StrCallInput implements CallInput {
-    final String value;
-
-    StrCallInput(String value) {
-        this.value = value;
-    }
-}
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/core/call/PipelineTest.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/core/call/PipelineTest.java
new file mode 100644
index 0000000000..a1aac24059
--- /dev/null
+++ 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/core/call/PipelineTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.cli.core.call;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.emptyString;
+import static org.hamcrest.Matchers.startsWith;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import org.apache.ignite.internal.cli.core.exception.TestExceptionHandler;
+import org.junit.jupiter.api.Test;
+
+class PipelineTest {
+
+    @Test
+    void verboseTest() {
+        // Given
+        StringWriter out = new StringWriter();
+        StringWriter errOut = new StringWriter();
+
+        // When start pipeline with verbose
+        CallExecutionPipeline.builder(new ThrowingStrCall())
+                .inputProvider(StringCallInput::new)
+                .exceptionHandler(new TestExceptionHandler())
+                .output(new PrintWriter(out))
+                .errOutput(new PrintWriter(errOut))
+                .verbose(true)
+                .build().runPipeline();
+
+        // Then error output starts with the message from exception and 
contains verbose output
+        assertThat(out.toString(), emptyString());
+        assertThat(errOut.toString(), startsWith("Ooops!" + 
System.lineSeparator()));
+        assertThat(errOut.toString(), containsString("verbose output"));
+    }
+}
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/ThrowingStrCall.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/core/call/ThrowingStrCall.java
similarity index 71%
rename from 
modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/ThrowingStrCall.java
rename to 
modules/cli/src/test/java/org/apache/ignite/internal/cli/core/call/ThrowingStrCall.java
index 2336daff56..975082709f 100644
--- 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/ThrowingStrCall.java
+++ 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/core/call/ThrowingStrCall.java
@@ -15,15 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.flow;
+package org.apache.ignite.internal.cli.core.call;
 
-import org.apache.ignite.internal.cli.core.call.Call;
-import org.apache.ignite.internal.cli.core.call.CallOutput;
-import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
-
-class ThrowingStrCall implements Call<StrCallInput, String> {
+/** Test call that throws a runtime exception. **/
+public class ThrowingStrCall implements Call<StringCallInput, String> {
     @Override
-    public CallOutput<String> execute(StrCallInput input) {
+    public CallOutput<String> execute(StringCallInput input) {
         return DefaultCallOutput.failure(new RuntimeException("Ooops!"));
     }
 }
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/TestExceptionHandler.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/core/exception/TestExceptionHandler.java
similarity index 69%
rename from 
modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/TestExceptionHandler.java
rename to 
modules/cli/src/test/java/org/apache/ignite/internal/cli/core/exception/TestExceptionHandler.java
index 58aedd58d7..e4c56b776c 100644
--- 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/flow/TestExceptionHandler.java
+++ 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/core/exception/TestExceptionHandler.java
@@ -15,16 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cli.commands.flow;
+package org.apache.ignite.internal.cli.core.exception;
 
-import org.apache.ignite.internal.cli.core.exception.ExceptionHandler;
-import org.apache.ignite.internal.cli.core.exception.ExceptionWriter;
+import org.apache.ignite.internal.cli.logger.CliLoggers;
+import org.apache.ignite.internal.logger.IgniteLogger;
+
+/** Exception handler that writes exception messages and logs verbose output. 
**/
+public class TestExceptionHandler implements 
ExceptionHandler<RuntimeException> {
+    private static final IgniteLogger LOG = 
CliLoggers.forClass(TestExceptionHandler.class);
 
-class TestExceptionHandler implements ExceptionHandler<RuntimeException> {
     @Override
     public int handle(ExceptionWriter err, RuntimeException e) {
         err.write(e.getMessage());
-
+        LOG.debug("verbose output");
         return 0;
     }
 
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/logger/HttpLoggingTest.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/logger/HttpLoggingTest.java
new file mode 100644
index 0000000000..5c0e4ed210
--- /dev/null
+++ 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/logger/HttpLoggingTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.cli.logger;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.empty;
+import static org.hamcrest.Matchers.not;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import okhttp3.Interceptor;
+import okhttp3.OkHttpClient.Builder;
+import org.apache.ignite.rest.client.invoker.ApiClient;
+import org.junit.jupiter.api.Test;
+
+class HttpLoggingTest {
+
+    @Test
+    void startAndStopLogging() {
+        ApiClient client = new ApiClient();
+        assertThat(client.getHttpClient().interceptors(), empty());
+
+        HttpLogging logger = new HttpLogging(client);
+
+        logger.startHttpLogging(new PrintWriter(new StringWriter()));
+        assertThat(client.getHttpClient().interceptors(), not(empty()));
+
+        logger.stopHttpLogging();
+        assertThat(client.getHttpClient().interceptors(), empty());
+    }
+
+    @Test
+    void stopLoggingRemoveOnlyOneInterceptor() {
+        ApiClient client = new ApiClient();
+        Interceptor interceptor = chain -> chain.proceed(chain.request());
+        Builder builder = client.getHttpClient().newBuilder();
+        builder.interceptors().add(interceptor);
+        client.setHttpClient(builder.build());
+
+        HttpLogging logger = new HttpLogging(client);
+
+        logger.startHttpLogging(new PrintWriter(new StringWriter()));
+        logger.stopHttpLogging();
+
+        assertThat(client.getHttpClient().interceptors(), 
contains(interceptor));
+    }
+}


Reply via email to