Finally, now that all APIs have been introduced, wire them up to virt-admin and introduce daemon-log-outputs and daemon-log-filters commands. Signed-off-by: Erik Skultety <eskultet@xxxxxxxxxx> --- tools/virt-admin.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++ tools/virt-admin.pod | 90 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 210 insertions(+) diff --git a/tools/virt-admin.c b/tools/virt-admin.c index 70b0e51..0b9945a 100644 --- a/tools/virt-admin.c +++ b/tools/virt-admin.c @@ -971,6 +971,114 @@ cmdSrvClientsSet(vshControl *ctl, const vshCmd *cmd) goto cleanup; } +/* -------------------------- + * Command daemon-log-filters + * -------------------------- + */ +static const vshCmdInfo info_daemon_log_filters[] = { + {.name = "help", + .data = N_("fetch or set the currently defined set of logging filters on " + "daemon") + }, + {.name = "desc", + .data = N_("Depending on whether run with or without options, the command " + "fetches or redefines the existing active set of filters on " + "daemon.") + }, + {.name = NULL} +}; + +static const vshCmdOptDef opts_daemon_log_filters[] = { + {.name = "filters", + .type = VSH_OT_STRING, + .help = N_("redefine the existing set of logging filters"), + .flags = VSH_OFLAG_EMPTY_OK + }, + {.name = NULL} +}; + +static bool +cmdDaemonLogFilters(vshControl *ctl, const vshCmd *cmd) +{ + int nfilters; + char *filters = NULL; + vshAdmControlPtr priv = ctl->privData; + + if (vshCommandOptBool(cmd, "filters")) { + if ((vshCommandOptStringReq(ctl, cmd, "filters", + (const char **) &filters) < 0 || + virAdmConnectSetLoggingFilters(priv->conn, filters, 0) < 0)) { + vshError(ctl, _("Unable to change daemon logging settings")); + return false; + } + } else { + if ((nfilters = virAdmConnectGetLoggingFilters(priv->conn, + &filters, 0)) < 0) { + vshError(ctl, _("Unable to get daemon logging filters information")); + return false; + } + + vshPrintExtra(ctl, " %-15s", _("Logging filters: ")); + vshPrint(ctl, "%s\n", filters ? filters : ""); + } + + return true; +} + +/* -------------------------- + * Command daemon-log-outputs + * -------------------------- + */ +static const vshCmdInfo info_daemon_log_outputs[] = { + {.name = "help", + .data = N_("fetch or set the currently defined set of logging outputs on " + "daemon") + }, + {.name = "desc", + .data = N_("Depending on whether run with or without options, the command " + "fetches or redefines the existing active set of outputs on " + "daemon.") + }, + {.name = NULL} +}; + +static const vshCmdOptDef opts_daemon_log_outputs[] = { + {.name = "outputs", + .type = VSH_OT_STRING, + .help = N_("redefine the existing set of logging outputs"), + .flags = VSH_OFLAG_EMPTY_OK + }, + {.name = NULL} +}; + +static bool +cmdDaemonLogOutputs(vshControl *ctl, const vshCmd *cmd) +{ + int noutputs; + char *outputs = NULL; + vshAdmControlPtr priv = ctl->privData; + + if (vshCommandOptBool(cmd, "outputs")) { + if ((vshCommandOptStringReq(ctl, cmd, "outputs", + (const char **) &outputs) < 0 || + virAdmConnectSetLoggingOutputs(priv->conn, outputs, 0) < 0)) { + vshError(ctl, _("Unable to change daemon logging settings")); + return false; + } + } else { + if ((noutputs = virAdmConnectGetLoggingOutputs(priv->conn, + &outputs, 0)) < 0) { + vshError(ctl, _("Unable to get daemon logging filters information")); + return false; + } + + vshPrintExtra(ctl, " %-15s", _("Logging outputs: ")); + vshPrint(ctl, "%s\n", outputs ? outputs : ""); + } + + return true; +} + static void * vshAdmConnectionHandler(vshControl *ctl) { @@ -1341,6 +1449,18 @@ static const vshCmdDef managementCmds[] = { .info = info_srv_clients_set, .flags = 0 }, + {.name = "daemon-log-filters", + .handler = cmdDaemonLogFilters, + .opts = opts_daemon_log_filters, + .info = info_daemon_log_filters, + .flags = 0 + }, + {.name = "daemon-log-outputs", + .handler = cmdDaemonLogOutputs, + .opts = opts_daemon_log_outputs, + .info = info_daemon_log_outputs, + .flags = 0 + }, {.name = NULL} }; diff --git a/tools/virt-admin.pod b/tools/virt-admin.pod index 443730e..d3f1a35 100644 --- a/tools/virt-admin.pod +++ b/tools/virt-admin.pod @@ -155,6 +155,96 @@ change its internal configuration. Lists all manageable servers contained within the daemon the client is currently connected to. +=item B<daemon-log-info> [I<--outputs> B<string>] [I<--filters> B<string>] + +Print the currently defined set of logging outputs and/or filters. + +=over 4 + +=item I<--outputs> + +Print the currently defined set of logging outputs + +=item I<--filters> + +Print the currently defined set of logging filters + +=back + +=item B<daemon-log-define> + +Redefine the currently defined sets of logging outputs and/or filters with +completely new ones. + +=over 4 + +=item I<--outputs> + +Replaces the current set of logging outputs with a new one where multiple +outputs are delimited by space and each output must be of the following form: + +I<< X:<destination>:<auxiliary_data> >> where + +=over 4 + +=item * I<X> denotes the minimal debug level: + +=over 4 + +=item * 1: DEBUG + +=item * 2: INFO + +=item * 3: WARNING + +=item * 4: ERROR + +=back + +=item * I<< <destination> >> is one of I<stderr>, I<file>, I<syslog>, or I<journald> + +=item * I<< <auxiliary_data> >> is only required for the I<file> and I<syslog> +destination types and shall therefore contain either a path to a file or a message tag +respectively, see the B<Examples> section below. + +=back + +=item I<--filters> + +Replaces the current set of logging filters with a new one where multiple +filters are delimited by space and each filter must be of the following form: + +I<< X:<match_string> >> where + +=over 4 + +=item * I<X> denotes the minimal debug level the same way as for I<--outputs> + +=item * I<< <match_string> >> references either a specific module in libvirt's +source tree or the whole directory in the source tree, thus affecting all +modules in the directory + +=back + +=back + +B<Examples> + To replace the current logging output with one that writes to a file while + logging logging errors only, the following could be used: + + $ virt-admin daemon-log-define --outputs "4:file:<path_to_the_file>" + + To define multiple outputs at once: + + $ virt-admin daemon-log-define --outputs "4:stderr 2:syslog:<tag>" + + To define a filter which suppresses all e.g. 'virObjectUnref' DEBUG + messages, use the following (note the '.' symbol which can be used to more + fine-grained filters tailored to specific modules, in contrast, to affect + a whole directory containing several modules it would become "4:util"): + + $ virt-admin daemon-log-define --filters "4:util.object" + =back =head1 SERVER COMMANDS -- 2.5.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list