/
logger.go
88 lines (76 loc) · 2.16 KB
/
logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
import (
"fmt"
"github.com/getsentry/sentry-go"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"github.com/pkg/errors"
"github.com/rs/zerolog"
"github.com/rs/zerolog/hlog"
"github.com/rs/zerolog/pkgerrors"
"net/http"
"os"
"time"
)
var logger = zerolog.New(os.Stderr).With().Timestamp().Logger()
func AddLoggingMiddleWare(r *chi.Mux) {
// chi
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Recoverer)
// zerolog
zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
zerolog.TimeFieldFormat = zerolog.TimeFormatUnix
r.Use(hlog.NewHandler(logger))
r.Use(
hlog.RemoteAddrHandler("ip"), hlog.UserAgentHandler("user_agent"),
hlog.RefererHandler("referer"), hlog.RequestIDHandler("req_id", "Request-Id"),
)
r.Use(hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) {
hlog.FromRequest(r).Info().
Str("method", r.Method).
Str("url", r.URL.String()).
Int("status", status).
Int("size", size).
Dur("duration", duration).
Msg("")
}))
}
// Handle handles errors and logs them to sentry
func Handle(r *http.Request, err error) {
if err != nil {
err = errors.WithStack(errors.Wrap(err, ""))
logger.Error().Str("req_id", GetRequestID(r)).Stack().Err(err).Msg("")
// log to sentry
sentry.CaptureException(err)
sentry.Flush(time.Second * 5)
}
}
// WriteError will write a http.Error as well as logging the error
func WriteError(w http.ResponseWriter, r *http.Request, code int, message string) {
LogError(r, errors.New(message))
http.Error(w, message, code)
}
func Log(r *http.Request, msg string, level zerolog.Level) {
logger.WithLevel(level).Str("req_id", GetRequestID(r)).Msg(msg)
}
func LogInfo(r *http.Request, msg string) {
Log(r, msg, zerolog.InfoLevel)
}
func LogError(r *http.Request, err error) {
if err != nil {
Log(r, err.Error(), zerolog.ErrorLevel)
// log to sentry
if hub := sentry.GetHubFromContext(r.Context()); hub != nil {
hub.WithScope(func(scope *sentry.Scope) {
hub.CaptureMessage(err.Error())
})
}
}
}
func GetRequestID(r *http.Request) string {
if id, ok := hlog.IDFromRequest(r); ok {
return fmt.Sprintf("%v", id)
}
return ""
}