-
Notifications
You must be signed in to change notification settings - Fork 8
/
logger.go
51 lines (44 loc) · 1.66 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
package restql
import (
"context"
)
// Logger is the interface that wraps all methods for log handling
type Logger interface {
Panic(msg string, fields ...interface{})
Fatal(msg string, fields ...interface{})
Error(msg string, err error, fields ...interface{})
Warn(msg string, fields ...interface{})
Info(msg string, fields ...interface{})
Debug(msg string, fields ...interface{})
With(key string, value interface{}) Logger
}
type loggerCtxKey struct{}
// WithLogger stores a logger instance in a child context.Context
// created from the given context.Context.
// If a logger instance is already present, then it returns
// the current context.
func WithLogger(ctx context.Context, l Logger) context.Context {
if lp, ok := ctx.Value(loggerCtxKey{}).(Logger); ok {
if lp == l {
return ctx
}
}
return context.WithValue(ctx, loggerCtxKey{}, l)
}
// GetLogger extracts a logger instance from the given
// context.Context. If none is present, then a no operation
// logger is returned.
func GetLogger(ctx context.Context) Logger {
if l, ok := ctx.Value(loggerCtxKey{}).(Logger); ok {
return l
}
return noOpLogger{}
}
type noOpLogger struct{}
func (n noOpLogger) Panic(msg string, fields ...interface{}) {}
func (n noOpLogger) Fatal(msg string, fields ...interface{}) {}
func (n noOpLogger) Error(msg string, err error, fields ...interface{}) {}
func (n noOpLogger) Warn(msg string, fields ...interface{}) {}
func (n noOpLogger) Info(msg string, fields ...interface{}) {}
func (n noOpLogger) Debug(msg string, fields ...interface{}) {}
func (n noOpLogger) With(key string, value interface{}) Logger { return n }