请稍等 ...
×

采纳答案成功!

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

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

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

正在回答

3回答

补充一下:

严重程序奔溃捕获时,通过信号量,不同的平台不一定都有效;

如果是panic输出的异常,可以在调用层使用recover来捕获,捕获后log即可,


if r := recover(); r!= nil {
       fmt.Println("recovered from ", r)
   }




1 回复 有任何疑惑可以回复我~
枫荇 2020-01-06 11:29:07

问题1:对的,需要在输出日志的地方,手动调用log.xxx方法输出。

问题2:程序崩溃意味着进程结束,gin的recovery中间件根本来不及运行,所以没法记录。如果要记录,只能曲线救国,使用信号量通知机制来完成,但不是所有的信号量都能通知到;比如,kill -9和程序奔溃是无法记录的。

问题3:panic程序设计上来控制,可以使用recovery来捕获,捕获可以避免程序退出;崩溃更严重,程序无法运行;

问题4:调用的关键节点需要输出info,出现错误输出error,有些错误如果不影响整体流程,可以输出warn;一些不确定的地方,可以输出debug,方便调试。

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

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

0 回复 有任何疑惑可以回复我~
  • 枫荇 #1
    goroutine中错误和其他代码中一样的,如果使用go fun() ,函数返回了error,可以使用函数再包装,也就是闭包来执行:
    go func(){
    err:=你的函数()
    fmt.Println(err)
    }()
    回复 有任何疑惑可以回复我~ 2020-01-06 11:30:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信