util: Introduce "subprogram_name" to identify subprocesses and threads.
authorBen Pfaff <blp@nicira.com>
Wed, 18 Jul 2012 17:30:47 +0000 (10:30 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Jul 2012 17:30:47 +0000 (10:30 -0700)
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 <blp@nicira.com>
NEWS
lib/daemon.c
lib/util.c
lib/util.h
lib/vlog.c
lib/vlog.h
utilities/ovs-appctl.8.in

diff --git a/NEWS b/NEWS
index c74f5922b3a8b918549432346613930d43baf654..89554fd6ce8a6ba075d3edfdbe44be3ee4d1f4b7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 post-v1.8.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.8.0 - xx xxx xxxx
index 672568342a76c4bf3d3c8f0d22368c8a4eb352fb..ecca606126f5028842b04e704020ad7f00a1adef 100644 (file)
@@ -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
index de3cf3cb0efe724fbad7699f4357804d5248038e..bc5fa9886ffcfed92adb2da523679f372038a502 100644 (file)
@@ -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));
index 1bdaeee563ba5a9d0bf2b1275a5e6d63dbdb36e5..dd86de2651741c27222eb995db6e53448ca49ce5 100644 (file)
@@ -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)
index d26e61391e58f7fc3b52171f87faf1e0abfc9794..128ed45dcf5b46b6bb6ba6aa650ea5df3f556065 100644 (file)
@@ -653,6 +653,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;
index e15e441d48685e742d7adc1acafc3efbb5e9cb22..9050634e5f95bbdf2d630001f7081197be81fcc5 100644 (file)
@@ -51,10 +51,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
index c2ed26b5d0eee1dba3521d5a95f5775fec0c4641..7edd1823455c6191c7090bdfd0f2f98d7bff5c7f 100644 (file)
@@ -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