add timestamp to error_report()
PATCH v6 1/1 add timestamp to error_report()
[Issue]
When we offer a customer support service and a problem happens in a customer's system, we try to understand the problem by comparing what the customer reports with message logs of the customer's system.
In this case, we often need to know when the problem happens.
But, currently, there is no timestamp in qemu's error messages. Therefore, we may not be able to understand the problem based on error messages.
[Solution]
Add a timestamp to qemu's error message logged byerror_report() with g_time_val_to_iso8601().
---
Changelog
v5 -> v6
- Remove include/qemu/time.h and utils/qemu-time.c.
- Fix a syntax and indent of messages in msg option's DEF().
- Change explanation of the msg option.
v4 -> v5
- Fix descriptions of msg option.
- Rename TIME_H to QEMU_TIME_H. (avoiding double inclusion of qemu/time.h)
- Change argument of qemu_get_timestamp_str to "char *" and "size_t".
- Confirmed msg option is displayed by query-command-line-options.
v3 -> v4
- Correct email address of Signed-off-by.
v2 -> v3
- Use g_time_val_to_iso8601() to get timestamp instead of copying libvirt's time-handling functions.
According to discussion below, qemu doesn't need to take care if timestamp functions are async-signal safe or not.
http://marc.info/?l=qemu-devel&m=136741841921265&w=2
Also, In the review of v2 patch, strftime() are recommended to format string. But it is not a suitable function to handle msec.
Then, simply call g_time_val_to_iso8601().
- Intoroduce a common time-handling function to util/qemu-time.c. (Suggested by Daniel P. Berrange)
- Add testing for g_time_val_to_iso8601() to tests/test-time.c. The test cases are copied from libvirt's virtimetest. (Suggested by Daniel P. Berrange)
v1 -> v2
- add an option, -msg timestamp={on|off}, to enable output message with timestamp
--- include/qemu/error-report.h | 2 ++ qemu-options.hx | 11 +++++++++++ util/qemu-error.c | 10 ++++++++++ vl.c | 26 ++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 0 deletions(-)
include/qemu/error-report.h +2 -0
@@ -14,6 +14,7 @@#define QEMU_ERROR_H #include <stdarg.h> +#include <stdbool.h> #include "qemu/compiler.h" typedef struct Location {
@@ -40,5 +41,6 @@ void error_print_loc(void);void error_set_progname (const char *argv0); void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2);const char *error_get_progname (void ); +extern bool enable_timestamp_msg;#endif
qemu-options.hx +11 -0
@@ -3098,6 +3098,17 @@ property must be set. These objects are placed in the '/objects' path. ETEXI +DEF("msg", HAS_ARG, QEMU_OPTION_msg, + "-msg timestamp[=on|off]\n" + " change the format of messages\n" + " on|off controls leading timestamps (default:on)\n", + QEMU_ARCH_ALL) +STEXI +@item -msg timestamp[=on|off] +@findex -msg +prepend a timestamp to each log message.(default:on) +ETEXI + HXCOMM This is the last statement. Insert new options before this line! STEXI @end table
util/qemu-error.c +10 -0
@@ -196,6 +196,7 @@ void error_print_loc(void) } } +bool enable_timestamp_msg;/* * Print an error message to current monitor if we have one, else to stderr. * Format arguments like sprintf(). The result should not contain
@@ -206,6 +207,15 @@ void error_print_loc(void)void error_report (const char *fmt, ...) {va_list ap; +GTimeVal tv; +gchar *timestr; + +if (enable_timestamp_msg) { +g_get_current_time (&tv); + timestr =g_time_val_to_iso8601 (&tv); +error_printf ("%s " , timestr); +g_free (timestr); + }error_print_loc ();va_start (ap, fmt);
vl.c +26 -0
@@ -516,6 +516,18 @@ static QemuOptsList qemu_realtime_opts = { }, }; +static QemuOptsList qemu_msg_opts = { + .name ="msg" , + .head =QTAILQ_HEAD_INITIALIZER (qemu_msg_opts.head), + .desc = { + { + .name ="timestamp" , + .type =QEMU_OPT_BOOL , + }, + {/* end of list */ } + }, +}; +const char *qemu_get_vm_name (void ) {return qemu_name;
@@ -1459,6 +1471,12 @@ static void configure_realtime(QemuOpts *opts) } } + +static void configure_msg (QemuOpts *opts) +{ + enable_timestamp_msg =qemu_opt_get_bool (opts,"timestamp" , true); +} +/***********************************************************/ /* USB devices */
@@ -2901,6 +2919,7 @@ int main(int argc, char **argv, char **envp)qemu_add_opts (&qemu_object_opts);qemu_add_opts (&qemu_tpmdev_opts);qemu_add_opts (&qemu_realtime_opts); +qemu_add_opts (&qemu_msg_opts);runstate_init ();
@@ -3808,6 +3827,13 @@ int main(int argc, char **argv, char **envp) }configure_realtime (opts);break ; +case QEMU_OPTION_msg: + opts =qemu_opts_parse (qemu_find_opts ("msg" ), optarg,0 ); +if (!opts) { +exit (1 ); + } +configure_msg (opts); +break ;default :os_parse_cmd_args (popt->index, optarg); }
Signature · 1 line
1.7.1
Quoted 56 lines · Seiji Aguchi
[Issue]
When we offer a customer support service and a problem happens in a customer's system, we try to understand the problem by comparing what the customer reports with message logs of the customer's system.In this case, we often need to know when the problem happens.
But, currently, there is no timestamp in qemu's error messages. Therefore, we may not be able to understand the problem based on error messages.
[Solution]
Add a timestamp to qemu's error message logged byerror_report()withg_time_val_to_iso8601().Signed-off-by Seiji Aguchi <[email protected]>---
Changelog
v5 -> v6
- Removeinclude/qemu/time.handutils/qemu-time.c.
- Fix a syntax and indent of messages in msg option'sDEF().
- Change explanation of the msg option.v4 -> v5
- Fix descriptions of msg option.
- RenameTIME_HtoQEMU_TIME_H. (avoiding double inclusion ofqemu/time.h)
- Change argument ofqemu_get_timestamp_strto "char *" and "size_t".
- Confirmed msg option is displayed by query-command-line-options.v3 -> v4
- Correct email address of Signed-off-by.v2 -> v3
- Useg_time_val_to_iso8601()to get timestamp instead of copying libvirt's time-handling functions.According to discussion below, qemu doesn't need to take care if timestamp functions are async-signal safe or not.
http://marc.info/?l=qemu-devel&m=136741841921265&w=2
Also, In the review of v2 patch,
strftime()are recommended to format string. But it is not a suitable function to handle msec.Then, simply call g_time_val_to_iso8601().- Intoroduce a common time-handling function to
util/qemu-time.c. (Suggested by Daniel P. Berrange)- Add testing for
g_time_val_to_iso8601()totests/test-time.c. The test cases are copied from libvirt's virtimetest. (Suggested by Daniel P. Berrange)v1 -> v2
Quoted 7 lines
- add an option, -msg timestamp={on|off}, to enable output message with timestamp
--- include/qemu/error-report.h | 2 ++ qemu-options.hx | 11 +++++++++++ util/qemu-error.c | 10 ++++++++++ vl.c | 26 ++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 0 deletions(-)
Quoted 8 lines · On Wed, 03 Jul 2013 23:02:46 -0400 Seiji Aguchi <[email protected]> wrote:
[Issue]
When we offer a customer support service and a problem happens in a customer's system, we try to understand the problem by comparing what the customer reports with message logs of the customer's system.In this case, we often need to know when the problem happens.
Quoted 7 lines
But, currently, there is no timestamp in qemu's error messages. Therefore, we may not be able to understand the problem based on error messages.
[Solution]
Add a timestamp to qemu's error message logged byerror_report()withg_time_val_to_iso8601().
I can take this through the QMP tree, but I have two review comments below.
Quoted 72 lines
Signed-off-by Seiji Aguchi <[email protected]>---
Changelog
v5 -> v6
- Removeinclude/qemu/time.handutils/qemu-time.c.
- Fix a syntax and indent of messages in msg option'sDEF().
- Change explanation of the msg option.v4 -> v5
- Fix descriptions of msg option.
- RenameTIME_HtoQEMU_TIME_H. (avoiding double inclusion ofqemu/time.h)
- Change argument ofqemu_get_timestamp_strto "char *" and "size_t".
- Confirmed msg option is displayed by query-command-line-options.v3 -> v4
- Correct email address of Signed-off-by.v2 -> v3
- Useg_time_val_to_iso8601()to get timestamp instead of copying libvirt's time-handling functions.According to discussion below, qemu doesn't need to take care if timestamp functions are async-signal safe or not.
http://marc.info/?l=qemu-devel&m=136741841921265&w=2
Also, In the review of v2 patch,
strftime()are recommended to format string. But it is not a suitable function to handle msec.Then, simply call g_time_val_to_iso8601().- Intoroduce a common time-handling function to
util/qemu-time.c. (Suggested by Daniel P. Berrange)- Add testing for
g_time_val_to_iso8601()totests/test-time.c. The test cases are copied from libvirt's virtimetest. (Suggested by Daniel P. Berrange)v1 -> v2
- add an option, -msg timestamp={on|off}, to enable output message with timestamp
--- include/qemu/error-report.h | 2 ++ qemu-options.hx | 11 +++++++++++ util/qemu-error.c | 10 ++++++++++ vl.c | 26 ++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 0 deletions(-)include/qemu/error-report.h +2
-0@@ -14,6 +14,7 @@#define QEMU_ERROR_H #include <stdarg.h> +#include <stdbool.h> #include "qemu/compiler.h" typedef struct Location {@@ -40,5 +41,6 @@ void error_print_loc(void);void error_set_progname (const char *argv0); void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2);const char *error_get_progname (void ); +extern bool enable_timestamp_msg;#endif qemu-options.hx +0
-0
qemu-options.hx property must be set. These objects are placed in the · line 3104
Quoted 7 lines
qemu-options.hx +4
-0@@ -3098,6 +3098,17 @@ property must be set. These objects are placed in the '/objects' path. ETEXI +DEF("msg", HAS_ARG, QEMU_OPTION_msg, + "-msg timestamp[=on|off]\n" + " change the format of messages\n" + " on|off controls leading timestamps (default:on)\n",
Did you really intend to say it's on by default? Because it's actually disabled by default. I prefer having this disabled btw, and I can fix it myself before applying if that's what you intended.
Quoted 23 lines
qemu-options.hx +7
-0+ QEMU_ARCH_ALL) +STEXI +@item -msg timestamp[=on|off] +@findex -msg +prepend a timestamp to each log message.(default:on) +ETEXI + HXCOMM This is the last statement. Insert new options before this line! STEXI @end tableutil/qemu-error.c +1
-0@@ -196,6 +196,7 @@ void error_print_loc(void) } } +bool enable_timestamp_msg;/* * Print an error message to current monitor if we have one, else to stderr. * Format arguments like sprintf(). The result should not contain
util/qemu-error.c void error_print_loc(void) · line 208
Quoted 2 lines
util/qemu-error.c +0
-0@@ -206,6 +207,15 @@ void error_print_loc(void)void error_report (const char *fmt, ...) {
There are some errors being printed to stderr that call error_get_pretty(), you might want to convert them to error_report() to increase coverage. But you can do this as a follow up patch.
Quoted 71 lines
util/qemu-error.c +9
-0va_list ap; +GTimeVal tv; +gchar *timestr; + +if (enable_timestamp_msg) { +g_get_current_time (&tv); + timestr =g_time_val_to_iso8601 (&tv); +error_printf ("%s " , timestr); +g_free (timestr); + }error_print_loc ();va_start (ap, fmt);vl.c +26
-0@@ -516,6 +516,18 @@ static QemuOptsList qemu_realtime_opts = { }, }; +static QemuOptsList qemu_msg_opts = { + .name ="msg" , + .head =QTAILQ_HEAD_INITIALIZER (qemu_msg_opts.head), + .desc = { + { + .name ="timestamp" , + .type =QEMU_OPT_BOOL , + }, + {/* end of list */ } + }, +}; +const char *qemu_get_vm_name (void ) {return qemu_name;@@ -1459,6 +1471,12 @@ static void configure_realtime(QemuOpts *opts) } } + +static void configure_msg (QemuOpts *opts) +{ + enable_timestamp_msg =qemu_opt_get_bool (opts,"timestamp" , true); +} +/***********************************************************/ /* USB devices */ @@ -2901,6 +2919,7 @@ int main(int argc, char **argv, char **envp)qemu_add_opts (&qemu_object_opts);qemu_add_opts (&qemu_tpmdev_opts);qemu_add_opts (&qemu_realtime_opts); +qemu_add_opts (&qemu_msg_opts);runstate_init ();@@ -3808,6 +3827,13 @@ int main(int argc, char **argv, char **envp) }configure_realtime (opts);break ; +case QEMU_OPTION_msg: + opts =qemu_opts_parse (qemu_find_opts ("msg" ), optarg,0 ); +if (!opts) { +exit (1 ); + } +configure_msg (opts); +break ;default :os_parse_cmd_args (popt->index, optarg); }
Quoted 8 lines
qemu-options.hx property must be set. These objects are placed in the · line 3104
Quoted 4 lines
qemu-options.hx +4
-0+DEF("msg", HAS_ARG, QEMU_OPTION_msg, + "-msg timestamp[=on|off]\n" + " change the format of messages\n" + " on|off controls leading timestamps (default:on)\n",Did you really intend to say it's on by default? Because it's actually disabled by default. I prefer having this disabled btw, and I can fix it myself before applying if that's what you intended.
My default is "-msg timestamp".
Why do you think it is actually disabled by default?
Quoted 10 lines
util/qemu-error.c void error_print_loc(void) · line 208
Quoted 6 lines
/*
* Print an error message to current monitor if we have one, else to stderr.
* Format arguments likesprintf(). The result should not containutil/qemu-error.c +0
-0@@ -206,6 +207,15 @@ void error_print_loc(void)void error_report (const char *fmt, ...) {There are some errors being printed to stderr that call
error_get_pretty(), you might want to convert them toerror_report()to increase coverage. But you can do this as a follow up patch.
I will make a follow up patch after this patch is merged to your tree.
Seiji
Luiz Capitulino
AppliedQuoted 5 lines · On Mon, 8 Jul 2013 18:47:24 +0000 Seiji Aguchi <[email protected]> wrote:
Quoted 5 lines
Quoted 4 lines
qemu-options.hx +4
-0+DEF("msg", HAS_ARG, QEMU_OPTION_msg, + "-msg timestamp[=on|off]\n" + " change the format of messages\n" + " on|off controls leading timestamps (default:on)\n",
Quoted 7 lines
Quoted 3 lines
Did you really intend to say it's on by default? Because it's actually disabled by default. I prefer having this disabled btw, and I can fix it myself before applying if that's what you intended.
My default is "-msg timestamp".
Why do you think it is actually disabled by default?
Oh, for some reason I assumed you wanted the timestamps to show up even when -msg is not passed. But now I see that it's on by default only if -msg timestamp is passed. Seems reasonable.
Applied to the qmp branch, thanks.
Laszlo Ersek
Reviewed-byQuoted 13 lines · Luiz Capitulino
Quoted 10 lines · On Mon, 8 Jul 2013 18:47:24 +0000 Seiji Aguchi <[email protected]> wrote:
Quoted 8 lines
qemu-options.hx property must be set. These objects are placed in the · line 3104
Quoted 4 lines
qemu-options.hx +4
-0+DEF("msg", HAS_ARG, QEMU_OPTION_msg, + "-msg timestamp[=on|off]\n" + " change the format of messages\n" + " on|off controls leading timestamps (default:on)\n",Did you really intend to say it's on by default? Because it's actually disabled by default. I prefer having this disabled btw, and I can fix it myself before applying if that's what you intended.
Quoted 6 lines
Quoted 2 lines
My default is "-msg timestamp".
Why do you think it is actually disabled by default?Oh, for some reason I assumed you wanted the timestamps to show up even when -msg is not passed. But now I see that it's on by default only if -msg timestamp is passed. Seems reasonable.
Yeah the "(default: XXX)" statements in "qemu-options.hx" keep confusing me too. They don't document the default qemu behavior (ie. with the option absent) but the default behavior of the specific option, if given on the command line :)
Quoted 1 line
Applied to the qmp branch, thanks.
Great, thanks!
In case you're willing to reword the commit message:
Laszlo