Go 로그와 트레이스 상호 연관 (Correlating Go Logs and Traces)
Go 애플리케이션의 로그에 트레이스 ID를 주입해 Datadog에서 로그와 트레이스를 연결하는 방법을 안내해요.
출처: 문서
본문
참고: 이 문서는 Datadog이 모든 사용자에게 권장하는 Go 트레이서 v2를 사용해요. v1을 사용한다면 마이그레이션 가이드를 참조해 v2로 업그레이드하세요.
수동 주입
Go 트레이서 API는 %v 형식 지정자를 사용해 로그 문과 함께 스팬 정보를 출력할 수 있게 해줘요:
package main
import (
"net/http"
"github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"
)
func handler(w http.ResponseWriter, r *http.Request) {
// /posts URL에서 웹 요청에 대한 스팬을 생성해요.
span := tracer.StartSpan("web.request", tracer.ResourceName("/posts"))
defer span.Finish()
// 로그 메시지에 스팬 정보를 추가해요:
log.Printf("my log message %v", span)
}
위 예시는 표준 라이브러리의 log 패키지에서 스팬의 컨텍스트를 사용하는 방법을 보여줘요. 유사한 로직을 타사 패키지에도 적용할 수 있어요.
참고: 로그를 파싱하기 위해 Datadog 로그 통합을 사용하지 않는다면, 커스텀 로그 파싱 규칙에서 dd.trace_id, dd.span_id, dd.service, dd.env, dd.version이 문자열로 파싱되도록 해야 해요. 자세한 내용은 연관된 로그가 트레이스 ID 패널에 표시되지 않음에서 확인할 수 있어요.
logrus 로그로의 주입
logrus 패키지용 훅을 사용해 로그와 스팬을 자동으로 연결할 수 있어요.
package main
import (
"github.com/sirupsen/logrus"
dd_logrus "github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2"
"github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"
)
func main() {
// 선택 사항: JSON을 사용하도록 로그 형식 변경 (Go 로그 수집 참조)
logrus.SetFormatter(&logrus.JSONFormatter{})
// Datadog 컨텍스트 로그 훅 추가
logrus.AddHook(&dd_logrus.DDContextLogHook{})
// ...
}
이렇게 하면 컨텍스트로 로그할 때 자동으로 트레이스 ID가 로그에 주입돼요.
// 컨텍스트로 로그
logrus.WithContext(ctx).Info("Go logs and traces connected!")