newrelic / go-agent

New Relic Go Agent
Apache License 2.0
775 stars 296 forks source link

Add slog integration #779

Closed cojoj closed 8 months ago

cojoj commented 1 year ago

Summary

With Go 1.21, we've seen the introduction of slog. It'd be very beneficial for many developers to have the possibility to utilize this new built-in structured logging and have this data in New Relic and drop 4rd party dependencies.

iamemilio commented 1 year ago

Hi, this is very much on our radar. We don't have an exact timeline for this, but we are planning an integration for slog, as well as some improvements to the logs in context features supported by the go agent. We will update you when we have more specifics.

chad-bekmezian-snap commented 11 months ago

Any updates on this?

Jared-Prime commented 9 months ago

Correct me if I'm wrong, but I believe this may be implemented now using the v3 logWriter, eg

package main

import (
    "github.com/newrelic/go-agent/v3/integrations/logcontext-v2/logWriter"
    "github.com/newrelic/go-agent/v3/newrelic"
    "log/slog"
    "os"
)

func main() {
   app, _ := newrelic.NewApplication(
     newrelic.ConfigAppName("example"),
     newrelic.ConfigLicense(os.Getenv("NEW_RELIC_LICENSE")),
     newrelic.ConfigAppLogForwardingEnabled(true),
   )

    writer := logWriter.New(os.Stdout, app)
    options := &slog.HandlerOptions{Level: slog.LevelInfo}
    handler := slog.NewJSONHandler(writer, options)    

    slog.SetDefault(slog.New(handler))
}
miyamo2 commented 9 months ago

@Jared-Prime Thanks for the code. It seems to have worked flawlessly.

Correct me if I'm wrong, but I believe this may be implemented now using the v3 logWriter, eg

package main

import (
  "github.com/newrelic/go-agent/v3/integrations/logcontext-v2/logWriter"
  "github.com/newrelic/go-agent/v3/newrelic"
  "log/slog"
  "os"
)

func main() {
   app, _ := newrelic.NewApplication(
     newrelic.ConfigAppName("example"),
     newrelic.ConfigLicense(os.Getenv("NEW_RELIC_LICENSE")),
     newrelic.ConfigAppLogForwardingEnabled(true),
   )

    writer := logWriter.New(os.Stdout, app)
    options := &slog.HandlerOptions{Level: slog.LevelInfo}
    handler := slog.NewJSONHandler(writer, options)    

    slog.SetDefault(slog.New(handler))
}
iamemilio commented 9 months ago

The log writer product is very flexible, and is technically compatible with anything that can write to an io.Writer interface. We have not internally tested this with slog, but I cant see why this would be any different than other tools that use io.Writer. This should work for log decoration, but not auto-instrumentation.

iamemilio commented 9 months ago

Thank you all for your patience, I am very excited to ask you all to take a look at, and give a test drive to what is soon to become nrslog! #847

iamemilio commented 8 months ago

We are planning a release next week, probably on Wednesday, but will be accepting community feedback until then. Please leave comments on the linked pull request!

iamemilio commented 8 months ago

https://docs.newrelic.com/docs/logs/logs-context/configure-logs-context-go/#5-slog