/
context.go
39 lines (32 loc) · 1 KB
/
context.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
package cannon
import (
"context"
"errors"
"go.uber.org/zap"
)
type ctxLogger string
// CtxLogger will pass the logger in the context to subsequent request handlers
func CtxLogger(parent context.Context, logger *zap.Logger) context.Context {
return context.WithValue(parent, ctxLogger("cannon"), logger)
}
// LoggerFromCtx will extract a logger from the context
func LoggerFromCtx(ctx context.Context) (*zap.Logger, error) {
log := ctx.Value(ctxLogger("cannon"))
logger, ok := log.(*zap.Logger)
if !ok || logger == nil {
return nil, errors.New("unknown logger type")
}
return logger, nil
}
// CtxSLogger will pass a sugared logger in the context
func CtxSLogger(parent context.Context, logger *zap.SugaredLogger) context.Context {
return CtxLogger(parent, logger.Desugar())
}
// SSLoggerFromCtx will extract a sugared logger from the context
func SLoggerFromCtx(ctx context.Context) (*zap.SugaredLogger, error) {
l, err := LoggerFromCtx(ctx)
if err != nil {
return nil, err
}
return l.Sugar(), nil
}