如何将整个日志发送到Jaeger Span

时间:2019-10-31 11:22:20

标签: go jaeger

是否可以将应用程序提供的标准日志和错误放入跨度?

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

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

2 个答案:

答案 0 :(得分:0)

如果您使用的是具有自动配置功能的Spring Boot,则会检测并使用跨度自动发送使用log4j打印的日志。

答案 1 :(得分:0)

在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. 必须有一种将Context传递给日志记录方法的方法,该方法可以由日志消息数据结构中的日志记录框架在内部捕获
  2. 负责获取日志消息并将其写入某些输出流的“ appender”(或所谓的“我正在使用log4j”术语)可以扩展为从上下文中检索Span并将日志消息写入Span使用span.LogKV()或类似的API。