Looks good, thanks.

Ethan

On Tue, May 22, 2012 at 5:19 PM, Ben Pfaff <b...@nicira.com> wrote:
> This will be more useful later when we introduces "worker" subprocesses.
> I don't have any current plans to introduce threading, but I can't
> think of a disadvantage to wording this in a general manner.
>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
>  NEWS                      |    4 +++-
>  lib/daemon.c              |    9 +++------
>  lib/util.c                |   14 +++++++++++++-
>  lib/util.h                |    1 +
>  lib/vlog.c                |    8 ++++++++
>  lib/vlog.h                |   10 +++++-----
>  utilities/ovs-appctl.8.in |   10 ++++++++++
>  7 files changed, 43 insertions(+), 13 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index f8f09e6..5edd87b 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -1,6 +1,8 @@
>  post-v1.7.0
>  ------------------------
> -
> +    - New %t and %T log escapes to identify the subprogram within a
> +      cooperating group of processes or threads that emitted a log message.
> +      The default log patterns now include this information.
>
>  v1.7.0 - xx xxx xxxx
>  ------------------------
> diff --git a/lib/daemon.c b/lib/daemon.c
> index 6725683..ecca606 100644
> --- a/lib/daemon.c
> +++ b/lib/daemon.c
> @@ -351,13 +351,11 @@ static void
>  monitor_daemon(pid_t daemon_pid)
>  {
>     /* XXX Should log daemon's stderr output at startup time. */
> -    const char *saved_program_name;
>     time_t last_restart;
>     char *status_msg;
>     int crashes;
>
> -    saved_program_name = program_name;
> -    program_name = xasprintf("monitor(%s)", program_name);
> +    subprogram_name = "monitor";
>     status_msg = xstrdup("healthy");
>     last_restart = TIME_MIN;
>     crashes = 0;
> @@ -366,7 +364,7 @@ monitor_daemon(pid_t daemon_pid)
>         int status;
>
>         proctitle_set("%s: monitoring pid %lu (%s)",
> -                      saved_program_name, (unsigned long int) daemon_pid,
> +                      program_name, (unsigned long int) daemon_pid,
>                       status_msg);
>
>         do {
> @@ -428,8 +426,7 @@ monitor_daemon(pid_t daemon_pid)
>
>     /* Running in new daemon process. */
>     proctitle_restore();
> -    free((char *) program_name);
> -    program_name = saved_program_name;
> +    subprogram_name = "";
>  }
>
>  /* Close standard file descriptors (except any that the client has requested 
> we
> diff --git a/lib/util.c b/lib/util.c
> index de3cf3c..bc5fa98 100644
> --- a/lib/util.c
> +++ b/lib/util.c
> @@ -34,7 +34,14 @@ VLOG_DEFINE_THIS_MODULE(util);
>
>  COVERAGE_DEFINE(util_xalloc);
>
> +/* argv[0] without directory names. */
>  const char *program_name;
> +
> +/* Ordinarily "" but set to "monitor" for a monitor process or "worker" for a
> + * worker process. */
> +const char *subprogram_name = "";
> +
> +/* --version option output. */
>  static char *program_version;
>
>  void
> @@ -243,7 +250,12 @@ ovs_error_valist(int err_no, const char *format, va_list 
> args)
>  {
>     int save_errno = errno;
>
> -    fprintf(stderr, "%s: ", program_name);
> +    if (subprogram_name[0]) {
> +        fprintf(stderr, "%s(%s): ", program_name, subprogram_name);
> +    } else {
> +        fprintf(stderr, "%s: ", program_name);
> +    }
> +
>     vfprintf(stderr, format, args);
>     if (err_no != 0) {
>         fprintf(stderr, " (%s)", ovs_retval_to_string(err_no));
> diff --git a/lib/util.h b/lib/util.h
> index 1bdaeee..dd86de2 100644
> --- a/lib/util.h
> +++ b/lib/util.h
> @@ -62,6 +62,7 @@
>  #endif
>
>  extern const char *program_name;
> +extern const char *subprogram_name;
>
>  /* Returns the number of elements in ARRAY. */
>  #define ARRAY_SIZE(ARRAY) (sizeof ARRAY / sizeof *ARRAY)
> diff --git a/lib/vlog.c b/lib/vlog.c
> index a7d9e48..4c12007 100644
> --- a/lib/vlog.c
> +++ b/lib/vlog.c
> @@ -646,6 +646,14 @@ format_log_message(const struct vlog_module *module, 
> enum vlog_level level,
>         case 'r':
>             ds_put_format(s, "%lld", time_msec() - time_boot_msec());
>             break;
> +        case 't':
> +            ds_put_cstr(s, subprogram_name[0] ? subprogram_name : "main");
> +            break;
> +        case 'T':
> +            if (subprogram_name[0]) {
> +                ds_put_format(s, "(%s)", subprogram_name);
> +            }
> +            break;
>         default:
>             ds_put_char(s, p[-1]);
>             break;
> diff --git a/lib/vlog.h b/lib/vlog.h
> index 2dce3c6..3b00512 100644
> --- a/lib/vlog.h
> +++ b/lib/vlog.h
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
> + * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -49,10 +49,10 @@ const char *vlog_get_level_name(enum vlog_level);
>  enum vlog_level vlog_get_level_val(const char *name);
>
>  /* Facilities that we can log to. */
> -#define VLOG_FACILITIES                                         \
> -    VLOG_FACILITY(SYSLOG, "%05N|%c|%p|%m")                      \
> -    VLOG_FACILITY(CONSOLE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c|%p|%m")  \
> -    VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c|%p|%m")
> +#define VLOG_FACILITIES                                                 \
> +    VLOG_FACILITY(SYSLOG, "%05N|%c%T|%p|%m")                            \
> +    VLOG_FACILITY(CONSOLE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m")    \
> +    VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m")
>  enum vlog_facility {
>  #define VLOG_FACILITY(NAME, PATTERN) VLF_##NAME,
>     VLOG_FACILITIES
> diff --git a/utilities/ovs-appctl.8.in b/utilities/ovs-appctl.8.in
> index c2ed26b..7edd182 100644
> --- a/utilities/ovs-appctl.8.in
> +++ b/utilities/ovs-appctl.8.in
> @@ -187,6 +187,16 @@ The program's process ID (pid), as a decimal number.
>  The number of milliseconds elapsed from the start of the application
>  to the time the message was logged.
>  .
> +.IP \fB%t\fR
> +The subprogram name, that is, an identifying name for the process or
> +thread that emitted the log message, such as \fBmonitor\fR for the
> +process used for \fB\-\-monitor\fR or \fBmain\fR for the primary
> +process or thread in a program.
> +.
> +.IP \fB%T\fR
> +The subprogram name enclosed in parentheses, e.g. \fB(monitor)\fR, or
> +the empty string for the primary process or thread in a program.
> +.
>  .IP \fB%%\fR
>  A literal \fB%\fR.
>  .RE
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to