Index: trunk/psModules/src/config/pmConfig.c
===================================================================
--- trunk/psModules/src/config/pmConfig.c	(revision 16294)
+++ trunk/psModules/src/config/pmConfig.c	(revision 16339)
@@ -463,6 +463,6 @@
         }
 
-	// set the log file from the config files or -log argument
-	psString logDest = NULL;
+        // Set logging destination first from command line, second from site configuration
+        psString logDest = NULL;        // Logging destination
         argNum = psArgumentGet(*argc, argv, "-log");
         if (argNum > 0) {
@@ -470,29 +470,29 @@
             if (argNum >= *argc) {
                 psWarning("-log command-line switch provided without the required log destination "
-                          "--- ignored.\n");
+                          "--- ignored.");
             } else {
-		logDest = pmConfigConvertFilename (argv[argNum], config, true);
-		psArgumentRemove(argNum, argc, argv);
-            }
-        } else {
-            // Set logging destination
-            psString tmpName = psMetadataLookupStr(&mdok, config->site, "LOGDEST");
-            if (mdok && tmpName && strlen(tmpName) > 0) {
-		logDest = pmConfigConvertFilename (tmpName, config, true);
-            }
-        }
-	if (logDest) {
-	    if (strcasecmp (logDest, "stdout") && strcasecmp (logDest, "stderr")) {
-		// psMessageDestination takes a target of the form file:location
-		// XXX should we modify psMessageDestination to recognize a plain file?
-		psStringPrepend (&logDest, "file:");
-	    }
-	    config->logFD = psMessageDestination(logDest);
-	}
+                logDest = psStringCopy(argv[argNum]);
+                psArgumentRemove(argNum, argc, argv);
+            }
+        }
+        if (!logDest) {
+            logDest = psMemIncrRefCounter(psMetadataLookupStr(&mdok, config->site, "LOGDEST"));
+        }
+        if (logDest) {
+            psString resolved = pmConfigConvertFilename(logDest, config, true); // Resolved filename
+            if (!resolved || strlen(resolved) == 0) {
+                psWarning("Unable to resolve log destination: %s --- ignored", logDest);
+            } else {
+                config->logFD = psMessageDestination(resolved);
+            }
+            psFree(resolved);
+            psFree(logDest);
+        }
         if (!psLogSetDestination(config->logFD)) {
-            psWarning("Unable to set log destination to file number %d (%s) --- ignored", config->logFD, logDest);
-	    // XXX make this a fatal error?
-        }
-	psFree (logDest);
+            psError(PS_ERR_IO, false, "Unable to set log destination to file number %d --- ignored",
+                    config->logFD);
+            psFree(config);
+            return NULL;
+        }
 
         // Set trace levels
@@ -522,5 +522,5 @@
 
         // Set trace destinations
-	psString traceDest = NULL;
+        psString traceDest = NULL;      // Trace destination
         argNum = psArgumentGet(*argc, argv, "-tracedest");
         if (argNum > 0) {
@@ -530,26 +530,27 @@
                           "--- ignored.\n");
             } else {
-		traceDest = pmConfigConvertFilename (argv[argNum], config, true);
+                traceDest = psStringCopy(argv[argNum]);
                 psArgumentRemove(argNum, argc, argv);
             }
-        } else {
-            psString tmpName = psMetadataLookupStr(&mdok, config->site, "TRACEDEST");
-            if (mdok && tmpName && strlen(tmpName) > 0) {
-		traceDest = pmConfigConvertFilename (tmpName, config, true);
-                psTrace("psModules.config", 7, "Setting trace destination to %s\n", traceDest);
-            }
-        }
-	if (traceDest) {
-	    if (strcasecmp (traceDest, "stdout") && strcasecmp (traceDest, "stderr")) {
-		// psMessageDestination takes a target of the form file:location
-		// XXX should we modify psMessageDestination to recognize a plain file?
-		psStringPrepend (&traceDest, "file:");
-	    }
-	    config->traceFD = psMessageDestination(traceDest);
-	}
-        if (!psTraceSetDestination(config->traceFD)) {
-            psWarning("Unable to set trace destination to file number %d (%s)\n", config->traceFD, traceDest);
-        }
-	psFree (traceDest);
+        }
+        if (!traceDest) {
+            traceDest = psMemIncrRefCounter(psMetadataLookupStr(&mdok, config->site, "TRACEDEST"));
+        }
+        if (traceDest) {
+            psString resolved = pmConfigConvertFilename(traceDest, config, true); // Resolved filename
+            if (!resolved || strlen(resolved) == 0) {
+                psWarning("Unable to resolve trace destination: %s --- ignored", traceDest);
+            } else {
+                config->traceFD = psMessageDestination(resolved);
+            }
+            psFree(resolved);
+            psFree(traceDest);
+        }
+        if (!psLogSetDestination(config->traceFD)) {
+            psError(PS_ERR_IO, false, "Unable to set trace destination to file number %d --- ignored",
+                    config->traceFD);
+            psFree(config);
+            return NULL;
+        }
 
         // Allow command line options to override defaults for logging.
@@ -1060,5 +1061,5 @@
                 }
             } else {
-	      // XXX have to be careful with this construction: it catches other errors cluttering up the stack...
+              // XXX have to be careful with this construction: it catches other errors cluttering up the stack...
                 psErr *error = psErrorLast();
                 if (error->code != PS_ERR_NONE) {
