一直有个疑问,go 业务日志中怎么在一个请求的每一条日志中记录当次请求的一个唯一请求 id ,方便根据这个唯一标识过滤所有的当次请求的日志,从而更快排查问题。知道一种比较麻烦的方式,在请求的 context 中灌入这个唯一 id,然后在各个方法中都需要参数 context ,这样在各个方法想记录日志,再从 cotext 中拿 id,这方式不优雅啊,有啥好方法吗?
1
looking0truth 2022-09-17 11:42:15 +08:00
貌似必须透传
|
2
0987363 2022-09-17 11:45:38 +08:00
http 框架的 middleware 里初始化日志的时候加上 id
|
3
fxjson OP @0987363 你的意思应该也是每个方法透传 context ,从 context 里面接收唯一标识
|
4
to2false 2022-09-17 12:09:27 +08:00
你的 log 组件封装个方法 `withCtx(ctx context.Context)`然后内部自己获取就好了
|
5
to2false 2022-09-17 12:10:58 +08:00
|
6
toomoy 2022-09-17 13:11:03 +08:00
nginx 生成个请求标识
|
7
SimbaPeng 2022-09-17 13:18:58 +08:00
把带上各种基础字段的 logger 对象传入 context ,下层方法用的都是上层传下来带上了各种基础字段的 logger
|
8
fxjson OP @to2false 那还是要各个方法传递 ctx 才能 withCtx,从而所有日志才能有这个唯一标识
|
9
ArianX 2022-09-17 14:15:20 +08:00 via Android
middleware 在 ctx 中设置一个 id ,处理请求的整个链路都需要带上这个 ctx 。用公共的日志库提供打日志的方法,日志库封装从 ctx 把 id 取出来的逻辑
|
10
joesonw 2022-09-17 15:06:42 +08:00 via iPhone
从 ctx 上拿 logger ,这样除了 reqeust id 以外,后面要注入其他变量,其他地方不用动。
|
11
king888 2022-09-17 15:25:04 +08:00
在代码打日志哪里要用到 requestId 就在那处调用,不是很正常的一件事情,为什么这种方法不优雅
|
12
sardina 2022-09-17 18:28:58 +08:00
把当前的 goroutinue id 和 request id 关联起来,然后打日志的时候通过取当前的 goroutinue id 来打印 request id 。
|