diff mbox series

[2/2] scripts/tracetool: Add plainlog backend

Message ID 20200617134505.9D06E7482D3@zero.eik.bme.hu
State New
Headers show
Series None | expand

Commit Message

BALATON Zoltan June 17, 2020, 1:36 p.m. UTC
Add a backend that is the same as the log backend but omits the
process id and timestamp so logs are easier to read and diff-able.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---
 scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 scripts/tracetool/backend/plainlog.py

Comments

Alex Bennée June 17, 2020, 3:41 p.m. UTC | #1
BALATON Zoltan <balaton@eik.bme.hu> writes:

Did this patch get separated from a larger series (2/2)?

> Add a backend that is the same as the log backend but omits the
> process id and timestamp so logs are easier to read and diff-able.

I'd argue for this to be the behaviour of plain log (given it's mixing
with other log output). If not then maybe plainlog would be the default
log type if nothing is passed to configure?

>
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> ---
>  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
>  1 file changed, 48 insertions(+)
>  create mode 100644 scripts/tracetool/backend/plainlog.py
>
> diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
> new file mode 100644
> index 0000000000..40bbfa6d76
> --- /dev/null
> +++ b/scripts/tracetool/backend/plainlog.py
> @@ -0,0 +1,48 @@
> +# -*- coding: utf-8 -*-
> +
> +"""
> +Stderr built-in backend, plain log without proc ID and time.
> +"""
> +
> +__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
> +__copyright__  = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>"
> +__license__    = "GPL version 2 or (at your option) any later version"
> +
> +__maintainer__ = "Stefan Hajnoczi"
> +__email__      = "stefanha@linux.vnet.ibm.com"
> +
> +
> +from tracetool import out
> +
> +
> +PUBLIC = True
> +
> +
> +def generate_h_begin(events, group):
> +    out('#include "qemu/log-for-trace.h"',
> +        '')
> +
> +
> +def generate_h(event, group):
> +    argnames = ", ".join(event.args.names())
> +    if len(event.args) > 0:
> +        argnames = ", " + argnames
> +
> +    if "vcpu" in event.properties:
> +        # already checked on the generic format code
> +        cond = "true"
> +    else:
> +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
> +
> +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
> +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
> +        '    }',
> +        cond=cond,
> +        name=event.name,
> +        fmt=event.fmt.rstrip("\n"),
> +        argnames=argnames)
> +
> +
> +def generate_h_backend_dstate(event, group):
> +    out('    trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
> +        event_id="TRACE_" + event.name.upper())
BALATON Zoltan June 17, 2020, 5:53 p.m. UTC | #2
On Wed, 17 Jun 2020, Alex Bennée wrote:
> Did this patch get separated from a larger series (2/2)?

No sorry, just used format-patch for two unrelated patches and forgot to 
remove this. This patch is standalone and Philippe pointed out the other 
one labelled 1/2 is not needed as there's already a similar patch queued.

>> Add a backend that is the same as the log backend but omits the
>> process id and timestamp so logs are easier to read and diff-able.
>
> I'd argue for this to be the behaviour of plain log (given it's mixing
> with other log output). If not then maybe plainlog would be the default
> log type if nothing is passed to configure?

I'd like if the default log backend was not adding timestamps and random 
numbers to log messages for easier digesting and diffing but the current 
log backend does that and maybe there are people who like that default so 
instead of making them need to change their ways I'm proposing this 
backend that those who like plain logs can use instead. That's a less 
disruptive change than changing the default log backend but if others want 
that I'm fine with that too.

Regards,
BALATON Zoltan

>> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
>> ---
>>  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
>>  1 file changed, 48 insertions(+)
>>  create mode 100644 scripts/tracetool/backend/plainlog.py
>>
>> diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
>> new file mode 100644
>> index 0000000000..40bbfa6d76
>> --- /dev/null
>> +++ b/scripts/tracetool/backend/plainlog.py
>> @@ -0,0 +1,48 @@
>> +# -*- coding: utf-8 -*-
>> +
>> +"""
>> +Stderr built-in backend, plain log without proc ID and time.
>> +"""
>> +
>> +__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
>> +__copyright__  = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>"
>> +__license__    = "GPL version 2 or (at your option) any later version"
>> +
>> +__maintainer__ = "Stefan Hajnoczi"
>> +__email__      = "stefanha@linux.vnet.ibm.com"
>> +
>> +
>> +from tracetool import out
>> +
>> +
>> +PUBLIC = True
>> +
>> +
>> +def generate_h_begin(events, group):
>> +    out('#include "qemu/log-for-trace.h"',
>> +        '')
>> +
>> +
>> +def generate_h(event, group):
>> +    argnames = ", ".join(event.args.names())
>> +    if len(event.args) > 0:
>> +        argnames = ", " + argnames
>> +
>> +    if "vcpu" in event.properties:
>> +        # already checked on the generic format code
>> +        cond = "true"
>> +    else:
>> +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
>> +
>> +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
>> +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
>> +        '    }',
>> +        cond=cond,
>> +        name=event.name,
>> +        fmt=event.fmt.rstrip("\n"),
>> +        argnames=argnames)
>> +
>> +
>> +def generate_h_backend_dstate(event, group):
>> +    out('    trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
>> +        event_id="TRACE_" + event.name.upper())
>
>
>
Stefan Hajnoczi June 18, 2020, 7:31 a.m. UTC | #3
On Wed, Jun 17, 2020 at 03:36:29PM +0200, BALATON Zoltan wrote:
> Add a backend that is the same as the log backend but omits the
> process id and timestamp so logs are easier to read and diff-able.
> 
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> ---
>  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
>  1 file changed, 48 insertions(+)
>  create mode 100644 scripts/tracetool/backend/plainlog.py
> 
> diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
> new file mode 100644
> index 0000000000..40bbfa6d76
> --- /dev/null
> +++ b/scripts/tracetool/backend/plainlog.py
> @@ -0,0 +1,48 @@
> +# -*- coding: utf-8 -*-
> +
> +"""
> +Stderr built-in backend, plain log without proc ID and time.
> +"""
> +
> +__author__     = "Llu????s Vilanova <vilanova@ac.upc.edu>"
> +__copyright__  = "Copyright 2012-2017, Llu????s Vilanova <vilanova@ac.upc.edu>"

There is a Unicode issue here, Lluís' name is not printed correctly.

> +__license__    = "GPL version 2 or (at your option) any later version"
> +
> +__maintainer__ = "Stefan Hajnoczi"
> +__email__      = "stefanha@linux.vnet.ibm.com"
> +
> +
> +from tracetool import out
> +
> +
> +PUBLIC = True
> +
> +
> +def generate_h_begin(events, group):
> +    out('#include "qemu/log-for-trace.h"',
> +        '')
> +
> +
> +def generate_h(event, group):
> +    argnames = ", ".join(event.args.names())
> +    if len(event.args) > 0:
> +        argnames = ", " + argnames
> +
> +    if "vcpu" in event.properties:
> +        # already checked on the generic format code
> +        cond = "true"
> +    else:
> +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
> +
> +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
> +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
> +        '    }',
> +        cond=cond,
> +        name=event.name,
> +        fmt=event.fmt.rstrip("\n"),
> +        argnames=argnames)

It is not necessary to introduce a new backend. There could be an option
that controls whether or not the timestamp/tid is printed. For example,
-trace timestamp=off or maybe the timestmap/tid can be integrated into
qemu_log() itself so that it's used more consistently and a -d timestamp
option enables it.
Daniel P. Berrangé June 18, 2020, 9:07 a.m. UTC | #4
On Thu, Jun 18, 2020 at 08:31:24AM +0100, Stefan Hajnoczi wrote:
> On Wed, Jun 17, 2020 at 03:36:29PM +0200, BALATON Zoltan wrote:
> > Add a backend that is the same as the log backend but omits the
> > process id and timestamp so logs are easier to read and diff-able.
> > 
> > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> > ---
> >  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
> >  1 file changed, 48 insertions(+)
> >  create mode 100644 scripts/tracetool/backend/plainlog.py
> > 
> > diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
> > new file mode 100644
> > index 0000000000..40bbfa6d76
> > --- /dev/null
> > +++ b/scripts/tracetool/backend/plainlog.py
> > @@ -0,0 +1,48 @@
> > +# -*- coding: utf-8 -*-
> > +
> > +"""
> > +Stderr built-in backend, plain log without proc ID and time.
> > +"""
> > +
> > +__author__     = "Llu????s Vilanova <vilanova@ac.upc.edu>"
> > +__copyright__  = "Copyright 2012-2017, Llu????s Vilanova <vilanova@ac.upc.edu>"
> 
> There is a Unicode issue here, Lluís' name is not printed correctly.
> 
> > +__license__    = "GPL version 2 or (at your option) any later version"
> > +
> > +__maintainer__ = "Stefan Hajnoczi"
> > +__email__      = "stefanha@linux.vnet.ibm.com"
> > +
> > +
> > +from tracetool import out
> > +
> > +
> > +PUBLIC = True
> > +
> > +
> > +def generate_h_begin(events, group):
> > +    out('#include "qemu/log-for-trace.h"',
> > +        '')
> > +
> > +
> > +def generate_h(event, group):
> > +    argnames = ", ".join(event.args.names())
> > +    if len(event.args) > 0:
> > +        argnames = ", " + argnames
> > +
> > +    if "vcpu" in event.properties:
> > +        # already checked on the generic format code
> > +        cond = "true"
> > +    else:
> > +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
> > +
> > +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
> > +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
> > +        '    }',
> > +        cond=cond,
> > +        name=event.name,
> > +        fmt=event.fmt.rstrip("\n"),
> > +        argnames=argnames)
> 
> It is not necessary to introduce a new backend. There could be an option
> that controls whether or not the timestamp/tid is printed. For example,
> -trace timestamp=off or maybe the timestmap/tid can be integrated into
> qemu_log() itself so that it's used more consistently and a -d timestamp
> option enables it.

QEMU already has a "-msg timestamp=on|off" option that controls whether
error reports on stderr get a timestamp. I think it is probably reasonable
for this existing option to apply to anything QEMU prints to stdout/err,
and thus we could wire it up for qemu_log().

Regards,
Daniel
BALATON Zoltan June 18, 2020, 10:30 a.m. UTC | #5
On Thu, 18 Jun 2020, Daniel P. Berrangé wrote:
> On Thu, Jun 18, 2020 at 08:31:24AM +0100, Stefan Hajnoczi wrote:
>> On Wed, Jun 17, 2020 at 03:36:29PM +0200, BALATON Zoltan wrote:
>>> Add a backend that is the same as the log backend but omits the
>>> process id and timestamp so logs are easier to read and diff-able.
>>>
>>> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
>>> ---
>>>  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
>>>  1 file changed, 48 insertions(+)
>>>  create mode 100644 scripts/tracetool/backend/plainlog.py
>>>
>>> diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
>>> new file mode 100644
>>> index 0000000000..40bbfa6d76
>>> --- /dev/null
>>> +++ b/scripts/tracetool/backend/plainlog.py
>>> @@ -0,0 +1,48 @@
>>> +# -*- coding: utf-8 -*-
>>> +
>>> +"""
>>> +Stderr built-in backend, plain log without proc ID and time.
>>> +"""
>>> +
>>> +__author__     = "Llu????s Vilanova <vilanova@ac.upc.edu>"
>>> +__copyright__  = "Copyright 2012-2017, Llu????s Vilanova <vilanova@ac.upc.edu>"
>>
>> There is a Unicode issue here, Lluís' name is not printed correctly.

It's just an issue with the email formatting, should be OK if you read it 
in UTF8 which is the default on most machines nowaday just forgot to add 
corresponding email header.

>>> +__license__    = "GPL version 2 or (at your option) any later version"
>>> +
>>> +__maintainer__ = "Stefan Hajnoczi"
>>> +__email__      = "stefanha@linux.vnet.ibm.com"
>>> +
>>> +
>>> +from tracetool import out
>>> +
>>> +
>>> +PUBLIC = True
>>> +
>>> +
>>> +def generate_h_begin(events, group):
>>> +    out('#include "qemu/log-for-trace.h"',
>>> +        '')
>>> +
>>> +
>>> +def generate_h(event, group):
>>> +    argnames = ", ".join(event.args.names())
>>> +    if len(event.args) > 0:
>>> +        argnames = ", " + argnames
>>> +
>>> +    if "vcpu" in event.properties:
>>> +        # already checked on the generic format code
>>> +        cond = "true"
>>> +    else:
>>> +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
>>> +
>>> +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
>>> +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
>>> +        '    }',
>>> +        cond=cond,
>>> +        name=event.name,
>>> +        fmt=event.fmt.rstrip("\n"),
>>> +        argnames=argnames)
>>
>> It is not necessary to introduce a new backend. There could be an option
>> that controls whether or not the timestamp/tid is printed. For example,
>> -trace timestamp=off or maybe the timestmap/tid can be integrated into
>> qemu_log() itself so that it's used more consistently and a -d timestamp
>> option enables it.
>
> QEMU already has a "-msg timestamp=on|off" option that controls whether
> error reports on stderr get a timestamp. I think it is probably reasonable
> for this existing option to apply to anything QEMU prints to stdout/err,
> and thus we could wire it up for qemu_log().

I don't know how to do that so can you submit a patch please? It would be 
preferable if an additional command line option wasn't necessary to print 
logs without timestamps (so changing the defailt to that if you don't mind 
changing current trace behaviour) or the default could be set at configure 
time like with this patch --enable-trace-backends=plainlog sets that 
(although this does not have option to change it at runtime).

Regards,
BALATON Zoltan
Stefan Hajnoczi June 18, 2020, 3:35 p.m. UTC | #6
On Thu, Jun 18, 2020 at 10:07:41AM +0100, Daniel P. Berrangé wrote:
> On Thu, Jun 18, 2020 at 08:31:24AM +0100, Stefan Hajnoczi wrote:
> > On Wed, Jun 17, 2020 at 03:36:29PM +0200, BALATON Zoltan wrote:
> > > Add a backend that is the same as the log backend but omits the
> > > process id and timestamp so logs are easier to read and diff-able.
> > > 
> > > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> > > ---
> > >  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
> > >  1 file changed, 48 insertions(+)
> > >  create mode 100644 scripts/tracetool/backend/plainlog.py
> > > 
> > > diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
> > > new file mode 100644
> > > index 0000000000..40bbfa6d76
> > > --- /dev/null
> > > +++ b/scripts/tracetool/backend/plainlog.py
> > > @@ -0,0 +1,48 @@
> > > +# -*- coding: utf-8 -*-
> > > +
> > > +"""
> > > +Stderr built-in backend, plain log without proc ID and time.
> > > +"""
> > > +
> > > +__author__     = "Llu????s Vilanova <vilanova@ac.upc.edu>"
> > > +__copyright__  = "Copyright 2012-2017, Llu????s Vilanova <vilanova@ac.upc.edu>"
> > 
> > There is a Unicode issue here, Lluís' name is not printed correctly.
> > 
> > > +__license__    = "GPL version 2 or (at your option) any later version"
> > > +
> > > +__maintainer__ = "Stefan Hajnoczi"
> > > +__email__      = "stefanha@linux.vnet.ibm.com"
> > > +
> > > +
> > > +from tracetool import out
> > > +
> > > +
> > > +PUBLIC = True
> > > +
> > > +
> > > +def generate_h_begin(events, group):
> > > +    out('#include "qemu/log-for-trace.h"',
> > > +        '')
> > > +
> > > +
> > > +def generate_h(event, group):
> > > +    argnames = ", ".join(event.args.names())
> > > +    if len(event.args) > 0:
> > > +        argnames = ", " + argnames
> > > +
> > > +    if "vcpu" in event.properties:
> > > +        # already checked on the generic format code
> > > +        cond = "true"
> > > +    else:
> > > +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
> > > +
> > > +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
> > > +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
> > > +        '    }',
> > > +        cond=cond,
> > > +        name=event.name,
> > > +        fmt=event.fmt.rstrip("\n"),
> > > +        argnames=argnames)
> > 
> > It is not necessary to introduce a new backend. There could be an option
> > that controls whether or not the timestamp/tid is printed. For example,
> > -trace timestamp=off or maybe the timestmap/tid can be integrated into
> > qemu_log() itself so that it's used more consistently and a -d timestamp
> > option enables it.
> 
> QEMU already has a "-msg timestamp=on|off" option that controls whether
> error reports on stderr get a timestamp. I think it is probably reasonable
> for this existing option to apply to anything QEMU prints to stdout/err,
> and thus we could wire it up for qemu_log().

I thought about that but the features are somewhat unrelated.

If we unify them, how about making the timestamp/tid apply to *all*
qemu_log() output, not just tracing?

Stefan
Daniel P. Berrangé June 18, 2020, 3:43 p.m. UTC | #7
On Thu, Jun 18, 2020 at 04:35:16PM +0100, Stefan Hajnoczi wrote:
> On Thu, Jun 18, 2020 at 10:07:41AM +0100, Daniel P. Berrangé wrote:
> > On Thu, Jun 18, 2020 at 08:31:24AM +0100, Stefan Hajnoczi wrote:
> > > On Wed, Jun 17, 2020 at 03:36:29PM +0200, BALATON Zoltan wrote:
> > > > Add a backend that is the same as the log backend but omits the
> > > > process id and timestamp so logs are easier to read and diff-able.
> > > > 
> > > > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> > > > ---
> > > >  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
> > > >  1 file changed, 48 insertions(+)
> > > >  create mode 100644 scripts/tracetool/backend/plainlog.py
> > > > 
> > > > diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
> > > > new file mode 100644
> > > > index 0000000000..40bbfa6d76
> > > > --- /dev/null
> > > > +++ b/scripts/tracetool/backend/plainlog.py
> > > > @@ -0,0 +1,48 @@
> > > > +# -*- coding: utf-8 -*-
> > > > +
> > > > +"""
> > > > +Stderr built-in backend, plain log without proc ID and time.
> > > > +"""
> > > > +
> > > > +__author__     = "Llu????s Vilanova <vilanova@ac.upc.edu>"
> > > > +__copyright__  = "Copyright 2012-2017, Llu????s Vilanova <vilanova@ac.upc.edu>"
> > > 
> > > There is a Unicode issue here, Lluís' name is not printed correctly.
> > > 
> > > > +__license__    = "GPL version 2 or (at your option) any later version"
> > > > +
> > > > +__maintainer__ = "Stefan Hajnoczi"
> > > > +__email__      = "stefanha@linux.vnet.ibm.com"
> > > > +
> > > > +
> > > > +from tracetool import out
> > > > +
> > > > +
> > > > +PUBLIC = True
> > > > +
> > > > +
> > > > +def generate_h_begin(events, group):
> > > > +    out('#include "qemu/log-for-trace.h"',
> > > > +        '')
> > > > +
> > > > +
> > > > +def generate_h(event, group):
> > > > +    argnames = ", ".join(event.args.names())
> > > > +    if len(event.args) > 0:
> > > > +        argnames = ", " + argnames
> > > > +
> > > > +    if "vcpu" in event.properties:
> > > > +        # already checked on the generic format code
> > > > +        cond = "true"
> > > > +    else:
> > > > +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
> > > > +
> > > > +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
> > > > +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
> > > > +        '    }',
> > > > +        cond=cond,
> > > > +        name=event.name,
> > > > +        fmt=event.fmt.rstrip("\n"),
> > > > +        argnames=argnames)
> > > 
> > > It is not necessary to introduce a new backend. There could be an option
> > > that controls whether or not the timestamp/tid is printed. For example,
> > > -trace timestamp=off or maybe the timestmap/tid can be integrated into
> > > qemu_log() itself so that it's used more consistently and a -d timestamp
> > > option enables it.
> > 
> > QEMU already has a "-msg timestamp=on|off" option that controls whether
> > error reports on stderr get a timestamp. I think it is probably reasonable
> > for this existing option to apply to anything QEMU prints to stdout/err,
> > and thus we could wire it up for qemu_log().
> 
> I thought about that but the features are somewhat unrelated.
> 
> If we unify them, how about making the timestamp/tid apply to *all*
> qemu_log() output, not just tracing?

