* [PATCH v3 0/3] char: add option to inject timestamps into logfile
@ 2026-02-01 17:36 Vladimir Sementsov-Ogievskiy
2026-02-01 17:36 ` [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() Vladimir Sementsov-Ogievskiy
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2026-02-01 17:36 UTC (permalink / raw)
To: marcandre.lureau
Cc: pbonzini, armbru, eblake, berrange, vsementsov, yc-core,
d-tatianin, qemu-devel, philmd
Hi all!
The ability to correlate the QEMU log and the guest log can be useful
for investigating problems. So, I suggest an option to inject timestimps
into logfile while writing it.
v3:
02: fix s/Returns/Return, add r-b by Markus
Vladimir Sementsov-Ogievskiy (3):
char: qemu_chr_write_log() use qemu_write_full()
error-report: make real_time_iso8601() public
chardev: add logtimestamp option
chardev/char.c | 73 +++++++++++++++++++++++++++++--------
include/chardev/char.h | 2 +
include/qemu/error-report.h | 6 +++
qapi/char.json | 6 ++-
util/error-report.c | 3 +-
5 files changed, 71 insertions(+), 19 deletions(-)
--
2.52.0
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() 2026-02-01 17:36 [PATCH v3 0/3] char: add option to inject timestamps into logfile Vladimir Sementsov-Ogievskiy @ 2026-02-01 17:36 ` Vladimir Sementsov-Ogievskiy 2026-02-02 11:26 ` Daniel P. Berrangé 2026-02-01 17:36 ` [PATCH v3 2/3] error-report: make real_time_iso8601() public Vladimir Sementsov-Ogievskiy ` (2 subsequent siblings) 3 siblings, 1 reply; 10+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-02-01 17:36 UTC (permalink / raw) To: marcandre.lureau Cc: pbonzini, armbru, eblake, berrange, vsementsov, yc-core, d-tatianin, qemu-devel, philmd logfd is blocking, so we don't need to care about EAGAIN. Let's simply use qemu_write_full(). Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> --- chardev/char.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 3e432195a5..64006a3119 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -82,29 +82,17 @@ void qemu_chr_be_event(Chardev *s, QEMUChrEvent event) CHARDEV_GET_CLASS(s)->chr_be_event(s, event); } -/* Not reporting errors from writing to logfile, as logs are - * defined to be "best effort" only */ static void qemu_chr_write_log(Chardev *s, const uint8_t *buf, size_t len) { - size_t done = 0; - ssize_t ret; - if (s->logfd < 0) { return; } - while (done < len) { - retry: - ret = write(s->logfd, buf + done, len - done); - if (ret == -1 && errno == EAGAIN) { - g_usleep(100); - goto retry; - } - - if (ret <= 0) { - return; - } - done += ret; + if (qemu_write_full(s->logfd, buf, len) < len) { + /* + * qemu_write_full() is defined with G_GNUC_WARN_UNUSED_RESULT, + * but logging is best‑effort, we do ignore errors. + */ } } -- 2.52.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() 2026-02-01 17:36 ` [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() Vladimir Sementsov-Ogievskiy @ 2026-02-02 11:26 ` Daniel P. Berrangé 2026-02-19 18:07 ` Vladimir Sementsov-Ogievskiy 0 siblings, 1 reply; 10+ messages in thread From: Daniel P. Berrangé @ 2026-02-02 11:26 UTC (permalink / raw) To: Vladimir Sementsov-Ogievskiy Cc: marcandre.lureau, pbonzini, armbru, eblake, yc-core, d-tatianin, qemu-devel, philmd On Sun, Feb 01, 2026 at 08:36:29PM +0300, Vladimir Sementsov-Ogievskiy wrote: > logfd is blocking, so we don't need to care about EAGAIN. > Let's simply use qemu_write_full(). Are you sure logfd is always blocking ? It can be an FD passed in from outside QEMU, and off-hand, I'm not sure where we force that to be blocking. Though we could argue it is the client't fault if they passed a non-blocking FD to QEMU. NB, we can *not* assume logfd is a plain file as libvirt will pass in a pipe to send logging via virtlogd. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> > --- > chardev/char.c | 22 +++++----------------- > 1 file changed, 5 insertions(+), 17 deletions(-) > > diff --git a/chardev/char.c b/chardev/char.c > index 3e432195a5..64006a3119 100644 > --- a/chardev/char.c > +++ b/chardev/char.c > @@ -82,29 +82,17 @@ void qemu_chr_be_event(Chardev *s, QEMUChrEvent event) > CHARDEV_GET_CLASS(s)->chr_be_event(s, event); > } > > -/* Not reporting errors from writing to logfile, as logs are > - * defined to be "best effort" only */ > static void qemu_chr_write_log(Chardev *s, const uint8_t *buf, size_t len) > { > - size_t done = 0; > - ssize_t ret; > - > if (s->logfd < 0) { > return; > } > > - while (done < len) { > - retry: > - ret = write(s->logfd, buf + done, len - done); > - if (ret == -1 && errno == EAGAIN) { > - g_usleep(100); > - goto retry; > - } > - > - if (ret <= 0) { > - return; > - } > - done += ret; > + if (qemu_write_full(s->logfd, buf, len) < len) { > + /* > + * qemu_write_full() is defined with G_GNUC_WARN_UNUSED_RESULT, > + * but logging is best‑effort, we do ignore errors. > + */ > } > } > > -- > 2.52.0 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :| ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() 2026-02-02 11:26 ` Daniel P. Berrangé @ 2026-02-19 18:07 ` Vladimir Sementsov-Ogievskiy 2026-02-19 18:08 ` Vladimir Sementsov-Ogievskiy 2026-02-25 16:00 ` Daniel P. Berrangé 0 siblings, 2 replies; 10+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-02-19 18:07 UTC (permalink / raw) To: Daniel P. Berrangé Cc: marcandre.lureau, pbonzini, armbru, eblake, yc-core, d-tatianin, qemu-devel, philmd On 02.02.26 14:26, Daniel P. Berrangé wrote: > On Sun, Feb 01, 2026 at 08:36:29PM +0300, Vladimir Sementsov-Ogievskiy wrote: >> logfd is blocking, so we don't need to care about EAGAIN. >> Let's simply use qemu_write_full(). > > Are you sure logfd is always blocking ? It can be an FD passed in > from outside QEMU, and off-hand, I'm not sure where we force that to > be blocking. Though we could argue it is the client't fault if they > passed a non-blocking FD to QEMU. > > NB, we can *not* assume logfd is a plain file as libvirt will pass > in a pipe to send logging via virtlogd. > I'm sorry I missed the email. And the commit is in master now. And, I missed the fact that qemu_create(common->logfile, flags, 0666, errp); Can actually chose fd from "fdset". All named fds in monitor are set blocking explicitly except for the case when QIO_CHANNEL_READ_FLAG_FD_PRESERVE_BLOCKING flag take place.. But fds coming through add-fd commandline options are not handled this way, as I can see. Looking through: 1. util/oslib-posix.c: qemu_write_pidfile() Uses qemu_write_full(), *unprepared* to non-blocking. 2. ui/ui-qmp-cmds.c: qmp_screendump() 2.1. png_save() wraps the fd to fdopen(), which I assume should work well with blocking and non-blocking fds 2.2. ppm_save() wraps it into qio_channel_file_new_fd() qio_channel_write_all() -> qio_channel_writev_full_all() do handle QIO_CHANNEL_ERR_BLOCK 3. qio_channel_file_new_path() In general qio-channels are prepared to work with non-blocking fds. qio_channel_file_new_path() is used (except for 2.2 and tests) from migration code, which I think should be prepared to non-blocking fds. At least, qemu_fill_buffer() handles QIO_CHANNEL_ERR_BLOCK. 4. hw/usb/bus.c: usb_qdev_realize() Wraps by fdopen() 5. hw/uefi/var-service-pcap.c: uefi_vars_pcap_init() Wraps by fdopen() 6. hw/uefi/var-service-json.c: uefi_vars_json_init() Use write() and don't handle EAGAIN: *unprepared* for non-blocking. 7. dump/dump.c: qmp_dump_guest_memory() Use qemu_write_full() - *unprepared* 8. chardev/char.c: logfd - *unprepared* after my commit 9. block/file-posix.c: raw_co_create() May use write() and not handle EAGAIN during raw_regular_truncate() - unprepared. What to do with it? I see several possibilities: 1. simply support EAGAIN in qemu_write_full()? Like it was in qemu_chr_write_log() - with g_usleep(100)? 2. switch to qio_channel_file_new_path() + qio_channel_write_all() 3. call qemu_set_blocking() on fd for *unprepared* cases > >> >> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> >> --- >> chardev/char.c | 22 +++++----------------- >> 1 file changed, 5 insertions(+), 17 deletions(-) >> >> diff --git a/chardev/char.c b/chardev/char.c >> index 3e432195a5..64006a3119 100644 >> --- a/chardev/char.c >> +++ b/chardev/char.c >> @@ -82,29 +82,17 @@ void qemu_chr_be_event(Chardev *s, QEMUChrEvent event) >> CHARDEV_GET_CLASS(s)->chr_be_event(s, event); >> } >> >> -/* Not reporting errors from writing to logfile, as logs are >> - * defined to be "best effort" only */ >> static void qemu_chr_write_log(Chardev *s, const uint8_t *buf, size_t len) >> { >> - size_t done = 0; >> - ssize_t ret; >> - >> if (s->logfd < 0) { >> return; >> } >> >> - while (done < len) { >> - retry: >> - ret = write(s->logfd, buf + done, len - done); >> - if (ret == -1 && errno == EAGAIN) { >> - g_usleep(100); >> - goto retry; >> - } >> - >> - if (ret <= 0) { >> - return; >> - } >> - done += ret; >> + if (qemu_write_full(s->logfd, buf, len) < len) { >> + /* >> + * qemu_write_full() is defined with G_GNUC_WARN_UNUSED_RESULT, >> + * but logging is best‑effort, we do ignore errors. >> + */ >> } >> } >> >> -- >> 2.52.0 >> > > With regards, > Daniel -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() 2026-02-19 18:07 ` Vladimir Sementsov-Ogievskiy @ 2026-02-19 18:08 ` Vladimir Sementsov-Ogievskiy 2026-02-25 16:00 ` Daniel P. Berrangé 1 sibling, 0 replies; 10+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-02-19 18:08 UTC (permalink / raw) To: Daniel P. Berrangé Cc: marcandre.lureau, pbonzini, armbru, eblake, yc-core, d-tatianin, qemu-devel, philmd On 19.02.26 21:07, Vladimir Sementsov-Ogievskiy wrote: > > > Looking through: "Looking through usages of qemu_create()" I mean -- Best regards, Vladimir ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() 2026-02-19 18:07 ` Vladimir Sementsov-Ogievskiy 2026-02-19 18:08 ` Vladimir Sementsov-Ogievskiy @ 2026-02-25 16:00 ` Daniel P. Berrangé 1 sibling, 0 replies; 10+ messages in thread From: Daniel P. Berrangé @ 2026-02-25 16:00 UTC (permalink / raw) To: Vladimir Sementsov-Ogievskiy Cc: marcandre.lureau, pbonzini, armbru, eblake, yc-core, d-tatianin, qemu-devel, philmd On Thu, Feb 19, 2026 at 09:07:07PM +0300, Vladimir Sementsov-Ogievskiy wrote: > On 02.02.26 14:26, Daniel P. Berrangé wrote: > > On Sun, Feb 01, 2026 at 08:36:29PM +0300, Vladimir Sementsov-Ogievskiy wrote: > > > logfd is blocking, so we don't need to care about EAGAIN. > > > Let's simply use qemu_write_full(). > > > > Are you sure logfd is always blocking ? It can be an FD passed in > > from outside QEMU, and off-hand, I'm not sure where we force that to > > be blocking. Though we could argue it is the client't fault if they > > passed a non-blocking FD to QEMU. > > > > NB, we can *not* assume logfd is a plain file as libvirt will pass > > in a pipe to send logging via virtlogd. > > > > I'm sorry I missed the email. And the commit is in master now. > > And, I missed the fact that > > qemu_create(common->logfile, flags, 0666, errp); > > Can actually chose fd from "fdset". All named fds in monitor are set blocking > explicitly except for the case when QIO_CHANNEL_READ_FLAG_FD_PRESERVE_BLOCKING flag > take place.. But fds coming through add-fd commandline options are not handled > this way, as I can see. > Looking through: > > 1. util/oslib-posix.c: qemu_write_pidfile() > > Uses qemu_write_full(), *unprepared* to non-blocking. > > 2. ui/ui-qmp-cmds.c: qmp_screendump() > > 2.1. png_save() wraps the fd to fdopen(), which I assume should work well > with blocking and non-blocking fds > > 2.2. ppm_save() wraps it into qio_channel_file_new_fd() > > qio_channel_write_all() -> qio_channel_writev_full_all() do handle QIO_CHANNEL_ERR_BLOCK > > 3. qio_channel_file_new_path() > > In general qio-channels are prepared to work with non-blocking fds. > > qio_channel_file_new_path() is used (except for 2.2 and tests) from migration code, which > I think should be prepared to non-blocking fds. At least, qemu_fill_buffer() > handles QIO_CHANNEL_ERR_BLOCK. > > 4. hw/usb/bus.c: usb_qdev_realize() > > Wraps by fdopen() > > 5. hw/uefi/var-service-pcap.c: uefi_vars_pcap_init() > > Wraps by fdopen() > > 6. hw/uefi/var-service-json.c: uefi_vars_json_init() > > Use write() and don't handle EAGAIN: *unprepared* for non-blocking. > > 7. dump/dump.c: qmp_dump_guest_memory() > > Use qemu_write_full() - *unprepared* > > 8. chardev/char.c: logfd - *unprepared* after my commit > > 9. block/file-posix.c: raw_co_create() > > May use write() and not handle EAGAIN during raw_regular_truncate() - unprepared. > > > What to do with it? I see several possibilities: > > 1. simply support EAGAIN in qemu_write_full()? Like it was in qemu_chr_write_log() > - with g_usleep(100)? > > 2. switch to qio_channel_file_new_path() + qio_channel_write_all() > > 3. call qemu_set_blocking() on fd for *unprepared* cases IMHO, use of FDs in non-blocking mode should always be an explicit opt-in decision by the code in question. So my preference is to ensure FDs coming via -add-fd get forced into blocking mode, the same as we do for FDs coming via the monitor (or any socket recv when QIO_CHANNEL_READ_FLAG_FD_PRESERVE_BLOCKING is NOT set) With regards, Daniel -- |: https://berrange.com ~~ https://hachyderm.io/@berrange :| |: https://libvirt.org ~~ https://entangle-photo.org :| |: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :| ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 2/3] error-report: make real_time_iso8601() public 2026-02-01 17:36 [PATCH v3 0/3] char: add option to inject timestamps into logfile Vladimir Sementsov-Ogievskiy 2026-02-01 17:36 ` [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() Vladimir Sementsov-Ogievskiy @ 2026-02-01 17:36 ` Vladimir Sementsov-Ogievskiy 2026-02-01 17:36 ` [PATCH v3 3/3] chardev: add logtimestamp option Vladimir Sementsov-Ogievskiy 2026-02-11 11:33 ` [PATCH v3 0/3] char: add option to inject timestamps into logfile Marc-André Lureau 3 siblings, 0 replies; 10+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-02-01 17:36 UTC (permalink / raw) To: marcandre.lureau Cc: pbonzini, armbru, eblake, berrange, vsementsov, yc-core, d-tatianin, qemu-devel, philmd To be reused in the following commit. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Reviewed-by: Markus Armbruster <armbru@redhat.com> --- include/qemu/error-report.h | 6 ++++++ util/error-report.c | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/include/qemu/error-report.h b/include/qemu/error-report.h index 3ae2357fda..dc423d3607 100644 --- a/include/qemu/error-report.h +++ b/include/qemu/error-report.h @@ -74,4 +74,10 @@ extern bool message_with_timestamp; extern bool error_with_guestname; extern const char *error_guest_name; +/* + * Return current datetime in ISO 8601 format. + * Caller is responsible to g_free() the returned string. + */ +char *real_time_iso8601(void); + #endif diff --git a/util/error-report.c b/util/error-report.c index 1b17c11de1..d6b7448183 100644 --- a/util/error-report.c +++ b/util/error-report.c @@ -169,8 +169,7 @@ static void print_loc(void) } } -static char * -real_time_iso8601(void) +char *real_time_iso8601(void) { g_autoptr(GDateTime) dt = g_date_time_new_now_utc(); return g_date_time_format_iso8601(dt); -- 2.52.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 3/3] chardev: add logtimestamp option 2026-02-01 17:36 [PATCH v3 0/3] char: add option to inject timestamps into logfile Vladimir Sementsov-Ogievskiy 2026-02-01 17:36 ` [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() Vladimir Sementsov-Ogievskiy 2026-02-01 17:36 ` [PATCH v3 2/3] error-report: make real_time_iso8601() public Vladimir Sementsov-Ogievskiy @ 2026-02-01 17:36 ` Vladimir Sementsov-Ogievskiy 2026-02-04 13:11 ` Markus Armbruster 2026-02-11 11:33 ` [PATCH v3 0/3] char: add option to inject timestamps into logfile Marc-André Lureau 3 siblings, 1 reply; 10+ messages in thread From: Vladimir Sementsov-Ogievskiy @ 2026-02-01 17:36 UTC (permalink / raw) To: marcandre.lureau Cc: pbonzini, armbru, eblake, berrange, vsementsov, yc-core, d-tatianin, qemu-devel, philmd Add an option to inject timestamps into serial log file. That simplifies debugging a lot, when you can simply compare QEMU logs with guest console logs. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> --- chardev/char.c | 63 ++++++++++++++++++++++++++++++++++++++---- include/chardev/char.h | 2 ++ qapi/char.json | 6 +++- 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/chardev/char.c b/chardev/char.c index 64006a3119..57c65544d0 100644 --- a/chardev/char.c +++ b/chardev/char.c @@ -82,12 +82,8 @@ void qemu_chr_be_event(Chardev *s, QEMUChrEvent event) CHARDEV_GET_CLASS(s)->chr_be_event(s, event); } -static void qemu_chr_write_log(Chardev *s, const uint8_t *buf, size_t len) +static void do_write_log(Chardev *s, const uint8_t *buf, size_t len) { - if (s->logfd < 0) { - return; - } - if (qemu_write_full(s->logfd, buf, len) < len) { /* * qemu_write_full() is defined with G_GNUC_WARN_UNUSED_RESULT, @@ -96,6 +92,55 @@ static void qemu_chr_write_log(Chardev *s, const uint8_t *buf, size_t len) } } +static void do_write_log_timestamps(Chardev *s, const uint8_t *buf, size_t len) +{ + g_autofree char *timestr = NULL; + + while (len) { + size_t i; + + if (s->log_line_start) { + if (!timestr) { + timestr = real_time_iso8601(); + } + do_write_log(s, (const uint8_t *)timestr, strlen(timestr)); + do_write_log(s, (const uint8_t *)" ", 1); + s->log_line_start = false; + } + + for (i = 0; i < len; i++) { + if (buf[i] == '\n') { + break; + } + } + + if (i == len) { + /* not found \n */ + do_write_log(s, buf, len); + return; + } + + i += 1; + do_write_log(s, buf, i); + buf += i; + len -= i; + s->log_line_start = true; + } +} + +static void qemu_chr_write_log(Chardev *s, const uint8_t *buf, size_t len) +{ + if (s->logfd < 0) { + return; + } + + if (s->logtimestamp) { + do_write_log_timestamps(s, buf, len); + } else { + do_write_log(s, buf, len); + } +} + static int qemu_chr_write_buffer(Chardev *s, const uint8_t *buf, int len, int *offset, bool write_all) @@ -249,6 +294,7 @@ static void qemu_char_open(Chardev *chr, ChardevBackend *backend, } else { flags |= O_TRUNC; } + chr->logtimestamp = common->has_logtimestamp && common->logtimestamp; chr->logfd = qemu_create(common->logfile, flags, 0666, errp); if (chr->logfd < 0) { return; @@ -266,6 +312,7 @@ static void char_init(Object *obj) chr->handover_yank_instance = false; chr->logfd = -1; + chr->log_line_start = true; qemu_mutex_init(&chr->chr_write_lock); /* @@ -505,6 +552,9 @@ void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon *backend) backend->logfile = g_strdup(logfile); backend->has_logappend = true; backend->logappend = qemu_opt_get_bool(opts, "logappend", false); + + backend->has_logtimestamp = true; + backend->logtimestamp = qemu_opt_get_bool(opts, "logtimestamp", false); } static const ChardevClass *char_get_class(const char *driver, Error **errp) @@ -956,6 +1006,9 @@ QemuOptsList qemu_chardev_opts = { },{ .name = "logappend", .type = QEMU_OPT_BOOL, + },{ + .name = "logtimestamp", + .type = QEMU_OPT_BOOL, },{ .name = "mouse", .type = QEMU_OPT_BOOL, diff --git a/include/chardev/char.h b/include/chardev/char.h index 192cad67d4..86636b4d09 100644 --- a/include/chardev/char.h +++ b/include/chardev/char.h @@ -64,6 +64,8 @@ struct Chardev { char *label; char *filename; int logfd; + bool logtimestamp; + bool log_line_start; int be_open; /* used to coordinate the chardev-change special-case: */ bool handover_yank_instance; diff --git a/qapi/char.json b/qapi/char.json index 140614f82c..a4abafa680 100644 --- a/qapi/char.json +++ b/qapi/char.json @@ -197,11 +197,15 @@ # @logappend: true to append instead of truncate (default to false to # truncate) # +# @logtimestamp: true to insert timestamps into logfile +# (default false) (since 11.0) +# # Since: 2.6 ## { 'struct': 'ChardevCommon', 'data': { '*logfile': 'str', - '*logappend': 'bool' } } + '*logappend': 'bool', + '*logtimestamp': 'bool' } } ## # @ChardevFile: -- 2.52.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 3/3] chardev: add logtimestamp option 2026-02-01 17:36 ` [PATCH v3 3/3] chardev: add logtimestamp option Vladimir Sementsov-Ogievskiy @ 2026-02-04 13:11 ` Markus Armbruster 0 siblings, 0 replies; 10+ messages in thread From: Markus Armbruster @ 2026-02-04 13:11 UTC (permalink / raw) To: Vladimir Sementsov-Ogievskiy Cc: marcandre.lureau, pbonzini, eblake, berrange, yc-core, d-tatianin, qemu-devel, philmd Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> writes: > Add an option to inject timestamps into serial log file. > That simplifies debugging a lot, when you can simply compare > QEMU logs with guest console logs. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> [...] > diff --git a/qapi/char.json b/qapi/char.json > index 140614f82c..a4abafa680 100644 > --- a/qapi/char.json > +++ b/qapi/char.json > @@ -197,11 +197,15 @@ > # @logappend: true to append instead of truncate (default to false to > # truncate) > # > +# @logtimestamp: true to insert timestamps into logfile > +# (default false) (since 11.0) > +# > # Since: 2.6 > ## > { 'struct': 'ChardevCommon', > 'data': { '*logfile': 'str', > - '*logappend': 'bool' } } > + '*logappend': 'bool', > + '*logtimestamp': 'bool' } } We prefer to separate words with hyphens in member names (see docs/devel/qapi-code-gen.rst), but local consistency trumps that rule. > > ## > # @ChardevFile: QAPI schema Acked-by: Markus Armbruster <armbru@redhat.com> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 0/3] char: add option to inject timestamps into logfile 2026-02-01 17:36 [PATCH v3 0/3] char: add option to inject timestamps into logfile Vladimir Sementsov-Ogievskiy ` (2 preceding siblings ...) 2026-02-01 17:36 ` [PATCH v3 3/3] chardev: add logtimestamp option Vladimir Sementsov-Ogievskiy @ 2026-02-11 11:33 ` Marc-André Lureau 3 siblings, 0 replies; 10+ messages in thread From: Marc-André Lureau @ 2026-02-11 11:33 UTC (permalink / raw) To: Vladimir Sementsov-Ogievskiy Cc: pbonzini, armbru, eblake, berrange, yc-core, d-tatianin, qemu-devel, philmd Hi On Sun, Feb 1, 2026 at 9:38 PM Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> wrote: > > Hi all! > > The ability to correlate the QEMU log and the guest log can be useful > for investigating problems. So, I suggest an option to inject timestimps > into logfile while writing it. > > v3: > 02: fix s/Returns/Return, add r-b by Markus > > Vladimir Sementsov-Ogievskiy (3): > char: qemu_chr_write_log() use qemu_write_full() > error-report: make real_time_iso8601() public > chardev: add logtimestamp option > > chardev/char.c | 73 +++++++++++++++++++++++++++++-------- > include/chardev/char.h | 2 + > include/qemu/error-report.h | 6 +++ > qapi/char.json | 6 ++- > util/error-report.c | 3 +- > 5 files changed, 71 insertions(+), 19 deletions(-) > > -- > 2.52.0 > > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> -- Marc-André Lureau ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-02-25 16:02 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-02-01 17:36 [PATCH v3 0/3] char: add option to inject timestamps into logfile Vladimir Sementsov-Ogievskiy 2026-02-01 17:36 ` [PATCH v3 1/3] char: qemu_chr_write_log() use qemu_write_full() Vladimir Sementsov-Ogievskiy 2026-02-02 11:26 ` Daniel P. Berrangé 2026-02-19 18:07 ` Vladimir Sementsov-Ogievskiy 2026-02-19 18:08 ` Vladimir Sementsov-Ogievskiy 2026-02-25 16:00 ` Daniel P. Berrangé 2026-02-01 17:36 ` [PATCH v3 2/3] error-report: make real_time_iso8601() public Vladimir Sementsov-Ogievskiy 2026-02-01 17:36 ` [PATCH v3 3/3] chardev: add logtimestamp option Vladimir Sementsov-Ogievskiy 2026-02-04 13:11 ` Markus Armbruster 2026-02-11 11:33 ` [PATCH v3 0/3] char: add option to inject timestamps into logfile Marc-André Lureau
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.