Manual injection

The Go tracer API allows printing span information along with log statements using the %v format specifier:

package main

import (
    "net/http"

    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // Create a span for a web request at the /posts URL.
    span := tracer.StartSpan("web.request", tracer.ResourceName("/posts"))
    defer span.Finish()

    // Append span info to log messages:
    log.Printf("my log message %v", span)
}

The above example illustrates how to use the span’s context in the standard library’s log package. Similar logic may be applied to third party packages too.

Note: If you are not using a Datadog Log Integration to parse your logs, custom log parsing rules need to ensure that dd.trace_id, dd.span_id, dd.service, dd.env and dd.version are being parsed as strings. More information can be found in Correlated Logs Not Showing Up in the Trace ID Panel.

Injection into logrus logs

A hook for the logrus package is available to automatically link your log and spans. The package is available in the Go tracer.

package main

import (
    "github.com/sirupsen/logrus"

    dd_logrus "gopkg.in/DataDog/dd-trace-go.v1/contrib/sirupsen/logrus"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

func main() {
    // Optional: Change log format to use JSON (Cf. Go Log Collection)
    logrus.SetFormatter(&logrus.JSONFormatter{})

    // Add Datadog context log hook
    logrus.AddHook(&dd_logrus.DDContextLogHook{}) 
    
    // ...
}

This automatically injects the trace id to your logs when you log with the context.

    // Log with the context
    logrus.WithContext(ctx).Info("Go logs and traces connected!")

Further Reading