linux

怎样用Golang日志追踪请求流程

小樊
51
2025-08-28 12:13:38
栏目: 编程语言

在Golang中,可以使用第三方库来实现日志追踪请求流程。一个常用的库是opentracing,它提供了一个API来记录分布式系统中的请求跟踪信息。另一个流行的库是logrus,它是一个结构化的日志库,可以用来记录请求流程中的关键信息。

下面是一个使用opentracinglogrus实现日志追踪请求流程的示例:

  1. 首先,安装所需的库:
go get github.com/opentracing/opentracing-go
go get github.com/sirupsen/logrus
go get github.com/uber/jaeger-client-go
  1. 创建一个简单的HTTP服务器,并使用opentracinglogrus记录请求流程:
package main

import (
	"fmt"
	"github.com/opentracing/opentracing-go"
	"github.com/opentracing/opentracing-go/ext"
	"github.com/sirupsen/logrus"
	"github.com/uber/jaeger-client-go"
	"github.com/uber/jaeger-client-go/config"
	"io"
	"net/http"
	"time"
)

func initJaeger(service string) (opentracing.Tracer, io.Closer) {
	cfg := config.Configuration{
		ServiceName: service,
		Sampler: &config.SamplerConfig{
			Type:  "const",
			Param: 1,
		},
		Reporter: &config.ReporterConfig{
			LogSpans: true,
		},
	}
	tracer, closer, err := cfg.NewTracer(config.Logger(jaeger.StdLogger))
	if err != nil {
		logrus.Fatalf("ERROR: cannot init Jaeger: %v", err)
	}
	return tracer, closer
}

func main() {
	tracer, closer := initJaeger("request-tracing")
	defer closer.Close()
	opentracing.SetGlobalTracer(tracer)

	logrus.SetFormatter(&logrus.JSONFormatter{})
	http.HandleFunc("/", handleRequest)
	logrus.Info("Server started on port 8080")
	http.ListenAndServe(":8080", nil)
}

func handleRequest(w http.ResponseWriter, r *http.Request) {
	span := tracer.StartSpan("handleRequest")
	ext.SpanKindRPCServer.Set(span)
	span.SetTag("http.method", r.Method)
	span.SetTag("http.url", r.URL.String())

	logrus.WithFields(logrus.Fields{
		"trace_id": span.Context().(jaeger.SpanContext).TraceID(),
		"span_id":  span.Context().(jaeger.SpanContext).SpanID(),
	}).Info("Handling request")

	time.Sleep(100 * time.Millisecond)

	span.Finish()
	w.Write([]byte("Hello, World!"))
}

在这个示例中,我们首先初始化了一个Jaeger tracer,然后创建了一个简单的HTTP服务器。在handleRequest函数中,我们使用tracer.StartSpan创建一个新的span,并设置了一些标签,如HTTP方法和URL。然后,我们使用logrus记录了跟踪信息,包括trace ID和span ID。最后,我们在处理完请求后结束了span。

要查看请求流程的日志,你需要运行Jaeger代理并查询相关的跟踪信息。你可以参考Jaeger官方文档来了解如何部署和查询跟踪信息:https://www.jaegertracing.io/docs/latest/getting-started/

这个示例仅用于演示目的,实际项目中可能需要根据具体需求进行调整。

0
看了该问题的人还看了