log_windows.go raw

   1  // SPDX-License-Identifier: Unlicense OR MIT
   2  
   3  package log
   4  
   5  import (
   6  	"log"
   7  	"syscall"
   8  	"unsafe"
   9  )
  10  
  11  type logger struct{}
  12  
  13  var (
  14  	kernel32           = syscall.NewLazyDLL("kernel32")
  15  	outputDebugStringW = kernel32.NewProc("OutputDebugStringW")
  16  	debugView          *logger
  17  )
  18  
  19  func init() {
  20  	// Windows DebugView already includes timestamps.
  21  	if syscall.Stderr == 0 {
  22  		log.SetFlags(log.Flags() &^ log.LstdFlags)
  23  		log.SetOutput(debugView)
  24  	}
  25  }
  26  
  27  func (l *logger) Write(buf []byte) (int, error) {
  28  	p, err := syscall.UTF16PtrFromString(string(buf))
  29  	if err != nil {
  30  		return 0, err
  31  	}
  32  	outputDebugStringW.Call(uintptr(unsafe.Pointer(p)))
  33  	return len(buf), nil
  34  }
  35