diff --git a/include/log_action.h b/include/log_action.h
index a1d52ae7e508beb1ae4e2f36c6e4fca866f02f56..3284a845f18b94c4d78d3aaa773fde4f355d54ba 100644
--- a/include/log_action.h
+++ b/include/log_action.h
@@ -80,7 +80,7 @@ typedef struct log_hooks_t
 	void (*message) (char *msg);
 	void (*vmessage) (char *msg);
 	void (*vmessageflag) (char *msg, int b);
-	void (*trace) (char *msg);
+	void (*trace) (char *msg, ...);
 	void (*dump) (char *msg);
 	void (*setdump) (char *name);
 	void (*closefiles) ();
diff --git a/src/ana/globals.c b/src/ana/globals.c
index 2e91b4fcdf740071a2d6d2bf4ad5139698267c71..1fa9d0e77e21f823575d354ee4cf4f2e786d1453 100644
--- a/src/ana/globals.c
+++ b/src/ana/globals.c
@@ -31,6 +31,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
 
 #include <utils/p2c.h>
+#include <utils/logger.h>
 
 
 #define GLOBALS_G
@@ -892,22 +893,19 @@ int *Ok;
 static void Dataout(data)
 char *data;
 {
-  if (AnaLogglobals->traceflag)
-    fputs(data, *AnaLogglobals->tracefile);
+	tracemessage(data);
 }
 
 
 static void Linefeed()
 {
-  if (AnaLogglobals->traceflag)
-    putc('\n', *AnaLogglobals->tracefile);
+	tracemessage("\n");
 }
 
 
 static void Openfiles()
 {
-  if (!AnaLogglobals->traceopen)
-    (*AnaLogglobals->hook.trace)("anaLOG opening tracefile");
+	(*AnaLogglobals->hook.trace)("anaLOG opening tracefile");
 }
 
 
@@ -919,7 +917,7 @@ void AnaMatdump()
   long FORLIM, FORLIM1;
   AnaMatRec *WITH;
 
-  if (!AnaLogglobals->traceflag)
+  if (!istraceenabled())
     return;
   Openfiles();
   sprintf(STR3, "Iteration # %ld Timestep %g", AnaItercount, AnaDt);
@@ -1025,7 +1023,7 @@ void AnaDiffdump()
   long FORLIM, FORLIM1;
   AnaMatRec *WITH;
 
-  if (!AnaLogglobals->traceflag)
+  if (!istraceenabled())
     return;
   Openfiles();
   FORLIM = AnaSysRow;
diff --git a/src/gate.c b/src/gate.c
index 420fc92f1273de0b154065c1d80076d8e99dfbce..a18752514d0137d56153f322afd2b06508866919 100644
--- a/src/gate.c
+++ b/src/gate.c
@@ -1,6 +1,7 @@
 
 #include <utils/p2c.h>
 #include <graphics/newci.h>
+#include <utils/logger.h>
 #include "logfont.h"
 #include "logglobals.h"
 #include "logstructs.h"
@@ -310,9 +311,7 @@ void chggate(log_grec *gate, int i, log_nrec *oldnode, log_nrec *n)
 	log_grec *g1;
 	short j, k, savepg, pg, x, y, FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Change gate %p pin %d to node %p\n",
