如何 在 GoLang 中实现MDC Logging (Java)?
我需要在所有服务器日志中添加 UUID,以便能够跟踪并发请求。
Java MDC 依赖于线程本地存储,这是 Go 所没有的。
最接近的事情是通过堆栈 线程化一个上下文。
这就是越来越多的库在 Go 中所做的事情。
一种比较典型的方法是通过一个中间件包来实现这一点,该包将请求 ID 添加到 Web 请求的上下文中,例如:
req = req.WithContext(context.WithValue(req.Context(),"requestId",ID))
然后,假设您传递上下文,您将其拉出ctx.Value("requestId")
并在任何有意义的地方使用它。
可能制作自己的自定义记录器功能,例如:
func logStuff(ctx context.Context, msg string) {
log.Println(ctx.Value("requestId"),msg) // call stdlib logger
}
有很多方法你可能想要处理这个,但这是一个相当简单的形式。