@@ -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
1417func 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
3239func 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}
0 commit comments