Last active
December 12, 2020 01:57
-
-
Save HakShak/a5a92e21545206cb185dea54cd9974b5 to your computer and use it in GitHub Desktop.
Simple Sentry Logrus Hook
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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