log_windows.go 829 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package utils
  2. import (
  3. "os"
  4. "syscall"
  5. )
  6. var (
  7. kernel32 = syscall.MustLoadDLL("kernel32.dll")
  8. procSetStdHandle = kernel32.MustFindProc("SetStdHandle")
  9. )
  10. func setStdHandle(stdhandle int32, handle syscall.Handle) error {
  11. r0, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0)
  12. if r0 == 0 {
  13. if e1 != 0 {
  14. return error(e1)
  15. }
  16. return syscall.EINVAL
  17. }
  18. return nil
  19. }
  20. // RedirectStderr to the file passed in
  21. func RedirectStderr() (err error) {
  22. logFile, err := os.OpenFile(ErrorLogFilename(), os.O_WRONLY|os.O_CREATE|os.O_SYNC|os.O_APPEND, 0644)
  23. if err != nil {
  24. return
  25. }
  26. err = setStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(logFile.Fd()))
  27. if err != nil {
  28. return
  29. }
  30. // SetStdHandle does not affect prior references to stderr
  31. os.Stderr = logFile
  32. return
  33. }