diff --git a/NEWS b/NEWS
index f8c216e437da8d17f4cd3479dd79b0bd6f51f480..3d69602298630955a302c9ac59c641a8eed2acca 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,7 @@ Bugfixes
 - policy module: support '#' for separating port numbers, for consistency
 - fix startup on macOS+BSD when </dev/null and cqueues installed
 - policy.RPZ: log problems from zone-file level of parser as well (#453)
+- fix flushing of messages to logs in some cases (!781)
 
 Improvements
 ------------
diff --git a/daemon/main.c b/daemon/main.c
index 906b2f1ecb5fb8538f45c6cde48124a2c856a50c..30abf836831b29eeb4f103e08724d04c75efddc8 100644
--- a/daemon/main.c
+++ b/daemon/main.c
@@ -173,7 +173,6 @@ static void tty_process_input(uv_stream_t *stream, ssize_t nread, const uv_buf_t
 		lua_settop(L, 0);
 	}
 finish:
-	fflush(out);
 	free(cmd);
 	/* Close if redirected */
 	if (stream_fd != STDIN_FILENO) {
@@ -420,6 +419,12 @@ static int run_worker(uv_loop_t *loop, struct engine *engine, fd_array_t *ipc_se
 		return 1;
 	}
 
+	if (setvbuf(stdout, NULL, _IONBF, 0) || setvbuf(stderr, NULL, _IONBF, 0)) {
+		kr_log_error("[system] failed to to set output buffering (ignored): %s\n",
+				strerror(errno));
+		fflush(stderr);
+	}
+
 	/* Control sockets or TTY */
 	auto_free char *sock_file = NULL;
 	uv_pipe_t pipe;
@@ -428,7 +433,6 @@ static int run_worker(uv_loop_t *loop, struct engine *engine, fd_array_t *ipc_se
 	if (args->interactive) {
 		if (!args->quiet)
 			printf("[system] interactive mode\n> ");
-		fflush(stdout);
 		uv_pipe_open(&pipe, 0);
 		uv_read_start((uv_stream_t*) &pipe, tty_alloc, tty_process_input);
 	} else {
diff --git a/lib/utils.c b/lib/utils.c
index a3bf7ca96f94e925269424858479dc3a29ab8ed4..6e63f997177e2ca9efbf43d35ef58c8e36c9e18e 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -118,12 +118,11 @@ bool kr_verbose_set(bool status)
 
 void kr_log_verbose(const char *fmt, ...)
 {
-	if (kr_verbose_status) {
+	if (unlikely(kr_verbose_status)) {
 		va_list args;
 		va_start(args, fmt);
 		vprintf(fmt, args);
 		va_end(args);
-		fflush(stdout);
 	}
 }
 
@@ -141,7 +140,6 @@ void kr_log_qverbose_impl(const struct kr_query *qry, const char *cls, const cha
 	va_start(args, fmt);
 	vprintf(fmt, args);
 	va_end(args);
-	fflush(stdout);
 }
 
 bool kr_log_trace(const struct kr_query *query, const char *source, const char *fmt, ...)
diff --git a/lib/utils.h b/lib/utils.h
index a515a388013695fd6a1daa3f59d1569335a95316..8deef4efe7446d74a5629b2d307a2719fa355184 100644
--- a/lib/utils.h
+++ b/lib/utils.h
@@ -46,7 +46,7 @@ typedef void (*trace_callback_f)(struct kr_request *request);
 /** @brief Callback for request logging handler. */
 typedef void (*trace_log_f)(const struct kr_query *query, const char *source, const char *msg);
 
-#define kr_log_info(...) do { printf(__VA_ARGS__); fflush(stdout); } while(0)
+#define kr_log_info printf
 #define kr_log_error(...) fprintf(stderr, ## __VA_ARGS__)
 
 /* Always export these, but override direct calls by macros conditionally. */