Catch and Redirect Panic

Published 2018-07-30 22:11:59

面试的时候,面试官问程序panic了该怎么办;那就recover呀;后来想了下是不是守护进程呀。

那panic之后一般log会随着后台log一起打印,这样就不方便定位排查了。 将panic信息重定向输出到单独的文件,就方便啦。

由于Linux与Windows的差异导致syscall方法也不一致,代码如下:

  • Linux
func Catch(path string) error {
	// Linux Uncomment
	file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	globalf = file
	if err != nil {
		return err
	}

	t := fmt.Sprintf("panic time: %s", time.Now().Format("2006-01-02 15:04:05"))
	file.Write([]byte(t))
	file.Write([]byte("\n"))

	if err = syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())); err != nil {
		return err
	}
	return nil
}
  • Windows
func Catch(path string) error {
	// windows uncomment
	file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
	globalf = file
	if err != nil {
		return err
	}

	t := fmt.Sprintf("panic time: %s", time.Now().Format("2006-01-02 15:04:05"))
	file.Write([]byte(t))
	file.Write([]byte("\r\n"))

	lp := syscall.NewLazyDLL(kdll).NewProc(ssh)

	seh := syscall.STD_ERROR_HANDLE
	v, _, err := lp.Call(uintptr(seh), uintptr(file.Fd()))
	if v == 0 {
		return err
	}
	return nil
}

没有想到好办法,在使用时屏蔽掉其他系统的代码即可。 项目地址

comments powered by Disqus