Skip to content

Instantly share code, notes, and snippets.

@HakShak
Last active December 12, 2020 01:57
Show Gist options
  • Save HakShak/a5a92e21545206cb185dea54cd9974b5 to your computer and use it in GitHub Desktop.
Save HakShak/a5a92e21545206cb185dea54cd9974b5 to your computer and use it in GitHub Desktop.
Simple Sentry Logrus Hook
import (
"errors"
"github.com/getsentry/sentry-go"
"github.com/sirupsen/logrus"
)
var (
logrusLevelsToSentryLevels = map[logrus.Level]sentry.Level{
logrus.PanicLevel: sentry.LevelFatal,
logrus.FatalLevel: sentry.LevelFatal,
logrus.ErrorLevel: sentry.LevelError,
logrus.WarnLevel: sentry.LevelWarning,
logrus.InfoLevel: sentry.LevelInfo,
logrus.DebugLevel: sentry.LevelDebug,
logrus.TraceLevel: sentry.LevelDebug,
}
)
type sentryLogrusHook struct {
levels []logrus.Level
}
func (hook *sentryLogrusHook) Levels() []logrus.Level {
return hook.levels
}
func (hook *sentryLogrusHook) Fire(entry *logrus.Entry) error {
var exception error
if err, ok := entry.Data[logrus.ErrorKey].(error); ok && err != nil {
exception = err
} else {
// Make a new error with the log message if there is no error provided
// because stacktraces are neat
exception = errors.New(entry.Message)
}
tags, hasTags := entry.Data["tags"].(map[string]string)
sentry.WithScope(func(scope *sentry.Scope) {
scope.AddEventProcessor(func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event {
event.Message = entry.Message
return event
})
scope.SetLevel(logrusLevelsToSentryLevels[entry.Level])
if hasTags {
scope.SetTags(tags)
delete(entry.Data, "tags") // Remove ugly map rendering
scope.SetExtras(entry.Data) // Set the extras in Sentry without the redundant tag data
for k, v := range tags { // Add the tags in a sane way back to Logrus
entry.Data[k] = v
}
} else {
scope.SetExtras(entry.Data)
}
sentry.CaptureException(exception)
})
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment