본문 바로가기
WIKI 기술 지식 베이스

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!")

더 알아보기 (Learn more)