go程序一般都会有很多的goroutine,panic打印了满屏的goroutine的信息,而且windows自带的控制台能显示的信息很有限,这样就出错的提示信息总是会被刷掉了。以前用过console2来替代控制台,但是这个软件不是很友好,通常显示的信息的格式问题比较多,而且汉字显示问题很大。今天又仔细的研究了下发现以前网上看的的SetStdHandle代码改动下就可以了。代码如下,只要把var f *os.File这个作为全局变量就可以了
import ( "code.google.com/p/log4go" "os" "syscall" ) var ( kernel32 = syscall.MustLoadDLL("kernel32.dll") procSetStdHandle = kernel32.MustFindProc("SetStdHandle") ) func SetStdHandle(stdhandle int32, handle syscall.Handle) error { r0, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0) if r0 == 0 { if e1 != 0 { return error(e1) } return syscall.EINVAL } return nil } var f *os.File func redirect_err() { var err error f, err = os.Create(`panic.txt`) if err != nil { log4go.Error("os.Create failed: %v", err) } err = SetStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(f.Fd())) if err != nil { log4go.Error("SetStdHandle failed: %v", err) } }