1

有什么方法可以将应用程序提供的 std 日志和错误放在一个范围内?

我知道我可以使用span.LogKV()or发送一些日志,span.LogFields()但是当应用程序记录器和跨度记录器具有相同的日志时,它会使代码看起来很糟糕。

我正在寻找一种将所有日志放到相应跨度的自动化方法。

4

2 回答 2

0

如果您使用带有自动配置的 spring boot,则使用 log4j 打印的日志将被检测并在 span 中自动发送。

于 2019-11-18T17:08:56.560 回答
0

在 Go 中,这不是很简单,很大程度上取决于您使用的日志库和它提供的接口。Jaeger 存储库中的HotROD 演示中实现了一个示例,该示例随附的博客文章中对此进行了描述。它go.uber.org/zap在下面使用日志库,并允许编写接受 Context 参数的日志语句:

logger.For(ctx).Info(
    "Searching for nearby drivers",
    zap.String("location", location),
)

在幕后logger.For(ctx)捕获当前跟踪跨度并将所有日志语句添加到该跨度,除了stdout像往常一样发送 then 到。

据我所知,go.uber.org/zap目前还不支持这种本地记录模式,因此需要一个包装器。

如果您使用另一个日志库,那么在高级别上,这就是需要发生的事情:

  1. 必须有一种方法可以将 Context 传递给日志记录方法,该方法可以在日志消息数据结构中由日志记录框架内部捕获
  2. 负责获取日志消息并将它们写入某个输出流的“appender”(或其他名称,我使用的是 log4j 术语)可以扩展为从上下文中检索 Span 并将日志消息写入 Span 使用span.LogKV()或类似API。
于 2019-12-10T04:26:49.450 回答