Index: subr_log.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_log.c,v
retrieving revision 1.57
diff -u -u -r1.57 subr_log.c
--- subr_log.c	31 Mar 2018 23:12:01 -0000	1.57
+++ subr_log.c	31 Mar 2018 23:37:05 -0000
@@ -404,6 +404,35 @@
 	}
 }
 
+static void
+logaddchar(struct kern_msgbuf *mbp, int c)
+{
+	mbp->msg_bufc[mbp->msg_bufx++] = c;
+	if (mbp->msg_bufx < 0 || mbp->msg_bufx >= mbp->msg_bufs)
+		mbp->msg_bufx = 0;
+
+	/* If the buffer is full, keep the most recent data. */
+	if (mbp->msg_bufr == mbp->msg_bufx)
+		logskip(mbp);
+}
+
+static int logneedtstamp;
+
+static void
+logaddtstamp(struct kern_msgbuf *mbp)
+{
+	char buf[64];
+	struct timespec ts;
+	int n;
+
+	getnanouptime(&ts);
+	n = snprintf(buf, sizeof(buf), "[%jd.%ld] ",
+	    (intptr_t)ts.tv_sec, ts.tv_nsec);
+
+	for (int i = 0; i < n; i++)
+		logaddchar(mbp, buf[i]);
+}
+
 void
 logputchar(int c)
 {
@@ -430,14 +459,14 @@
 		goto out;
 
 	}
+	if (logneedtstamp) {
+		logaddtstamp(mbp);
+		logneedtstamp = 0;
+	}
+	if (c == '\n')
+		logneedtstamp++;
 
-	mbp->msg_bufc[mbp->msg_bufx++] = c;
-	if (mbp->msg_bufx < 0 || mbp->msg_bufx >= mbp->msg_bufs)
-		mbp->msg_bufx = 0;
-
-	/* If the buffer is full, keep the most recent data. */
-	if (mbp->msg_bufr == mbp->msg_bufx)
-		logskip(mbp);
+	logaddchar(mbp, c);
 
 out:
 	if (!cold)