6

如何 在 GoLang 中实现MDC Logging (Java)?

我需要在所有服务器日志中添加 UUID,以便能够跟踪并发请求。

4

1 回答 1

11

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
}

有很多方法你可能想要处理这个,但这是一个相当简单的形式。

于 2016-12-08T21:47:10.477 回答