diff --git a/doc/changes/auxiliary/mr.1475.md b/doc/changes/auxiliary/mr.1475.md
new file mode 100644
index 000000000..6af1a0ece
--- /dev/null
+++ b/doc/changes/auxiliary/mr.1475.md
@@ -0,0 +1 @@
+u/logging: Log to stderr in Windows.
diff --git a/src/xrt/auxiliary/util/u_logging.c b/src/xrt/auxiliary/util/u_logging.c
index 853846fd6..97e4b0a5d 100644
--- a/src/xrt/auxiliary/util/u_logging.c
+++ b/src/xrt/auxiliary/util/u_logging.c
@@ -123,7 +123,7 @@ u_log(const char *file, int line, const char *func, enum u_logging_level level,
 
 	char buf[16384] = {0};
 
-	int remainingBuffer = sizeof(buf) - 2;
+	int remainingBuffer = sizeof(buf) - 2; // 2 for \n\0
 	int printed = print_prefix(remainingBuffer, buf, func, level);
 
 	va_list args;
@@ -131,10 +131,10 @@ u_log(const char *file, int line, const char *func, enum u_logging_level level,
 	DISPATCH_SINK(file, line, func, level, format, args);
 	printed += vsprintf_s(buf + printed, remainingBuffer - printed, format, args);
 	va_end(args);
-	*(buf + printed) = '\n';
-	printed++;
-	*(buf + printed) = '\0';
+	buf[printed++] = '\n';
+	buf[printed++] = '\0';
 	OutputDebugStringA(buf);
+	fprintf(stderr, "%s", buf);
 }
 
 void
@@ -149,15 +149,18 @@ u_log_xdev(const char *file,
 
 	char buf[16384] = {0};
 
-	int remainingBuffer = sizeof(buf) - 1;
+	int remainingBuffer = sizeof(buf) - 2; // 2 for \n\0
 	int printed = print_prefix(remainingBuffer, buf, func, level);
 
 	va_list args;
 	va_start(args, format);
 	DISPATCH_SINK(file, line, func, level, format, args);
-	vsprintf_s(buf + printed, remainingBuffer - printed, format, args);
+	printed += vsprintf_s(buf + printed, remainingBuffer - printed, format, args);
 	va_end(args);
+	buf[printed++] = '\n';
+	buf[printed++] = '\0';
 	OutputDebugStringA(buf);
+	fprintf(stderr, "%s", buf);
 }