Correlating Go Logs and Traces
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
Additional helpful documentation, links, and articles: