如何在日志中注入traceID
如何在日志中注入traceID
自动注入
如果我们使用 opentelemetry-go-auto-instrumentation 所支持的日志框架,如图所示。TraceId 和 SpanId 会自动注入日志。
package main
import (  "go.uber.org/zap"  "net/http")
func main() {  http.HandleFunc("/log", func(w http.ResponseWriter, r *http.Request) {    logger := zap.NewExample()    logger.Debug("this is debug message")    logger.Info("this is info message")    logger.Warn("this is warn message")    logger.Error("this is error message")  })
  http.ListenAndServe(":9999", nil)}例如,如果我们用 opentelemetry-go-auto-instrumentation 生成下面的 Go 文件,运行二进制文件并访问 localhost:9999/log,就会看到下面的输出:
{"level":"debug","msg":"this is debug message","trace_id":"d62a8fea286cc66de9c68ca17d4faa88","span_id":"7cb6d692769ffd32"}{"level":"info","msg":"this is info message","trace_id":"d62a8fea286cc66de9c68ca17d4faa88","span_id":"7cb6d692769ffd32"}{"level":"warn","msg":"this is warn message","trace_id":"d62a8fea286cc66de9c68ca17d4faa88","span_id":"7cb6d692769ffd32"}{"level":"error","msg":"this is error message","trace_id":"d62a8fea286cc66de9c68ca17d4faa88","span_id":"7cb6d692769ffd32"}{"level":"debug","msg":"this is debug message","trace_id":"e56a6f1e7ed7af48cce8f64d045ed158","span_id":"def0b8cf10fe8844"}{"level":"info","msg":"this is info message","trace_id":"e56a6f1e7ed7af48cce8f64d045ed158","span_id":"def0b8cf10fe8844"}{"level":"warn","msg":"this is warn message","trace_id":"e56a6f1e7ed7af48cce8f64d045ed158","span_id":"def0b8cf10fe8844"}{"level":"error","msg":"this is error message","trace_id":"e56a6f1e7ed7af48cce8f64d045ed158","span_id":"def0b8cf10fe8844"}TraceId和SpanId会被自动注入到日志中。
手动注入
如果框架不支持 opentelemetry-go-auto-instrumentation。我们可以手动将 TraceId 和 SpanId 注入日志:
package main
import (  "go.opentelemetry.io/otel/sdk/trace"  "go.uber.org/zap"  "net/http")
func main() {  http.HandleFunc("/logwithtrace", func(w http.ResponseWriter, r *http.Request) {    logger := zap.NewExample()    traceId, spanId := trace.GetTraceAndSpanId()    logger.Info("this is info message with fileds",      zap.String("traceId", traceId),      zap.String("spanId", spanId),    )  })  http.ListenAndServe(":9999", nil)}例如,如果我们用 opentelemetry-go-auto-instrumentation 编译上面的 Go 文件,运行二进制文件,然后 curl localhost:9999/logwithtrace,就会看到下面的输出:
{"level":"info","msg":"this is info message with fileds","traceId":"92d63797010a2040484222a74c5ce304","spanId":"5a2c84c807a6e12c"}上面的代码被放在示例目录中。