【问题标题】:How to send entire logs to jaeger span如何将整个日志发送到 jaeger span
【发布时间】:2019-10-31 11:22:20
【问题描述】:

有没有办法将应用程序提供的 std 日志和错误放到一个 span 中?

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

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

【问题讨论】:

    标签: go jaeger


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在 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 尚不支持这种本机日志记录模式,因此需要包装器。

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

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

      【讨论】:

        猜你喜欢
        • 2020-10-21
        • 1970-01-01
        • 2020-10-23
        • 2019-04-26
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多