带有映射诊断上下文的 Golang 日志记录
Golang Logging with Mapped Diagnostic Context
如何在 Go 语言中实现 MDC Logging (Java)?
我需要在所有服务器日志中添加 UUID,以便能够跟踪并发请求。
Java MDC 依赖线程本地存储,Go 没有。
最接近的是将 Context 穿入您的堆栈。
这就是越来越多的库在 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
}
您可能想通过多种方式处理此问题,但这是一种相当简单的形式。
如何在 Go 语言中实现 MDC Logging (Java)?
我需要在所有服务器日志中添加 UUID,以便能够跟踪并发请求。
Java MDC 依赖线程本地存储,Go 没有。
最接近的是将 Context 穿入您的堆栈。
这就是越来越多的库在 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
}
您可能想通过多种方式处理此问题,但这是一种相当简单的形式。