最近在写程序,自己调试的时候没什么问题,真正用的时候发现日志特别乱,才发现并发的时候,日志都打一起去了,虽然也是行输出的,但是就不好找运行的流程了。
所以在想,能不能有什么办法,在并发的时候,能区分一下不同 goroutine 的日志
第一个想到打 goroutine ID,但是这个被 Google 否决了,并不能拿到这个 ID。 尴尬点的方法,自己生成一个 ID,也是一种方案,但是太不优雅了
找日志库,好像也没人讨论出这方面比较好的库
不知道在座各位有没有什么好一点的解决方案?
|  |      1wweir      2017-06-16 22:02:21 +08:00 via Android 针对调用链(栈)区分上下文,把上下文作为 tag 打到日志里。 context 包里加上全局唯一 ID 可以一定程度上解决分布式调用链追踪问题,不过这方法对你的问题而言,有点过重了 | 
|  |      2est      2017-06-16 22:17:24 +08:00 再开一个 goroutine 专门把数组转换成日志并且定时 flush。 | 
|  |      3cxbig      2017-06-16 22:28:43 +08:00  1 | 
|  |      4ikw OP | 
|  |      7devops      2017-06-16 23:37:01 +08:00 蛤蛤,这个问题我搞过,overhead 最小的办法是修改 runtime 库,加上这个函数。 func GoID() int64 { return getg().goid } | 
|  |      13cxbig      2017-06-17 00:13:15 +08:00 | 
|  |      14herozem      2017-06-17 01:40:15 +08:00 via iPhone 在 nginx 上加一个 requestID ?然后 elk 再归一下类 | 
|  |      15wweir      2017-06-17 07:03:41 +08:00 via Android  1 @zwpaper 最简单轻量的两种做法, 通常是在函数的参数中(或者方法的结构体中),加个 context 保存 tag,打日志的时候带上这个 tag。 另一个更轻量省事,引入一个第三方 errors 包,报错一层一层手动加调用栈。遇到 goruntine 加上其 id 或者方便识别的随机字符串 PS:扯 elk 大数据之流纯属扯淡,日志乱到人都分辨,工具更是没法分辨 | 
|  |      16TheCure      2017-06-17 10:13:27 +08:00  2 context 不就是干这个的么 | 
|      17mengzhuo      2017-06-17 10:37:57 +08:00 via iPhone  1 思路问题 1. 加上日志等级 2. 不要输出没必要的调试日志 3. UT 保证程序的正确性,而不是肉眼看日志 | 
|  |      18ikw OP | 
|  |      19reus      2017-06-17 11:47:29 +08:00 一般只有 panic 日志,也就是,如果打出日志来,就说明需要我要干预 不需要关心的都直接入库 |