【发布时间】:2019-10-31 11:22:20
【问题描述】:
有没有办法将应用程序提供的 std 日志和错误放到一个 span 中?
我知道我可以使用span.LogKV() 或span.LogFields() 发送一些日志,但是当应用程序记录器和跨度记录器具有相同的日志时,它会使代码看起来很糟糕。
我正在寻找一种将所有日志放到相应跨度的自动化方法。
【问题讨论】:
有没有办法将应用程序提供的 std 日志和错误放到一个 span 中?
我知道我可以使用span.LogKV() 或span.LogFields() 发送一些日志,但是当应用程序记录器和跨度记录器具有相同的日志时,它会使代码看起来很糟糕。
我正在寻找一种将所有日志放到相应跨度的自动化方法。
【问题讨论】:
如果您使用带有自动配置的 spring boot,则使用 log4j 打印的日志将被检测并在 span 中自动发送。
【讨论】:
在 Go 中,这不是很简单,很大程度上取决于您使用的日志库和它提供的接口。一个示例在 Jaeger 存储库的 HotROD demo 中实现,并在 blog post accompanying the demo 中进行了描述。它在下面使用 go.uber.org/zap 日志库,并允许编写接受 Context 参数的日志语句:
logger.For(ctx).Info(
"Searching for nearby drivers",
zap.String("location", location),
)
在幕后logger.For(ctx) 捕获当前跟踪跨度并将所有日志语句添加到该跨度,除了像往常一样发送到stdout。
据我所知,go.uber.org/zap 尚不支持这种本机日志记录模式,因此需要包装器。
如果您使用另一个日志库,那么在高级别上,这就是需要发生的事情:
span.LogKV() 或类似的 API。【讨论】: