关于 go 日志中记录 request id 的疑问

2022-09-17 11:27:07 +08:00
 fxjson

一直有个疑问,go 业务日志中怎么在一个请求的每一条日志中记录当次请求的一个唯一请求 id ,方便根据这个唯一标识过滤所有的当次请求的日志,从而更快排查问题。知道一种比较麻烦的方式,在请求的 context 中灌入这个唯一 id,然后在各个方法中都需要参数 context ,这样在各个方法想记录日志,再从 cotext 中拿 id,这方式不优雅啊,有啥好方法吗?

1568 次点击
所在节点    程序员
12 条回复
looking0truth
2022-09-17 11:42:15 +08:00
貌似必须透传
0987363
2022-09-17 11:45:38 +08:00
http 框架的 middleware 里初始化日志的时候加上 id
fxjson
2022-09-17 12:06:37 +08:00
@0987363 你的意思应该也是每个方法透传 context ,从 context 里面接收唯一标识
to2false
2022-09-17 12:09:27 +08:00
你的 log 组件封装个方法 `withCtx(ctx context.Context)`然后内部自己获取就好了
to2false
2022-09-17 12:10:58 +08:00
toomoy
2022-09-17 13:11:03 +08:00
nginx 生成个请求标识
SimbaPeng
2022-09-17 13:18:58 +08:00
把带上各种基础字段的 logger 对象传入 context ,下层方法用的都是上层传下来带上了各种基础字段的 logger
fxjson
2022-09-17 13:33:33 +08:00
@to2false 那还是要各个方法传递 ctx 才能 withCtx,从而所有日志才能有这个唯一标识
ArianX
2022-09-17 14:15:20 +08:00
middleware 在 ctx 中设置一个 id ,处理请求的整个链路都需要带上这个 ctx 。用公共的日志库提供打日志的方法,日志库封装从 ctx 把 id 取出来的逻辑
joesonw
2022-09-17 15:06:42 +08:00
从 ctx 上拿 logger ,这样除了 reqeust id 以外,后面要注入其他变量,其他地方不用动。
king888
2022-09-17 15:25:04 +08:00
在代码打日志哪里要用到 requestId 就在那处调用,不是很正常的一件事情,为什么这种方法不优雅
sardina
2022-09-17 18:28:58 +08:00
把当前的 goroutinue id 和 request id 关联起来,然后打日志的时候通过取当前的 goroutinue id 来打印 request id 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/880759

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX