From a7dc7c01c0f5891a234d87f06988ef26c5df4279 Mon Sep 17 00:00:00 2001 From: mural Date: Mon, 13 Jan 2020 23:26:49 +0800 Subject: [PATCH] app/internal/log: add logger for Windows DebugView Signed-off-by: mural --- app/internal/log/log_windows.go | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 app/internal/log/log_windows.go diff --git a/app/internal/log/log_windows.go b/app/internal/log/log_windows.go new file mode 100644 index 00000000..13c5fe4d --- /dev/null +++ b/app/internal/log/log_windows.go @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package log + +import ( + "log" + "syscall" + "unsafe" +) + +type logger struct{} + +var ( + kernel32 = syscall.NewLazyDLL("kernel32") + outputDebugStringW = kernel32.NewProc("OutputDebugStringW") + debugView *logger +) + +func init() { + // Windows DebugView already includes timestamps. + if syscall.Stderr == 0 { + log.SetFlags(log.Flags() &^ log.LstdFlags) + log.SetOutput(debugView) + } +} + +func (l *logger) Write(buf []byte) (int, error) { + p, err := syscall.UTF16PtrFromString(string(buf)) + if err != nil { + return 0, err + } + outputDebugStringW.Call(uintptr(unsafe.Pointer(p))) + return len(buf), nil +}