Golang:如何捕获恐慌并将此错误记录到原始日志文件中?

时间:2016-07-04 15:00:37

标签: logging go panic

我试图捕捉恐慌并记录错误:

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    defer func() {
        if err := recover(); err != nil {
            glog.Errorf("Recovered from err: %v", err)
        }
    }()
    panic("TISH IS A PANIC")
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

但令我惊讶的是,"Recovered from err: "永远不会出现在我的日志文件中,而是出现在/var/log/messages中。

如何在原始日志文件中记录该错误?

[已更新]

如果没有恐慌,glog.Errorf将正确记录到其日志目录;当有恐慌时,它就是不能:

// this glog will log correctly, unless uncomment the panic below
glog.Errorf("This is a normal log: %v", err)  
// panic("TISH IS A PANIC")

也许这是不可能的,因为崩溃意味着什么?

1 个答案:

答案 0 :(得分:1)

您需要在延期功能中调用glog.Flush()。来自glog的文档:

  

使用Flush定期缓冲和写入日志输出。程式   应在退出前调用Flush以保证所有日志输出   写入。

https://godoc.org/github.com/golang/glog