hooks: add airbrake hook

hooks: Add airbrake hook

examples: move around to avoid overloading main

airbarke move around

remove tex.tgo

readme: cleanup

readme: try something different
This commit is contained in:
Simon Eskildsen 2014-04-13 18:17:20 -04:00
parent b73d08314f
commit d4f08ce128
6 changed files with 175 additions and 46 deletions

View File

@ -107,11 +107,15 @@ seen as a hint you want to add a field, however, you can still use the
#### Hooks #### Hooks
You can add hooks for logging levels. For example to send errors to an exception You can add hooks for logging levels. For example to send errors to an exception
tracking service on `Error`, `Fatal` and `Panic` or info to StatsD. tracking service on `Error`, `Fatal` and `Panic` or info to StatsD. Note this is
not the real implementation of the Airbrake hook in logrus, just a sample.
```go ```go
log = logrus.New() var log = logrus.New()
log.Hooks.Add(new(AirbrakeHook))
func init() {
log.Hooks.Add(new(AirbrakeHook))
}
type AirbrakeHook struct{} type AirbrakeHook struct{}
@ -139,6 +143,23 @@ func (hook *AirbrakeHook) Levels() []logrus.Level {
} }
``` ```
Logrus comes with built-in hooks. Add those, or your custom hook, in `init`:
```go
import (
"github.com/Sirupsen/logrus"
"github.com/Sirupsen/logrus/hooks/airbrake"
)
func init() {
log.Hooks.Add(new(logrus_airbrake.AirbrakeHook))
}
```
* [`github.com/Sirupsen/logrus/hooks/airbrake`](https://github.com/Sirupsen/logrus/blob/master/hooks/airbrake/airbrake.go).
Send errors to an exception tracking service compatible with the Airbrake API.
Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes.
#### Level logging #### Level logging
Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic. Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic.

43
airbrake.go Normal file
View File

@ -0,0 +1,43 @@
package logrus
import (
"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 exceptions. 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 *Entry) error {
if entry.Data["error"] == nil {
entry.Logger.WithFields(Fields{
"source": "airbrake",
"endpoint": airbrake.Endpoint,
}).Warn("Exceptions sent to Airbrake must have an 'error' key with the error")
return nil
}
err := airbrake.Notify(entry.Data["error"].(error))
if err != nil {
entry.Logger.WithFields(Fields{
"source": "airbrake",
"endpoint": airbrake.Endpoint,
}).Warn("Failed to send error to Airbrake")
}
return nil
}
func (hook *AirbrakeHook) Levels() []Level {
return []Level{
Error,
Fatal,
Panic,
}
}

29
examples/basic/basic.go Normal file
View File

@ -0,0 +1,29 @@
package main
import (
"github.com/Sirupsen/logrus"
)
var log = logrus.New()
func init() {
log.Formatter = new(logrus.JSONFormatter)
log.Formatter = new(logrus.TextFormatter) // default
}
func main() {
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
}).Info("A group of walrus emerges from the ocean")
log.WithFields(logrus.Fields{
"omg": true,
"number": 122,
}).Warn("The group's number increased tremendously!")
log.WithFields(logrus.Fields{
"omg": true,
"number": 100,
}).Fatal("The ice breaks!")
}

35
examples/hook/hook.go Normal file
View File

@ -0,0 +1,35 @@
package main
import (
"github.com/Sirupsen/logrus"
"github.com/Sirupsen/logrus/hooks/airbrake"
"github.com/tobi/airbrake-go"
)
var log = logrus.New()
func init() {
log.Formatter = new(logrus.TextFormatter) // default
log.Hooks.Add(new(logrus_airbrake.AirbrakeHook))
}
func main() {
airbrake.Endpoint = "https://exceptions.whatever.com/notifier_api/v2/notices.xml"
airbrake.ApiKey = "whatever"
airbrake.Environment = "production"
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
}).Info("A group of walrus emerges from the ocean")
log.WithFields(logrus.Fields{
"omg": true,
"number": 122,
}).Warn("The group's number increased tremendously!")
log.WithFields(logrus.Fields{
"omg": true,
"number": 100,
}).Fatal("The ice breaks!")
}

View File

@ -1,43 +0,0 @@
package main
import (
"os"
"github.com/Sirupsen/logrus"
)
func main() {
log := logrus.New()
if os.Getenv("LOG_FORMAT") == "json" {
log.Formatter = new(logrus.JSONFormatter)
} else {
log.Formatter = new(logrus.TextFormatter)
}
for {
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
}).Print("A group of walrus emerges from the ocean")
log.WithFields(logrus.Fields{
"omg": true,
"number": 122,
}).Warn("The group's number increased tremendously!")
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
}).Print("A giant walrus appears!")
log.WithFields(logrus.Fields{
"animal": "walrus",
"size": 9,
}).Print("Tremendously sized cow enters the ocean.")
log.WithFields(logrus.Fields{
"omg": true,
"number": 100,
}).Fatal("The ice breaks!")
}
}

View File

@ -0,0 +1,44 @@
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 exceptions. 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 := airbrake.Notify(entry.Data["error"].(error))
if err != nil {
entry.Logger.WithFields(logrus.Fields{
"source": "airbrake",
"endpoint": airbrake.Endpoint,
}).Warn("Failed to send error to Airbrake")
}
return nil
}
func (hook *AirbrakeHook) Levels() []logrus.Level {
return []logrus.Level{
logrus.Error,
logrus.Fatal,
logrus.Panic,
}
}