logrus/hooks/bugsnag/bugsnag.go

54 lines
1.5 KiB
Go

package logrus_bugsnag
import (
"github.com/Sirupsen/logrus"
"github.com/bugsnag/bugsnag-go"
)
// BugsnagHook sends exceptions to an exception-tracking service compatible
// with the Bugsnag API. Before using this hook, you must call
// bugsnag.Configure().
//
// Entries that trigger an Error, Fatal or Panic should now include an "error"
// field to send to Bugsnag
type BugsnagHook struct{}
// Fire forwards an error to Bugsnag. Given a logrus.Entry, it extracts the
// implicitly-required "error" field and sends it off.
func (hook *BugsnagHook) Fire(entry *logrus.Entry) error {
if entry.Data["error"] == nil {
entry.Logger.WithFields(logrus.Fields{
"source": "bugsnag",
}).Warn("Exceptions sent to Bugsnag must have an 'error' key with the error")
return nil
}
err, ok := entry.Data["error"].(error)
if !ok {
entry.Logger.WithFields(logrus.Fields{
"source": "bugsnag",
}).Warn("Exceptions sent to Bugsnag must have an `error` key of type `error`")
return nil
}
bugsnagErr := bugsnag.Notify(err)
if bugsnagErr != nil {
entry.Logger.WithFields(logrus.Fields{
"source": "bugsnag",
"error": bugsnagErr,
}).Warn("Failed to send error to Bugsnag")
}
return nil
}
// Levels enumerates the log levels on which the error should be forwarded to
// bugsnag: everything at or above the "Error" level.
func (hook *BugsnagHook) Levels() []logrus.Level {
return []logrus.Level{
logrus.ErrorLevel,
logrus.FatalLevel,
logrus.PanicLevel,
}
}