-				gate, i, n);
+	tracemessage("Change gate %p pin %d to node %p\n", gate, i, n);
 	j = i;
 	do
 	{
@@ -384,9 +383,7 @@ void chggatepin(log_grec *gate, short i, log_nrec **oldnode, log_nrec **savenode
 	log_grec *g1;
 	short j, x, y, FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Change gate %p pin %d from node %p\n",
-				gate, i, *oldnode);
+	tracemessage("Change gate %p pin %d from node %p\n", gate, i, *oldnode);
 	x = gate->pinpos[i - 1].x;
 	y = gate->pinpos[i - 1].y;
 	hw = gg.pages[gg.curpage - 1]->hwbase;
@@ -441,8 +438,7 @@ void disconnectgate(log_grec *gate)
 	long done[log_maxpins / 32 + 2];
 	short FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Disconnect gate %p\n", gate);
+	tracemessage("Disconnect gate %p\n", gate);
 	stamp(&gate->kind->simtype->netstamp);
 	calltoolgate(gate, act_disconnectgate);
 	oldnode = (log_nrec **)Malloc(gate->kind->numpins * sizeof(log_nrec *));
@@ -535,8 +531,7 @@ int connectgate(log_grec *gate)
 	int success;
 	short FORLIM, FORLIM1;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Connect gate %p, type %s\n", gate, gate->kind->name);
+	tracemessage("Connect gate %p, type %s\n", gate, gate->kind->name);
 	linkgate(&gate);
 	initpinpos(gate);
 	FORLIM = gate->kind->numpins;
diff --git a/src/log.c b/src/log.c
index 964bf22b44c84464033265da5d6aefe550b4f71d..769140af82f671f7925dd4db59d570da0c066f6c 100644
--- a/src/log.c
+++ b/src/log.c
@@ -284,8 +284,7 @@ void report(int num, char *s)
 	clearshowalpha();
 	nc_gotoXY(0, txdown - 1);
 	nc_printf("\215--> Internal error %d in %s\210\n", num, s);
-	if (gg.traceflag)
-		fprintf(tracefile, "--> Internal error %d in %s\n", num, s);
+	tracemessage("--> Internal error %d in %s\n", num, s);
 	m_alpha_on();
 	nc_printf("    Press any key to continue.");
 	ch = m_inkey();
@@ -787,8 +786,7 @@ static void settracename(char *name_)
 	newci_fixfname(name, "text", "");
 	closetrace();
 	strcpy(tracefname, name);
-	if (gg.traceflag)
-		tracemessage("Trace mode ON");
+	tracemessage("Trace mode ON\n");
 }
 
 
@@ -1414,8 +1412,7 @@ log_tool *findsimtype(uchar st)
 
 	sprintf(simname, "%d", st);
 	stp = findtool(simname);
-	if (gg.traceflag)
-		fprintf(tracefile, "Findsimtype of %d gets %p\n", st, stp);
+	tracemessage("Findsimtype of %d gets %p\n", st, stp);
 	if (!stp->ready || !stp->simulator)
 	{
 		rdy = stp->ready;
@@ -2109,8 +2106,7 @@ void doimmedfunction()
 	{
 		getbool(gg.funcarg, &gg.traceflag);
 		vmessageflag("Trace mode ", gg.traceflag);
-		if (gg.traceflag)
-			tracemessage("Trace mode ON");
+		tracemessage("Trace mode ON\n");
 		clearfunc();
 		return;
 	}
@@ -2267,8 +2263,7 @@ void confirmsimtype(log_nrec *n)
 	log_hnrec *hn;
 	short FORLIM, FORLIM1;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Confirm simtype of %ld\n", (long)n);
+	tracemessage("Confirm simtype of %ld\n", (long)n);
 	if (n == NULL || n->simtype->simtype < 8)
 		return;
 	found = false;
@@ -2294,8 +2289,7 @@ void confirmsimtype(log_nrec *n)
 	if (found)
 		return;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Deleting simtype of %ld\n", (long)n);
+	tracemessage("Deleting simtype of %ld\n", (long)n);
 	calltoolnode(n, act_disposenode);
 	disposeattrs(&n->attr, n->simtype->nnumattrs, n->simtype->nattr);
 	hn = gg.hnbase;
@@ -7551,9 +7545,7 @@ void histaddsignal(log_hnrec **hn, short sig, short y)
 	(*hn)->sig = sig;
 	tool = gg.signaltab[sig - 1].np->simtype;
 	newattrs(&(*hn)->attr, tool->hnumattrs, tool->hattr);
-	if (gg.traceflag)
-		fprintf(tracefile, "Histaddsignal: %ld, %d\n",
-				(long)(*hn)->attr, tool->hnumattrs);
+	tracemessage("Histaddsignal: %ld, %d\n", (long)(*hn)->attr, tool->hnumattrs);
 	(*hn)->next = gg.hnbase;
 	gg.hnbase = *hn;
 	reshuffle();
@@ -8763,8 +8755,7 @@ static void historycommand()
 
 								if (!flag)
 								{
-									if (gg.traceflag)
-										fprintf(tracefile, "Delete trace %ld\n", (long)hn);
+									tracemessage("Delete trace %ld\n", (long)hn);
 									if (hn == histgridhn) {
 										histgridwhich = 0;
 										histgridhn = NULL;
@@ -11329,8 +11320,7 @@ static void initialize()
 	if (*tracefname != '\0')
 		newci_fixfname(tracefname, "text", "");
 	gg.traceflag = (swtab[2].used > 0);
-	if (gg.traceflag)
-		tracemessage("Trace mode ON");
+	tracemessage("Trace mode ON\n");
 	gg.homedirname = (char *)Malloc(256);
 
 	if (swtab[5].used > 0)
@@ -12106,11 +12096,11 @@ int main(int argc, char * argv[])
 			{
 				TRY(try43);
 				gg.traceflag = true;
-				tracemessage("");
-				fprintf(tracefile, "ESCAPECODE %ld\n", temp2);
-				fprintf(tracefile, "IORESULT   %ld\n", temp1);
-				fprintf(tracefile, "LINE       %ld\n\n", excpline);
-				fprintf(tracefile, "Current page: %ld\n", gg.curpage);
+				tracemessage("\n");
+				tracemessage("ESCAPECODE %ld\n", temp2);
+				tracemessage("IORESULT   %ld\n", temp1);
+				tracemessage("LINE       %ld\n\n", excpline);
+				tracemessage("Current page: %ld\n", gg.curpage);
 				dumpnodes();
 				RECOVER(try43);
 				nc_printf("Debugging printout failed.\n");
diff --git a/src/node.c b/src/node.c
index 94b9be6a26de0db6e3ef29f956f83804306c4314..bfc248bedfb3e4df69e182b14adf9ebf3450cf53 100644
--- a/src/node.c
+++ b/src/node.c
@@ -1,6 +1,7 @@
 
 #include <utils/p2c.h>
 #include <graphics/newkbd.h>
+#include <utils/logger.h>
 #include "logglobals.h"
 #include "utils.h"
 #include "node.h"
@@ -32,8 +33,7 @@ void newnode(log_nrec **node, uchar st)
 	calltoolnode(*node, act_newnode);
 	(*node)->next = gg.nbase;
 	gg.nbase = *node;
-	if (gg.traceflag)
-		fprintf(tracefile, "Make node %p\n", *node);
+	tracemessage("Make node %p\n", *node);
 }
 
 /// Create a new node, copied from another.
@@ -53,8 +53,7 @@ void copynode(log_nrec *old, log_nrec **node)
 		(*node)->confnext = nodeconflictbase;
 		nodeconflictbase = *node;
 	}
-	if (gg.traceflag)
-		fprintf(tracefile, "Copy node %p from %p\n", *node, old);
+	tracemessage("Copy node %p from %p\n", *node, old);
 }
 
 
@@ -73,8 +72,7 @@ void disposenode(log_nrec **node)
 {
 	log_nrec *n1, *n2;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Dispose node %p\n", *node);
+	tracemessage("Dispose node %p\n", *node);
 	if (*node == NULL)
 		return;
 	if ((*node)->conflict || (*node)->oconflict)
@@ -141,8 +139,7 @@ log_nrec *refnode(log_nrec *node)
 	if (node == NULL)
 		return node;
 	node->ref++;
-	if (gg.traceflag)
-		fprintf(tracefile, "Reference node %p -> %d\n", node, node->ref);
+	tracemessage("Reference node %p -> %d\n", node, node->ref);
 	return node;
 }
 
@@ -155,8 +152,7 @@ void unrefnode(log_nrec **node)
 	if (*node == NULL)
 		return;
 	(*node)->ref--;
-	if (gg.traceflag)
-		fprintf(tracefile, "Unref node %p -> %d\n", *node, (*node)->ref);
+	tracemessage("Unref node %p -> %d\n", *node, (*node)->ref);
 	if ((*node)->ref > 0)
 		return;
 	if ((*node)->ref < 0)
@@ -192,38 +188,32 @@ void dumpnodes()
 	short i, j;
 	timerec timevar;
 	daterec datevar;
-	int savebool;
 	char STR3[9];
 	short FORLIM;
 	log_krec *WITH;
 
-	savebool = gg.traceflag;
-	gg.traceflag = true;
-	tracemessage("");
-	gg.traceflag = savebool;
+	tracemessage("\n");
 	sysdate(&datevar);
 	systime(&timevar);
-	fprintf(tracefile,
-			"--------------------------------------------------------  ");
-	fprintf(tracefile, "%2d/%2d/%02d", datevar.month, datevar.day, datevar.year);
-	fprintf(tracefile, "  %2d:%2d\n\n", timevar.hour, timevar.minute);
+	tracemessage("--------------------------------------------------------  ");
+	tracemessage("%2d/%2d/%02d", datevar.month, datevar.day, datevar.year);
+	tracemessage("  %2d:%2d\n\n", timevar.hour, timevar.minute);
 	n = gg.nbase;
-	fprintf(tracefile, "NODES\n");
+	tracemessage("NODES\n");
 	i = 0;
 	j = 0;
 	TRY(try6);
 	while (j == i && n != NULL)
 	{
 		i++;
-		fprintf(tracefile, "%p  T:%s  Ref:%d",
-				n, n->simtype->name, n->ref);
+		tracemessage("%p  T:%s  Ref:%d", n, n->simtype->name, n->ref);
 		FORLIM = gg.lastsignal;
 		for (j = 0; j < FORLIM; j++)
 		{
 			if (gg.signaltab[j].np == n)
-				fprintf(tracefile, "   %s", gg.signaltab[j].name);
+				tracemessage("   %s", gg.signaltab[j].name);
 		}
-		putc('\n', tracefile);
+		tracemessage("\n");
 		TRY(try7);
 		gg.actfile = gg.tracefile;
 		gg.actflag = true;
@@ -231,8 +221,7 @@ void dumpnodes()
 		RECOVER(try7);
 		if (P_escapecode == -20)
 			goto _Ltry6;
-		fprintf(tracefile, "  (Failed to output node value)   %d\n",
-				P_escapecode);
+		tracemessage("  (Failed to output node value)   %d\n", P_escapecode);
 		ENDTRY(try7);
 		n1 = gg.nbase;
 		j = 1;
@@ -242,21 +231,21 @@ void dumpnodes()
 			n1 = n1->next;
 		}
 		if (j < i)
-			fprintf(tracefile, "Infinite loop in node list\n");
+			tracemessage("Infinite loop in node list\n");
 		n = n->next;
 	}
 	RECOVER2(try6,_Ltry6);
 	if (P_escapecode == -20)
 		_Escape(P_escapecode);
