util/qemu-error: prepend guest name to error message to identify affected VM owner
This is followup patch to the one submitted back in Oct, 19 https://lists.gnu.org/archive/html/qemu-devel/2019-10/msg02102.html My mistake here, I took my eyes of the mailing list after I got the initial thumbs up. This patch follows up on Markus comments in the above link. Purpose of this patch: We want to print guest name for errors, warnings and info messages. This was the first of two patches the second being MCE errors targeting a VM with guest name prepended. But in a large fleet we see many other errors that disable a VM or crash it. In a large fleet and centralized logging having the guest name enables identify of owner and customer. Signed-off-by: Mario Smarduch <msmarduch@digitalocean.com> Message-Id: <20200626201900.8876-1-msmarduch@digitalocean.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3bcb5840f1
commit
2880ffb089
@ -75,5 +75,7 @@ void error_init(const char *argv0);
|
|||||||
const char *error_get_progname(void);
|
const char *error_get_progname(void);
|
||||||
|
|
||||||
extern bool error_with_timestamp;
|
extern bool error_with_timestamp;
|
||||||
|
extern bool error_with_guestname;
|
||||||
|
extern const char *error_guest_name;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -4303,16 +4303,22 @@ HXCOMM Deprecated by -accel tcg
|
|||||||
DEF("no-kvm", 0, QEMU_OPTION_no_kvm, "", QEMU_ARCH_I386)
|
DEF("no-kvm", 0, QEMU_OPTION_no_kvm, "", QEMU_ARCH_I386)
|
||||||
|
|
||||||
DEF("msg", HAS_ARG, QEMU_OPTION_msg,
|
DEF("msg", HAS_ARG, QEMU_OPTION_msg,
|
||||||
"-msg timestamp[=on|off]\n"
|
"-msg [timestamp[=on|off]][,guest-name=[on|off]]\n"
|
||||||
" control error message format\n"
|
" control error message format\n"
|
||||||
" timestamp=on enables timestamps (default: off)\n",
|
" timestamp=on enables timestamps (default: off)\n"
|
||||||
|
" guest-name=on enables guest name prefix but only if\n"
|
||||||
|
" -name guest option is set (default: off)\n",
|
||||||
QEMU_ARCH_ALL)
|
QEMU_ARCH_ALL)
|
||||||
SRST
|
SRST
|
||||||
``-msg timestamp[=on|off]``
|
``-msg [timestamp[=on|off]][,guest-name[=on|off]]``
|
||||||
Control error message format.
|
Control error message format.
|
||||||
|
|
||||||
``timestamp=on|off``
|
``timestamp=on|off``
|
||||||
Prefix messages with a timestamp. Default is off.
|
Prefix messages with a timestamp. Default is off.
|
||||||
|
|
||||||
|
``guest-name=on|off``
|
||||||
|
Prefix messages with guest name but only if -name guest option is set
|
||||||
|
otherwise the option is ignored. Default is off.
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
DEF("dump-vmstate", HAS_ARG, QEMU_OPTION_dump_vmstate,
|
DEF("dump-vmstate", HAS_ARG, QEMU_OPTION_dump_vmstate,
|
||||||
|
@ -389,6 +389,12 @@ static QemuOptsList qemu_msg_opts = {
|
|||||||
.name = "timestamp",
|
.name = "timestamp",
|
||||||
.type = QEMU_OPT_BOOL,
|
.type = QEMU_OPT_BOOL,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "guest-name",
|
||||||
|
.type = QEMU_OPT_BOOL,
|
||||||
|
.help = "Prepends guest name for error messages but only if "
|
||||||
|
"-name guest is set otherwise option is ignored\n",
|
||||||
|
},
|
||||||
{ /* end of list */ }
|
{ /* end of list */ }
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -1114,6 +1120,7 @@ static void realtime_init(void)
|
|||||||
static void configure_msg(QemuOpts *opts)
|
static void configure_msg(QemuOpts *opts)
|
||||||
{
|
{
|
||||||
error_with_timestamp = qemu_opt_get_bool(opts, "timestamp", false);
|
error_with_timestamp = qemu_opt_get_bool(opts, "timestamp", false);
|
||||||
|
error_with_guestname = qemu_opt_get_bool(opts, "guest-name", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3592,6 +3599,8 @@ void qemu_init(int argc, char **argv, char **envp)
|
|||||||
if (!opts) {
|
if (!opts) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
/* Capture guest name if -msg guest-name is used later */
|
||||||
|
error_guest_name = qemu_opt_get(opts, "guest");
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_prom_env:
|
case QEMU_OPTION_prom_env:
|
||||||
if (nb_prom_envs >= MAX_PROM_ENVS) {
|
if (nb_prom_envs >= MAX_PROM_ENVS) {
|
||||||
|
@ -26,6 +26,8 @@ typedef enum {
|
|||||||
|
|
||||||
/* Prepend timestamp to messages */
|
/* Prepend timestamp to messages */
|
||||||
bool error_with_timestamp;
|
bool error_with_timestamp;
|
||||||
|
bool error_with_guestname;
|
||||||
|
const char *error_guest_name;
|
||||||
|
|
||||||
int error_printf(const char *fmt, ...)
|
int error_printf(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
@ -213,6 +215,11 @@ static void vreport(report_type type, const char *fmt, va_list ap)
|
|||||||
g_free(timestr);
|
g_free(timestr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Only prepend guest name if -msg guest-name and -name guest=... are set */
|
||||||
|
if (error_with_guestname && error_guest_name && !cur_mon) {
|
||||||
|
error_printf("%s ", error_guest_name);
|
||||||
|
}
|
||||||
|
|
||||||
print_loc();
|
print_loc();
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
Loading…
Reference in New Issue
Block a user