采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师您好! 我是一个go的初学者,现在公司项目在搞日志记录,我有一些疑问请您解答一下 1.我目前会在请求进入,请求结束时记录一下日志,这是中间件做到的,其他位置的日志记录是需要手动调用方法记录的吧? 2.程序崩溃日志如何记录? 例如map的并发读写时,程序直接崩溃了,还有为什么gin的recovery中间件没有起作用呢? 3.panic和崩溃之间啥关系呢,程序os.exit 时不能记录日志内容吗 ? 4.通常项目里日志记录的位置应该都有那些呢? 希望您不吝赐教。谢谢! ?
补充一下:
严重程序奔溃捕获时,通过信号量,不同的平台不一定都有效;
如果是panic输出的异常,可以在调用层使用recover来捕获,捕获后log即可,
if r := recover(); r!= nil { fmt.Println("recovered from ", r) }
问题1:对的,需要在输出日志的地方,手动调用log.xxx方法输出。
问题2:程序崩溃意味着进程结束,gin的recovery中间件根本来不及运行,所以没法记录。如果要记录,只能曲线救国,使用信号量通知机制来完成,但不是所有的信号量都能通知到;比如,kill -9和程序奔溃是无法记录的。
问题3:panic程序设计上来控制,可以使用recovery来捕获,捕获可以避免程序退出;崩溃更严重,程序无法运行;
问题4:调用的关键节点需要输出info,出现错误输出error,有些错误如果不影响整体流程,可以输出warn;一些不确定的地方,可以输出debug,方便调试。
还有个问题。goroutine中的错误如何捕获呢。。
goroutine中错误和其他代码中一样的,如果使用go fun() ,函数返回了error,可以使用函数再包装,也就是闭包来执行: go func(){ err:=你的函数() fmt.Println(err) }()
登录后可查看更多问答,登录/注册
Golang红包系统单体版+并发版+分布式+微服务版,四大金装版、超值必修课
4.3k 5
1.3k 1
966 15
2.2k 10
922 8