Skip to content

Commit 7f96896

Browse files
committed
Finish work on request logger middleware
1 parent cc9486c commit 7f96896

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

logger.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import (
1111
"go.uber.org/zap/zapcore"
1212
)
1313

14+
// NewCore will create handy Core with sensible defaults:
15+
// - messages with error level and higher will go to stderr, everything else to stdout
16+
// - use json encoder for production and console for development
1417
func NewCore(debug bool) zapcore.Core {
1518
var encoder zapcore.Encoder
1619
if debug {
@@ -29,17 +32,41 @@ func NewCore(debug bool) zapcore.Core {
2932
)
3033
}
3134

35+
// RequestLogger is a middleware for injecting sentry.Hub and zap.Logger into request context.
36+
// If provided logger has sentryCoreWrapper as core injected logger will have core with same local core and
37+
// sentry core based on an empty Hub for each request so breadcrumbs list will be empty each time.
38+
// In other case logger.Core() will be used as a local core and sentry core will be created if sentry is initialized
3239
func RequestLogger(logger *zap.Logger) func(next http.Handler) http.Handler {
33-
core := logger.Core()
34-
rootHub := sentry.CurrentHub()
35-
if wrappedCore, ok := core.(sentryCoreWrapper); ok {
36-
core = wrappedCore.LocalCore()
37-
rootHub = wrappedCore.SentryCore().hub
40+
localCore := logger.Core()
41+
client := sentry.CurrentHub().Client()
42+
var options []SentryCoreOption
43+
if wrappedCore, ok := localCore.(sentryCoreWrapper); ok {
44+
localCore = wrappedCore.LocalCore()
45+
sentryCore := wrappedCore.SentryCore()
46+
client = sentryCore.hub.Client()
47+
48+
if breadcrumbLevel := sentryCore.BreadcrumbLevel; breadcrumbLevel != defaultBreadcrumbLevel {
49+
options = append(options, BreadcrumbLevel(breadcrumbLevel))
50+
}
51+
if eventLevel := sentryCore.BreadcrumbLevel; eventLevel != defaultEventLevel {
52+
options = append(options, EventLevel(eventLevel))
53+
}
3854
}
3955

4056
return func(next http.Handler) http.Handler {
4157
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
42-
logger := zap.New(zapcore.NewTee(core, NewSentryCore(rootHub)))
58+
ctx := r.Context()
59+
60+
core := localCore
61+
if client != nil {
62+
hub := sentry.NewHub(client, sentry.NewScope())
63+
core = NewSentryCoreWrapper(localCore, hub, options...)
64+
65+
ctx = WithHub(ctx, hub)
66+
}
67+
68+
logger := zap.New(core)
69+
ctx = WithLogger(ctx, logger)
4370

4471
ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor)
4572

@@ -54,7 +81,7 @@ func RequestLogger(logger *zap.Logger) func(next http.Handler) http.Handler {
5481
)
5582
}()
5683

57-
next.ServeHTTP(ww, r.WithContext(WithLogger(r.Context(), logger)))
84+
next.ServeHTTP(ww, r.WithContext(ctx))
5885
})
5986
}
6087
}

sentry_core.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import (
1010
"go.uber.org/zap/zapcore"
1111
)
1212

13+
const (
14+
defaultBreadcrumbLevel = zapcore.DebugLevel
15+
defaultEventLevel = zapcore.ErrorLevel
16+
)
17+
1318
type SentryCore struct {
1419
zapcore.LevelEnabler
1520

@@ -47,8 +52,8 @@ func NewSentryCore(hub *sentry.Hub, options ...SentryCoreOption) zapcore.Core {
4752
core := &SentryCore{
4853
hub: hub,
4954
scope: hub.PushScope(),
50-
BreadcrumbLevel: zapcore.DebugLevel,
51-
EventLevel: zapcore.ErrorLevel,
55+
BreadcrumbLevel: defaultBreadcrumbLevel,
56+
EventLevel: defaultEventLevel,
5257
}
5358

5459
for _, option := range options {

0 commit comments

Comments
 (0)