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