That's exactly what I intended.

Essentially if QEMU is going to add timestamps to things it writes to
stdout/err, then it should do that universally for all parts of the code
base that use stdio. This means error_report(), qemu_log(), and any
other places that are relevant wrt stdio.

Having separate timestamp on/off switches for each feature is not
desirable.


Regards,
Daniel
Stefan Hajnoczi June 23, 2020, 2:47 p.m. UTC | #8
On Thu, Jun 18, 2020 at 04:43:23PM +0100, Daniel P. Berrangé wrote:
> On Thu, Jun 18, 2020 at 04:35:16PM +0100, Stefan Hajnoczi wrote:
> > On Thu, Jun 18, 2020 at 10:07:41AM +0100, Daniel P. Berrangé wrote:
> > > On Thu, Jun 18, 2020 at 08:31:24AM +0100, Stefan Hajnoczi wrote:
> > > > On Wed, Jun 17, 2020 at 03:36:29PM +0200, BALATON Zoltan wrote:
> > > > > Add a backend that is the same as the log backend but omits the
> > > > > process id and timestamp so logs are easier to read and diff-able.
> > > > > 
> > > > > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> > > > > ---
> > > > >  scripts/tracetool/backend/plainlog.py | 48 +++++++++++++++++++++++++++
> > > > >  1 file changed, 48 insertions(+)
> > > > >  create mode 100644 scripts/tracetool/backend/plainlog.py
> > > > > 
> > > > > diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
> > > > > new file mode 100644
> > > > > index 0000000000..40bbfa6d76
> > > > > --- /dev/null
> > > > > +++ b/scripts/tracetool/backend/plainlog.py
> > > > > @@ -0,0 +1,48 @@
> > > > > +# -*- coding: utf-8 -*-
> > > > > +
> > > > > +"""
> > > > > +Stderr built-in backend, plain log without proc ID and time.
> > > > > +"""
> > > > > +
> > > > > +__author__     = "Llu????s Vilanova <vilanova@ac.upc.edu>"
> > > > > +__copyright__  = "Copyright 2012-2017, Llu????s Vilanova <vilanova@ac.upc.edu>"
> > > > 
> > > > There is a Unicode issue here, Lluís' name is not printed correctly.
> > > > 
> > > > > +__license__    = "GPL version 2 or (at your option) any later version"
> > > > > +
> > > > > +__maintainer__ = "Stefan Hajnoczi"
> > > > > +__email__      = "stefanha@linux.vnet.ibm.com"
> > > > > +
> > > > > +
> > > > > +from tracetool import out
> > > > > +
> > > > > +
> > > > > +PUBLIC = True
> > > > > +
> > > > > +
> > > > > +def generate_h_begin(events, group):
> > > > > +    out('#include "qemu/log-for-trace.h"',
> > > > > +        '')
> > > > > +
> > > > > +
> > > > > +def generate_h(event, group):
> > > > > +    argnames = ", ".join(event.args.names())
> > > > > +    if len(event.args) > 0:
> > > > > +        argnames = ", " + argnames
> > > > > +
> > > > > +    if "vcpu" in event.properties:
> > > > > +        # already checked on the generic format code
> > > > > +        cond = "true"
> > > > > +    else:
> > > > > +        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
> > > > > +
> > > > > +    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
> > > > > +        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
> > > > > +        '    }',
> > > > > +        cond=cond,
> > > > > +        name=event.name,
> > > > > +        fmt=event.fmt.rstrip("\n"),
> > > > > +        argnames=argnames)
> > > > 
> > > > It is not necessary to introduce a new backend. There could be an option
> > > > that controls whether or not the timestamp/tid is printed. For example,
> > > > -trace timestamp=off or maybe the timestmap/tid can be integrated into
> > > > qemu_log() itself so that it's used more consistently and a -d timestamp
> > > > option enables it.
> > > 
> > > QEMU already has a "-msg timestamp=on|off" option that controls whether
> > > error reports on stderr get a timestamp. I think it is probably reasonable
> > > for this existing option to apply to anything QEMU prints to stdout/err,
> > > and thus we could wire it up for qemu_log().
> > 
> > I thought about that but the features are somewhat unrelated.
> > 
> > If we unify them, how about making the timestamp/tid apply to *all*
> > qemu_log() output, not just tracing?
> 
> That's exactly what I intended.
> 
> Essentially if QEMU is going to add timestamps to things it writes to
> stdout/err, then it should do that universally for all parts of the code
> base that use stdio. This means error_report(), qemu_log(), and any
> other places that are relevant wrt stdio.
> 
> Having separate timestamp on/off switches for each feature is not
> desirable.

Okay. I'll take a look at this tomorrow.

Thanks!

Stefan
diff mbox series

Patch

diff --git a/scripts/tracetool/backend/plainlog.py b/scripts/tracetool/backend/plainlog.py
new file mode 100644
index 0000000000..40bbfa6d76
--- /dev/null
+++ b/scripts/tracetool/backend/plainlog.py
@@ -0,0 +1,48 @@ 
+# -*- coding: utf-8 -*-
+
+"""
+Stderr built-in backend, plain log without proc ID and time.
+"""
+
+__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
+__copyright__  = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>"
+__license__    = "GPL version 2 or (at your option) any later version"
+
+__maintainer__ = "Stefan Hajnoczi"
+__email__      = "stefanha@linux.vnet.ibm.com"
+
+
+from tracetool import out
+
+
+PUBLIC = True
+
+
+def generate_h_begin(events, group):
+    out('#include "qemu/log-for-trace.h"',
+        '')
+
+
+def generate_h(event, group):
+    argnames = ", ".join(event.args.names())
+    if len(event.args) > 0:
+        argnames = ", " + argnames
+
+    if "vcpu" in event.properties:
+        # already checked on the generic format code
+        cond = "true"
+    else:
+        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
+
+    out('    if (%(cond)s && qemu_loglevel_mask(LOG_TRACE)) {',
+        '        qemu_log("%(name)s " %(fmt)s "\\n" %(argnames)s);',
+        '    }',
+        cond=cond,
+        name=event.name,
+        fmt=event.fmt.rstrip("\n"),
+        argnames=argnames)
+
+
+def generate_h_backend_dstate(event, group):
+    out('    trace_event_get_state_dynamic_by_id(%(event_id)s) || \\',
+        event_id="TRACE_" + event.name.upper())