| package logrus_airbrake |
| |
| import ( |
| "github.com/Sirupsen/logrus" |
| "github.com/tobi/airbrake-go" |
| ) |
| |
| // AirbrakeHook to send exceptions to an exception-tracking service compatible |
| // with the Airbrake API. You must set: |
| // * airbrake.Endpoint |
| // * airbrake.ApiKey |
| // * airbrake.Environment (only sends exceptions when set to "production") |
| // |
| // Before using this hook, to send an error. Entries that trigger an Error, |
| // Fatal or Panic should now include an "error" field to send to Airbrake. |
| type AirbrakeHook struct{} |
| |
| func (hook *AirbrakeHook) Fire(entry *logrus.Entry) error { |
| if entry.Data["error"] == nil { |
| entry.Logger.WithFields(logrus.Fields{ |
| "source": "airbrake", |
| "endpoint": airbrake.Endpoint, |
| }).Warn("Exceptions sent to Airbrake must have an 'error' key with the error") |
| return nil |
| } |
| |
| err, ok := entry.Data["error"].(error) |
| if !ok { |
| entry.Logger.WithFields(logrus.Fields{ |
| "source": "airbrake", |
| "endpoint": airbrake.Endpoint, |
| }).Warn("Exceptions sent to Airbrake must have an `error` key of type `error`") |
| return nil |
| } |
| |
| airErr := airbrake.Notify(err) |
| if airErr != nil { |
| entry.Logger.WithFields(logrus.Fields{ |
| "source": "airbrake", |
| "endpoint": airbrake.Endpoint, |
| "error": airErr, |
| }).Warn("Failed to send error to Airbrake") |
| } |
| |
| return nil |
| } |
| |
| func (hook *AirbrakeHook) Levels() []logrus.Level { |
| return []logrus.Level{ |
| logrus.ErrorLevel, |
| logrus.FatalLevel, |
| logrus.PanicLevel, |
| } |
| } |