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

来源:12-3 基于gitlab+jenkins+harbor的自动化部署配置演示

三生三途

2020-01-04

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

写回答

2回答

xiaomo

2020-01-06

同学你好, 

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

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

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

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

1
0

三生三途

提问者

2020-01-04

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

0
1
xiaomo
func test() { defer func() { if err := recover(); err != nil { Error.Println("crash msg:", err) } }() // ... }
2020-01-06
共1条回复

Go实战仿百度云盘-实现企业级分布式云存储系统

紧随“云时代”技术潮流,分布式云存储系统,做第一代云程序员

1077 学习 · 494 问题

查看课程