Index: trunk/archive/pslib/src/Utils/logmsg.c
===================================================================
--- trunk/archive/pslib/src/Utils/logmsg.c	(revision 141)
+++ trunk/archive/pslib/src/Utils/logmsg.c	(revision 174)
@@ -56,4 +56,53 @@
 
 /*****************************************************************************/
+/*
+ * Set the format of psLogMsg output.
+ *
+ * More precisely, provide a string consisting of the letters H (host), L (level), M (message),
+ * N (name), and T (time).  The default is "HLMNT"
+ */
+static int log_time = 1, log_host = 1, log_level = 1, log_name = 1, log_msg = 1;
+
+void psSetLogFormat(const char *fmt)
+{
+    int nlog_time, nlog_host, nlog_level, nlog_name, nlog_msg; // new values of log_time etc.
+
+    nlog_host = nlog_level = nlog_msg = nlog_name = nlog_time = 0; // don't log anything
+    for (const char *ptr = fmt; *ptr != '\0'; ptr++) {
+	switch (*ptr) {
+	  case 'H': case 'h':
+	    nlog_host = 1;
+	    break;
+	  case 'L': case 'l':
+	    nlog_level = 1;
+	    break;
+	  case 'M': case 'm':
+	    nlog_msg = 1;
+	    break;
+	  case 'N': case 'n':
+	    nlog_name = 1;
+	    break;
+	  case 'T': case 't':
+	    nlog_time = 1;
+	    break;
+	  default:
+	    psError(__func__, "Unknown logging keyword %c", *ptr);
+	    break;
+	}
+    }
+
+    if (!nlog_msg) {
+	psTrace("utils.logMsg", 1, "You must at least log error messages (You chose \"%s\")", fmt);
+    }
+
+    log_host = nlog_host;
+    log_level = nlog_level;
+    log_msg = nlog_msg;
+    log_name = nlog_name;
+    log_time = nlog_time;
+}
+
+
+/*****************************************************************************/
 #if !defined(HOST_NAME_MAX)		// should be in limits.h
 #  define HOST_NAME_MAX 256
@@ -109,12 +158,40 @@
 
     char head[HOST_NAME_MAX + 40];	// yes, this is long enough
+    char *head_ptr = head;		// where we've got to in head
     time_t clock = time(NULL);
     struct tm *utc = gmtime(&clock);
 
-    sprintf(head, "%4d:%02d:%02d %02d:%02d:%02dZ|%-20s|%c|%-15s|",
-	    utc->tm_year + 1900, utc->tm_mon + 1, utc->tm_mday,
-	    utc->tm_hour, utc->tm_min, utc->tm_sec,
-	    hostname, clevel, name);
-
+    if (log_time) {
+	sprintf(head_ptr, "%4d:%02d:%02d %02d:%02d:%02dZ",
+		utc->tm_year + 1900, utc->tm_mon + 1, utc->tm_mday,
+		utc->tm_hour, utc->tm_min, utc->tm_sec);
+	head_ptr += strlen(head_ptr);
+    }
+    if (log_host) {
+	if (head_ptr > head) {
+	    *head_ptr++ = '|';
+	}
+	sprintf(head_ptr, "%-20s", hostname);
+	head_ptr += strlen(head_ptr);
+    }
+    if (log_level) {
+	if (head_ptr > head) {
+	    *head_ptr++ = '|';
+	}
+	sprintf(head_ptr, "%c", clevel);
+	head_ptr += strlen(head_ptr);
+    }
+    if (log_name) {
+	if (head_ptr > head) {
+	    *head_ptr++ = '|';
+	}
+	sprintf(head_ptr, "%-15s", name);
+	head_ptr += strlen(head_ptr);
+    }
+    if (head_ptr > head) {
+	*head_ptr++ = '|';
+    }
+    *head_ptr = '\0';
+    
     switch (logDest) {
       case PS_LOG_TO_STDOUT:
@@ -139,6 +216,4 @@
 	abort();
     }
-    
-    va_end(ap);
 }
 
@@ -149,4 +224,5 @@
 
     p_psVLogMsg(name, level, fmt, ap);
+    va_end(ap);
 }
 
@@ -156,8 +232,9 @@
 int main(void)
 {
-    psSetTraceLevel("utils.logMsg", 10);
+    psSetTraceLevel("utils.logMsg", 1);
     
     psSetLogDestination(PS_LOG_TO_STDERR);
     psSetLogLevel(PS_LOG_INFO);
+    psSetLogFormat("NM");
     
     psLogMsg("aaa", PS_LOG_INFO, "Hello World\n");