-	fprintf(tracefile, "  Internal error, %d\n", P_escapecode);
+	tracemessage("  Internal error, %d\n", P_escapecode);
 	ENDTRY(try6);
-	putc('\n', tracefile);
+	tracemessage("\n");
 	hw = gg.pages[gg.curpage - 1]->hwbase;
-	fprintf(tracefile, "HWIRES\n");
+	tracemessage("HWIRES\n");
 	TRY(try8);
 	while (hw != NULL)
 	{
-		fprintf(tracefile, "%p  X1:%4d X2:%4d  Y:%4d  N:%p  C:%s\n",
+		tracemessage("%p  X1:%4d X2:%4d  Y:%4d  N:%p  C:%s\n",
 				hw, hw->x1, hw->x2, hw->y, hw->node,
 				colorname(STR3, hw->wcolr));
 		hw = hw->next;
@@ -264,15 +253,15 @@ void dumpnodes()
 	RECOVER(try8);
 	if (P_escapecode == -20)
 		_Escape(P_escapecode);
-	fprintf(tracefile, "  Internal error, %d\n", P_escapecode);
+	tracemessage("  Internal error, %d\n", P_escapecode);
 	ENDTRY(try8);
-	putc('\n', tracefile);
+	tracemessage("\n");
 	vw = gg.pages[gg.curpage - 1]->vwbase;
-	fprintf(tracefile, "VWIRES\n");
+	tracemessage("VWIRES\n");
 	TRY(try9);
 	while (vw != NULL)
 	{
-		fprintf(tracefile, "%p   X:%4d Y1:%4d Y2:%4d  N:%p  C:%s\n",
+		tracemessage( "%p   X:%4d Y1:%4d Y2:%4d  N:%p  C:%s\n",
 				vw, vw->x, vw->y1, vw->y2, vw->node,
 				colorname(STR3, vw->wcolr));
 		vw = vw->next;
@@ -280,48 +269,48 @@ void dumpnodes()
 	RECOVER(try9);
 	if (P_escapecode == -20)
 		_Escape(P_escapecode);
-	fprintf(tracefile, "  Internal error, %d\n", P_escapecode);
+	tracemessage("  Internal error, %d\n", P_escapecode);
 	ENDTRY(try9);
-	putc('\n', tracefile);
+	tracemessage("\n");
 	s = gg.pages[gg.curpage - 1]->sbase;
-	fprintf(tracefile, "SOLDER\n");
+	tracemessage("SOLDER\n");
 	TRY(try10);
 	while (s != NULL)
 	{
-		fprintf(tracefile, "%p   X:%4d  Y:%4d    HW: %p,%p",
+		tracemessage("%p   X:%4d  Y:%4d    HW: %p,%p",
 				s, s->x, s->y, s->hwire, s->hwire2);
 		if (s->hwire == NULL)
-			fprintf(tracefile, "      ");
-		fprintf(tracefile, "    VW: %p,%p\n", s->vwire, s->vwire2);
+			tracemessage("      ");
+		tracemessage("    VW: %p,%p\n", s->vwire, s->vwire2);
 		s = s->next;
 	}
 	RECOVER(try10);
 	if (P_escapecode == -20)
 		_Escape(P_escapecode);
-	fprintf(tracefile, "  Internal error, %d\n", P_escapecode);
+	tracemessage("  Internal error, %d\n", P_escapecode);
 	ENDTRY(try10);
-	putc('\n', tracefile);
+	tracemessage("\n");
 	g = gg.pages[gg.curpage - 1]->gbase;
-	fprintf(tracefile, "GATES\n");
+	tracemessage("GATES\n");
 	TRY(try11);
 	while (g != NULL)
 	{
-		fprintf(tracefile, "%p  G:%3d    X:%4d  Y:%4d  T:%s        %s\n",
+		tracemessage("%p  G:%3d    X:%4d  Y:%4d  T:%s        %s\n",
 				g, g->g, g->x, g->y, g->kind->simtype->name,
 				g->kind->name);
 		WITH = g->kind;
 		FORLIM = WITH->numpins;
 		for (i = 0; i < FORLIM; i++)
 		{
-			fprintf(tracefile, "              Pin %2d   X:%4d  Y:%4d  N:%p",
+			tracemessage("              Pin %2d   X:%4d  Y:%4d  N:%p",
 					i + 1, g->pinpos[i].x, g->pinpos[i].y, g->pin[i]);
 			TRY(try12);
-			fprintf(tracefile, " [%d]", g->pin[i]->ref);
+			tracemessage(" [%d]", g->pin[i]->ref);
 			RECOVER(try12);
 			if (P_escapecode == -20)
 				goto _Ltry11;
 			ENDTRY(try12);
-			putc('\n', tracefile);
+			tracemessage("\n");
 		}
 		TRY(try13);
 		gg.actfile = gg.tracefile;
@@ -330,18 +319,16 @@ void dumpnodes()
 		RECOVER(try13);
 		if (P_escapecode == -20)
 			goto _Ltry11;
-		fprintf(tracefile, "  (Failed to output gate value)   %d\n",
-				P_escapecode);
+		tracemessage("  (Failed to output gate value)   %d\n", P_escapecode);
 		ENDTRY(try13);
 		g = g->next;
 	}
 	RECOVER2(try11,_Ltry11);
 	if (P_escapecode == -20)
 		_Escape(P_escapecode);
-	fprintf(tracefile, "  Internal error, %d\n", P_escapecode);
+	tracemessage("  Internal error, %d\n", P_escapecode);
 	ENDTRY(try11);
-	fprintf(tracefile,
-			"\n\n-------------------------------------------------------------------------\n\n\n");
+	tracemessage("\n\n-------------------------------------------------------------------------\n\n\n");
 }
 
 void delgetnode(log_nrec **save, log_nrec **old, log_nrec **node)
@@ -364,9 +351,7 @@ void combinenodes(log_nrec **n2, log_nrec **n1, cnrec *cnbase)
 	log_tool *oldsimtype, *newsimtype;
 	short i, pg, FORLIM, FORLIM1;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Combine node %ld into %ld\n",
-				(long)(*n1), (long)(*n2));
+	tracemessage("Combine node %ld into %ld\n", (long)(*n1), (long)(*n2));
 	if (*n2 == NULL)
 		switchnode(n2, *n1);
 	nn1 = *n1;   /*VAR params may change out from under us*/
@@ -484,8 +469,7 @@ void queuecombine(cnrec **cnbase, log_nrec **n, log_nrec **n2)
 {
 	cnrec *cn;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Queue-combine,  n = %ld,  np -> %ld\n", (long)(*n), (long)(*n2));
+	tracemessage("Queue-combine,  n = %ld,  np -> %ld\n", (long)(*n), (long)(*n2));
 	if (*n == NULL)
 		return;
 	cn = (cnrec *)Malloc(sizeof(cnrec));
@@ -561,7 +545,7 @@ int checkcombine(cnrec **cnbase_)
                 }
 
 				if (gg.traceflag && *V.cnbase != NULL)
-                        fprintf(tracefile, "Check-combine (pass %d) finds %s\n",
+					tracemessage("Check-combine (pass %d) finds %s\n",
                                         V.passcount, V.good ? " TRUE" : "FALSE");
                 V.passcount++;
         } while (!(V.good || V.passcount > 2));
diff --git a/src/tool.c b/src/tool.c
index 3fe4950cd5f137852c781b8264091e5e8567520e..b50b15e4a258583ffc52ba796df8400393a29487 100644
--- a/src/tool.c
+++ b/src/tool.c
@@ -2,6 +2,7 @@
 #include <utils/p2c.h>
 #include <graphics/newkbd.h>
 #include <graphics/newci.h>
+#include <utils/logger.h>
 #include "logdef.h"
 #include "logglobals.h"
 #include "logstuff.h"
@@ -63,23 +64,20 @@ log_tool *findtool(char *name_)
 	{
 		sprintf(suffix, "LOG_%s_PROC", name);
 		ready = findprocedure(suffix, (void(**) ())(&proc));
-		if (gg.traceflag)
-			fprintf(tracefile, "Findtool to load: %s -  %s.\n", suffix, lp->fname);
+		tracemessage("Findtool to load: %s -  %s.\n", suffix, lp->fname);
 
 		if (!ready && lp->fname != NULL)
 		{
 			TRY(try2);
 			newci_fixfname(lp->fname, "code", "");
-			if (gg.traceflag)
-				fprintf(tracefile, "Findtool, loading %s\n", lp->fname);
+			tracemessage("Findtool, loading %s\n", lp->fname);
 			//newci_loadprogram(lp->fname); << do nothing
 			RECOVER(try2);
 			if (P_escapecode == -20)
 				_Escape(P_escapecode);
 			ENDTRY(try2);
 			ready = findprocedure(suffix, (void(**) ())(&proc));
-			if (gg.traceflag)
-				fprintf(tracefile, "Findtool, ready=%s\n", ready ? " TRUE" : "FALSE");
+			tracemessage("Findtool, ready=%s\n", ready ? " TRUE" : "FALSE");
 		}
 
 		if (ready)
diff --git a/src/wire.c b/src/wire.c
index a5dfc6f894c225331e555f7fc86b1a061860645f..9fb709776f4e852c374f0be093c0a7bf22a6ff99 100644
--- a/src/wire.c
+++ b/src/wire.c
@@ -2,6 +2,7 @@
 #include <utils/p2c.h>
 #include <graphics/newkbd.h>
 #include <utils/sysdevs.h>
+#include <utils/logger.h>
 #include "logglobals.h"
 #include "logdef.h"
 #include "utils.h"
@@ -98,8 +99,7 @@ void disphw(log_hwrec **hw)
 {
 	log_hwrec *hw1;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Dispose hwire %ld\n", (long)(*hw));
+	tracemessage("Dispose hwire %ld\n", (long)(*hw));
 	if (*hw == NULL)
 		return;
 	hw1 = gg.pages[gg.curpage - 1]->hwbase;
@@ -141,8 +141,7 @@ void dispvw(log_vwrec **vw)
 {
 	log_vwrec *vw1;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Dispose vwire %ld\n", (long)(*vw));
+	tracemessage("Dispose vwire %ld\n", (long)(*vw));
 	if (*vw == NULL)
 		return;
 	vw1 = gg.pages[gg.curpage - 1]->vwbase;
@@ -187,8 +186,7 @@ void dispsolder(log_srec **s)
 {
 	log_srec *s1;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Dispose solder %ld\n", (long)(*s));
+	tracemessage("Dispose solder %ld\n", (long)(*s));
 	if (*s == NULL)
 		return;
 	s1 = gg.pages[gg.curpage - 1]->sbase;
@@ -297,8 +295,7 @@ void addsolder(short x, short y, log_hwrec *hw, log_hwrec *hw2, log_vwrec *vw, l
 		else
 			report(4, rtn);
 	}
-	if (gg.traceflag)
-		fprintf(tracefile, "Add solder %ld\n", (long)s);
+	tracemessage("Add solder %ld\n", (long)s);
 }
 
 #undef rtn
@@ -352,8 +349,7 @@ void chghw(log_hwrec *hw, log_nrec *oldnode, log_nrec *n)
 	log_srec *s;
 	short i, px, FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Change hwire %ld to node %ld\n", (long)hw, (long)n);
+	tracemessage("Change hwire %ld to node %ld\n", (long)hw, (long)n);
 	switchnode(&hw->node, n);
 	g = gg.pages[gg.curpage - 1]->gbase;
 	while (g != NULL)
@@ -420,8 +416,7 @@ void chgvw(log_vwrec *vw, log_nrec *oldnode, log_nrec *n)
 	log_srec *s;
 	short i, py, FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Change vwire %ld to node %ld\n", (long)vw, (long)n);
+	tracemessage("Change vwire %ld to node %ld\n", (long)vw, (long)n);
 	switchnode(&vw->node, n);
 	g = gg.pages[gg.curpage - 1]->gbase;
 	while (g != NULL)
@@ -498,8 +493,7 @@ void delhwire(log_hwrec *hw)
 	log_grec *g;
 	short i, x, y, FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Delete hwire %ld\n", (long)hw);
+	tracemessage("Delete hwire %ld\n", (long)hw);
 	clipon();
 	m_color((long)gg.color.backgr);
 	hline(hw->x1, hw->x2, hw->y);
@@ -523,8 +517,7 @@ void delhwire(log_hwrec *hw)
 			}
 			else
 			{
-				if (gg.traceflag)
-					fprintf(tracefile, "DELHW keeping solder %ld\n", (long)s);
+				tracemessage("DELHW keeping solder %ld\n", (long)s);
 			}
 		}
 		s = s1;
@@ -591,8 +584,7 @@ void delvwire(log_vwrec *vw)
 	log_grec *g;
 	short i, x, y, FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Delete vwire %ld\n", (long)vw);
+	tracemessage("Delete vwire %ld\n", (long)vw);
 	clipon();
 	m_color((long)gg.color.backgr);
 	vline(vw->x, vw->y1, vw->y2);
@@ -615,8 +607,7 @@ void delvwire(log_vwrec *vw)
 			}
 			else
 			{
-				if (gg.traceflag)
-					fprintf(tracefile, "DELVW keeping solder %ld\n", (long)s);
+				tracemessage("DELVW keeping solder %ld\n", (long)s);
 			}
 		}
 		s = s1;
@@ -695,8 +686,7 @@ void addhwire(short x1, short x2, short y, short colr)
 	blobrec *blbase;
 	short FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Add hwire %d-%d, %d\n", x1, x2, y);
+	tracemessage("Add hwire %d-%d, %d\n", x1, x2, y);
 	sortshints(&x1, &x2);
 	cnbase = NULL;
 	remcursor();
@@ -807,8 +797,7 @@ void addhwire(short x1, short x2, short y, short colr)
 	gg.nearhw = hw;
 	clipoff();
 	refreshsoon();
-	if (gg.traceflag)
-		fprintf(tracefile, "Added hwire %ld\n", (long)hw);
+	tracemessage("Added hwire %ld\n", (long)hw);
 _L1:
 	dispblobs(&blbase);
 
@@ -844,8 +833,7 @@ void addvwire(short x, short y1, short y2, short colr)
 	blobrec *blbase;
 	short FORLIM;
 
-	if (gg.traceflag)
-		fprintf(tracefile, "Add vwire %d, %d-%d\n", x, y1, y2);
+	tracemessage("Add vwire %d, %d-%d\n", x, y1, y2);
 	sortshints(&y1, &y2);
 	cnbase = NULL;
 	remcursor();
@@ -957,8 +945,7 @@ void addvwire(short x, short y1, short y2, short colr)
 	gg.nearvw = vw;
 	clipoff();
 	refreshsoon();
-	if (gg.traceflag)
-		fprintf(tracefile, "Added vwire %ld\n", (long)vw);
+	tracemessage("Added vwire %ld\n", (long)vw);
 _L1:
 	dispblobs(&blbase);