@@ -18,7 +18,6 @@ package logging
18
18
19
19
import (
20
20
"context"
21
- "fmt"
22
21
"os"
23
22
"time"
24
23
@@ -40,39 +39,43 @@ var ErrCallEnsureLoggerFirst = errors.New("call EnsureLogger() before LoggerFrom
40
39
// context will have a logger attached to it. Given fields will be added to the
41
40
// logger, either new or existing.
42
41
func EnsureLogger (ctx context.Context , fields ... Fields ) context.Context {
43
- z , err := loggerFrom (ctx )
42
+ z , err := zapLoggerFrom (ctx )
44
43
if errors .Is (err , ErrCallEnsureLoggerFirst ) {
45
44
ctx = EnsureLogFile (ctx )
46
45
z = setupLogging (ctx )
47
46
}
48
- l := & zapLogger {SugaredLogger : z }
47
+ l := & ZapLogger {SugaredLogger : z }
49
48
for _ , f := range fields {
50
- l = l .WithFields (f ).(* zapLogger )
49
+ l = l .WithFields (f ).(* ZapLogger )
51
50
}
52
51
return WithLogger (ctx , l )
53
52
}
54
53
55
54
// LoggerFrom returns the logger from the context. If EnsureLogger() was not
56
55
// called before, it will panic.
57
56
func LoggerFrom (ctx context.Context ) Logger {
58
- z , err := loggerFrom (ctx )
57
+ if l , ok := ctx .Value (loggerKey ).(Logger ); ok {
58
+ return l
59
+ }
60
+ z , err := zapLoggerFrom (ctx )
59
61
if err != nil {
60
62
fatal (err )
61
63
}
62
64
63
- return & zapLogger {z }
65
+ return & ZapLogger {z }
64
66
}
65
67
66
68
// WithLogger attaches the given logger to the context.
67
69
func WithLogger (ctx context.Context , l Logger ) context.Context {
68
- if z , ok := l .(* zapLogger ); ok {
70
+ if z , ok := l .(* ZapLogger ); ok {
69
71
return logging .WithLogger (ctx , z .SugaredLogger )
70
72
}
71
- fatal ("unsupported logger type: " + fmt .Sprintf ("%#v" , l ))
72
- return nil
73
+ return context .WithValue (ctx , loggerKey , l )
73
74
}
74
75
75
- func loggerFrom (ctx context.Context ) (* zap.SugaredLogger , error ) {
76
+ var loggerKey = struct {}{}
77
+
78
+ func zapLoggerFrom (ctx context.Context ) (* zap.SugaredLogger , error ) {
76
79
l := logging .FromContext (ctx )
77
80
if l .Desugar ().Name () == "fallback" {
78
81
return nil , ErrCallEnsureLoggerFirst
@@ -161,6 +164,8 @@ func activeLogLevel(defaultLevel zapcore.Level) zapcore.Level {
161
164
return defaultLevel
162
165
}
163
166
167
+ // ElapsedMillisTimeEncoder is a time encoder using elapsed time since the
168
+ // logger setup.
164
169
func ElapsedMillisTimeEncoder (setupTime time.Time ) zapcore.TimeEncoder {
165
170
return func (t time.Time , enc zapcore.PrimitiveArrayEncoder ) {
166
171
enc .AppendInt64 (t .Sub (setupTime ).Milliseconds ())
0 commit comments