请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

系统崩溃日志如何捕获并记录

老师您好! 我是一个go的初学者,现在公司项目在搞日志记录,我有一些疑问请您解答一下
1.我目前会在请求进入,请求结束时记录一下日志,这是中间件做到的,其他位置的日志记录是需要手动调用方法记录的吧?
2.程序崩溃日志如何记录? 例如map的并发读写时,程序直接崩溃了,还有为什么gin的recovery中间件没有起作用呢?
3.panic和崩溃直接啥关系呢,程序os.exit 时不能记录日志内容吗 ?
4.通常项目里日志记录的位置应该都有那些呢?
希望您不吝赐教。谢谢! ?

正在回答

2回答

  1. 我目前会在请求进入,请求结束时记录一下日志,这是中间件做到的,其他位置的日志记录是需要手动调用方法记录的吧? > 是的,需要手动记录

  2. 程序崩溃日志如何记录? 例如map的并发读写时,程序直接崩溃了,还有为什么gin的recovery中间件没有起作用呢? > 这个一般不用自行记录,这些奔溃日志会写到stderr中。你的部署环境应该会捕捉stderr信息。gin中的recovery也是有其作用范围,一般都是recover一个请求的处理过程中产生的奔溃。在请求之外,比如初始化的时候就恢复不了。

  3. panic和崩溃直接啥关系呢,程序os.exit 时不能记录日志内容吗 ?> 两者都可以认为是奔溃,panic是有详细日志和call stack的,但os.exit没有。不过os.exit一般是自己主动写的,我们可以先写日志再os.Exit,或者使用log.Fatal。log.Fatal就是log.Print加上os.Exit

  4. 通常项目里日志记录的位置应该都有那些呢?> 首先,几乎所有的err我们都值得记录。另外,所有向外部系统的出入口都值得记录。比如读写数据库,发送网络请求等。不过也要注意一下记录的数据量,不要太大了。 

  5. goroutine中的错误如何捕获呢 > 捕获的话,只是针对panic而言的,这个捕获的方式是一样的,使用recover。另一种情况是我们想向外通知我们发生了err,这个就只能通过channel传出去,可以考虑另做一个chan error,或者把err和我们要的结果做成一个struct,比如:

type Result struct{

    Resp string

    err error

}

然后我们通过chan Result和外界通信

1 回复 有任何疑惑可以回复我~
提问者 三生三途 2020-01-04 23:49:00

还有个问题。goroutine中的错误如何捕获呢。。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信