diff -upNr b/lib/isc/include/isc/util.h a/lib/isc/include/isc/util.h
--- b/lib/isc/include/isc/util.h	2019-07-30 19:52:09.600000000 +0800
+++ a/lib/isc/include/isc/util.h	2019-07-30 21:39:03.400000000 +0800
@@ -233,6 +233,7 @@
  * Time
  */
 #define TIME_NOW(tp) 	RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS)
+#define TIME_REAL_NOW(tp) 	RUNTIME_CHECK(isc_time_real_now((tp)) == ISC_R_SUCCESS)
 #ifdef CLOCK_BOOTTIME
 #define TIME_MONOTONIC(tp) 	RUNTIME_CHECK(isc_time_boottime((tp)) == ISC_R_SUCCESS)
 #endif
diff -upNr b/lib/isc/log.c a/lib/isc/log.c
--- b/lib/isc/log.c	2019-07-30 19:52:09.610000000 +0800
+++ a/lib/isc/log.c	2019-07-30 21:39:03.410000000 +0800
@@ -1498,7 +1498,7 @@ isc_log_doit(isc_log_t *lctx, isc_logcat
 		    time_string[0] == '\0') {
 			isc_time_t isctime;
 
-			TIME_NOW(&isctime);
+			TIME_REAL_NOW(&isctime);
 			isc_time_formattimestamp(&isctime, time_string,
 						 sizeof(time_string));
 		}
@@ -1545,7 +1545,7 @@ isc_log_doit(isc_log_t *lctx, isc_logcat
 				 * which fall within the duplicate_interval
 				 * range.
 				 */
-				TIME_NOW(&oldest);
+				TIME_REAL_NOW(&oldest);
 				if (isc_time_subtract(&oldest, &interval,
 						      &oldest)
 				    != ISC_R_SUCCESS)
@@ -1622,7 +1622,7 @@ isc_log_doit(isc_log_t *lctx, isc_logcat
 					strlcpy(message->text, lctx->buffer,
 						size);
 
-					TIME_NOW(&message->time);
+					TIME_REAL_NOW(&message->time);
 
 					ISC_LINK_INIT(message, link);
 					ISC_LIST_APPEND(lctx->messages,
diff -upNr b/lib/isc/unix/include/isc/time.h a/lib/isc/unix/include/isc/time.h
--- b/lib/isc/unix/include/isc/time.h	2019-07-30 19:52:09.600000000 +0800
+++ a/lib/isc/unix/include/isc/time.h	2019-07-30 21:39:03.400000000 +0800
@@ -149,6 +149,8 @@ isc_time_now(isc_time_t *t);
  */
 
 isc_result_t
+isc_time_real_now(isc_time_t *t);
+isc_result_t
 isc_time_nowplusinterval(isc_time_t *t, const isc_interval_t *i);
 /*%<
  * Set *t to the current absolute time + i.
diff -upNr b/lib/isc/unix/time.c a/lib/isc/unix/time.c
--- b/lib/isc/unix/time.c	2019-07-30 19:52:09.600000000 +0800
+++ a/lib/isc/unix/time.c	2019-07-30 21:39:03.400000000 +0800
@@ -105,6 +129,50 @@ isc_time_isepoch(const isc_time_t *t) {
 
 
 isc_result_t
+isc_time_real_now(isc_time_t *t) {
+	struct timeval tv;
+	char strbuf[ISC_STRERRORSIZE];
+
+	REQUIRE(t != NULL);
+
+	if (gettimeofday(&tv, NULL) == -1) {
+		isc__strerror(errno, strbuf, sizeof(strbuf));
+		UNEXPECTED_ERROR(__FILE__, __LINE__, "%s", strbuf);
+		return (ISC_R_UNEXPECTED);
+	}
+
+	/*
+	 * Does POSIX guarantee the signedness of tv_sec and tv_usec?  If not,
+	 * then this test will generate warnings for platforms on which it is
+	 * unsigned.  In any event, the chances of any of these problems
+	 * happening are pretty much zero, but since the libisc library ensures
+	 * certain things to be true ...
+	 */
+#if ISC_FIX_TV_USEC
+	fix_tv_usec(&tv);
+	if (tv.tv_sec < 0)
+		return (ISC_R_UNEXPECTED);
+#else
+	if (tv.tv_sec < 0 || tv.tv_usec < 0 || tv.tv_usec >= US_PER_S)
+		return (ISC_R_UNEXPECTED);
+#endif
+
+	/*
+	 * Ensure the tv_sec value fits in t->seconds.
+	 */
+	if (sizeof(tv.tv_sec) > sizeof(t->seconds) &&
+	    ((tv.tv_sec | (unsigned int)-1) ^ (unsigned int)-1) != 0U)
+		return (ISC_R_RANGE);
+
+	t->seconds = tv.tv_sec;
+	t->nanoseconds = tv.tv_usec * NS_PER_US;
+
+	return (ISC_R_SUCCESS);
+}
+
+
+
+isc_result_t
 isc_time_now(isc_time_t *t) {
 	struct timeval tv;
 	char strbuf[ISC_STRERRORSIZE];
