Logrus kann gut mit Sentry verbunden werden, da es eine Hook anbietet wo sich Sentry einbinden kann. Beachte aber dass Sentry im Hintergrund diesen Request ausführt. Wenn das Programm kurz nach dem Log beendet wird, kann dieser Log nicht mehr gesendet werden. Als kleinen Test-Workaround, kann ein time.Sleep()
gemacht werden.
err = initLogger()
if err != nil {
log.Fatalf("failed to initialize logger: %s", err.Error())
}
time.Sleep(5 * time.Second)
log.Info("hi sentry, the connection to you works!")
time.Sleep(5 * time.Second)
import (
"github.com/getsentry/sentry-go"
sentrylogrus "github.com/getsentry/sentry-go/logrus"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
)
func initLogger() error {
log.SetFormatter(&log.JSONFormatter{})
log.SetReportCaller(true)
log.SetOutput(log.StandardLogger().Out)
if viper.GetBool("logging.enable.debug") {
log.SetLevel(log.DebugLevel)
}
if !viper.GetBool("logging.enable.sentry") {
return nil
}
sentryLevels := []log.Level{log.PanicLevel, log.FatalLevel, log.ErrorLevel, log.InfoLevel}
sentryHook, err := sentrylogrus.New(sentryLevels, sentry.ClientOptions{
Dsn: viper.GetString("logging.sentry.dsn"),
BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
event.Environment = strings.ToUpper(viper.GetString("app.env"))
return event
},
Debug: viper.GetBool("logging.enable.console"),
AttachStacktrace: true,
EnableTracing: true,
Release: sentryRelease,
})
if err != nil {
return fmt.Errorf("failed to create sentry-logrus-hook: %v", err)
}
defer sentryHook.Flush(5 * time.Second)
log.AddHook(sentryHook)
log.RegisterExitHandler(func() { sentryHook.Flush(5 * time.Second) })
return nil
}