Skip to content

Commit 67b26ca

Browse files
author
tleffew
committed
add in zerolog integration
1 parent 34b2d09 commit 67b26ca

File tree

5 files changed

+130
-0
lines changed

5 files changed

+130
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ We support two major logging frameworks:
136136
original glog's functionality and adds the ability to send errors/logs to
137137
[Airbrake.io][airbrake.io].
138138
* [apex/log][apexlog], to check how to integrate gobrake with apex/log, see [example](examples/apexlog).
139+
* [zerolog/log][zerolog], to check how to integrate gobrake with zerolog/log, see [example](examples/zerolog).
139140

140141
## Supported Go versions
141142

@@ -177,3 +178,4 @@ The project uses the MIT License. See [LICENSE.md](https://github.com/airbrake/g
177178
[twitter]: https://twitter.com/airbrake
178179
[glog]: https://github.com/airbrake/glog
179180
[apexlog]: https://github.com/apex/log
181+
[zerolog]: https://github.com/rs/zerolog

examples/zerolog/main.go

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"io"
7+
"os"
8+
9+
"github.com/airbrake/gobrake/v5"
10+
airbrakeWriter "github.com/airbrake/gobrake/v5/zerolog"
11+
"github.com/rs/zerolog"
12+
)
13+
14+
var ProjectId int64 = 999999 // Insert your Project Id here
15+
var ProjectKey string = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // Insert your Project Key here
16+
17+
func main() {
18+
airbrake := gobrake.NewNotifierWithOptions(&gobrake.NotifierOptions{
19+
ProjectId: ProjectId,
20+
ProjectKey: ProjectKey,
21+
Environment: "production",
22+
})
23+
24+
defer airbrake.Close()
25+
26+
// Note: This writer only accepts errors, fatal and panic logs, all others will be ignored.
27+
// You can still send logs to stdout or another writer via io.MultiWriter
28+
w := airbrakeWriter.New(airbrake)
29+
30+
// Insert the newly created airbrakeWriter into zerolog
31+
log := zerolog.New(io.MultiWriter(os.Stdout, w))
32+
zerolog.SetGlobalLevel(zerolog.DebugLevel)
33+
34+
// Creates a sub logger that has additional ctx
35+
loggerWithData := log.With().
36+
Dict("ctx",
37+
zerolog.Dict().
38+
Str("BUILD", "gitsha").
39+
Str("VERSION", "").
40+
Str("TIME", ""),
41+
).
42+
Str("file", "something.png").
43+
Str("type", "image/png").
44+
Str("user", "tobi").
45+
Logger()
46+
47+
fmt.Printf("Check your Airbrake dashboard at https://airbrake.io/projects/%v to see these log messages\n", ProjectId)
48+
49+
loggerWithData.Info().Msg("upload") // will `not` be sent to airbrake but sent to stdout
50+
loggerWithData.Warn().Msg("upload retry") // will `not` be sent to airbrake but sent to stdout
51+
// This error will be sent both to stdout and to airbrake via the MultiWriter pipeline
52+
loggerWithData.Error().Err(errors.New("unauthorized")).Msg("upload failed") // will `be` sent to airbrake & stdout
53+
}

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require (
66
github.com/ajg/form v1.5.1 // indirect
77
github.com/apex/log v1.9.0
88
github.com/beego/beego/v2 v2.0.2
9+
github.com/buger/jsonparser v1.1.1
910
github.com/caio/go-tdigest v3.1.0+incompatible
1011
github.com/gin-gonic/gin v1.7.7
1112
github.com/gobuffalo/buffalo v0.18.5
@@ -21,6 +22,7 @@ require (
2122
github.com/onsi/ginkgo v1.16.5
2223
github.com/onsi/gomega v1.19.0
2324
github.com/pkg/errors v0.9.1
25+
github.com/rs/zerolog v1.15.0
2426
github.com/smartystreets/goconvey v1.7.2 // indirect
2527
github.com/urfave/negroni v1.0.0
2628
github.com/valyala/fasthttp v1.35.0

go.sum

+3
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
103103
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
104104
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
105105
github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
106+
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
107+
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
106108
github.com/caio/go-tdigest v3.1.0+incompatible h1:uoVMJ3Q5lXmVLCCqaMGHLBWnbGoN6Lpu7OAUPR60cds=
107109
github.com/caio/go-tdigest v3.1.0+incompatible/go.mod h1:sHQM/ubZStBUmF1WbB8FAm8q9GjDajLC5T7ydxE3JHI=
108110
github.com/casbin/casbin v1.9.1/go.mod h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog=
@@ -706,6 +708,7 @@ github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUA
706708
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
707709
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
708710
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
711+
github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY=
709712
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
710713
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
711714
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=

zerolog/zerolog.go

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package zerolog
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"fmt"
7+
8+
"github.com/airbrake/gobrake/v5"
9+
"github.com/buger/jsonparser"
10+
"github.com/rs/zerolog"
11+
)
12+
13+
type Writer struct {
14+
Gobrake *gobrake.Notifier
15+
}
16+
17+
// New creates a new Writer
18+
func New(notifier *gobrake.Notifier) *Writer {
19+
return &Writer{Gobrake: notifier}
20+
}
21+
22+
// Write
23+
func (w *Writer) Write(data []byte) (int, error) {
24+
lvlStr, err := jsonparser.GetUnsafeString(data, zerolog.LevelFieldName)
25+
if err != nil {
26+
return 0, fmt.Errorf("error getting zerolog level: %w", err)
27+
}
28+
29+
lvl, err := zerolog.ParseLevel(lvlStr)
30+
if err != nil {
31+
return 0, fmt.Errorf("error parsing zerolog level: %w", err)
32+
}
33+
34+
if lvl < zerolog.ErrorLevel || lvl > zerolog.PanicLevel {
35+
return len(data), nil
36+
}
37+
38+
var userData interface{}
39+
err = json.Unmarshal(data, &userData)
40+
if err != nil {
41+
return 0, fmt.Errorf("error unmarshalling logs: %w", err)
42+
}
43+
type zeroError struct {
44+
message string
45+
error string
46+
}
47+
var ze zeroError
48+
_ = jsonparser.ObjectEach(data, func(key, value []byte, vt jsonparser.ValueType, offset int) error {
49+
switch string(key) {
50+
case zerolog.MessageFieldName:
51+
ze.message = string(value)
52+
case zerolog.ErrorFieldName:
53+
ze.error = string(value)
54+
}
55+
56+
return nil
57+
})
58+
59+
notice := gobrake.NewNotice(ze.message, nil, 6)
60+
notice.Context["severity"] = string(lvl)
61+
notice.Params["userData"] = userData
62+
notice.Error = errors.New(ze.error)
63+
w.Gobrake.SendNoticeAsync(notice)
64+
return len(data), nil
65+
}
66+
67+
func (w *Writer) Close() error {
68+
w.Gobrake.Flush()
69+
return nil
70+
}

0 commit comments

Comments
 (0)