请稍等 ...
×

采纳答案成功!

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

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

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

正在回答

2回答

同学你好, 

1) 可以在代码任何地方里加上日志的输出,比如最简单的fmt.Prtinln(); 定义好输出的日志目录位置后, 后面就可以直接查日志文件了. 如果是docker等启动的容器应用, 一般需要将日志挂载宿主机上,防止容器删掉后日志的丢失;或者可以考虑采用ELK的方式来收集日志.

2) 一般可以在函数里通过defer-recover的方式来捕获异常, 或者将stdErr重定向到某个指定的日志文件中. gin的recovery没有起作用这个具体举下例子?这个问题原因不太确定, 因为derfer里捕获异常只对当前goroutine有效,可能是不同协程不能捕获的原因~~

3) 当你认为程序出了严重错误无法继续进行下去的时候可以手动调起panic并结束程序,崩溃不一定是手动panic引起的,比如堆栈溢出

4) 日志记录需要看业务需求的呀, 一般API的入口和出口都会打印日志的.

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

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

0 回复 有任何疑惑可以回复我~
  • xiaomo #1
    func test() { 
       defer func() {        
           if err := recover(); err != nil {
                Error.Println("crash msg:", err)
            }
        }()
       // ...
    }
    回复 有任何疑惑可以回复我~ 2020-01-06 00:34:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信