Skip to content

Commit 3a2bcba

Browse files
committed
Publicate Zap based logger, and allow custom loggers to be used.
1 parent a386468 commit 3a2bcba

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

pkg/output/logging/context.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package logging
1818

1919
import (
2020
"context"
21-
"fmt"
2221
"os"
2322
"time"
2423

@@ -40,39 +39,43 @@ var ErrCallEnsureLoggerFirst = errors.New("call EnsureLogger() before LoggerFrom
4039
// context will have a logger attached to it. Given fields will be added to the
4140
// logger, either new or existing.
4241
func EnsureLogger(ctx context.Context, fields ...Fields) context.Context {
43-
z, err := loggerFrom(ctx)
42+
z, err := zapLoggerFrom(ctx)
4443
if errors.Is(err, ErrCallEnsureLoggerFirst) {
4544
ctx = EnsureLogFile(ctx)
4645
z = setupLogging(ctx)
4746
}
48-
l := &zapLogger{SugaredLogger: z}
47+
l := &ZapLogger{SugaredLogger: z}
4948
for _, f := range fields {
50-
l = l.WithFields(f).(*zapLogger)
49+
l = l.WithFields(f).(*ZapLogger)
5150
}
5251
return WithLogger(ctx, l)
5352
}
5453

5554
// LoggerFrom returns the logger from the context. If EnsureLogger() was not
5655
// called before, it will panic.
5756
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)
5961
if err != nil {
6062
fatal(err)
6163
}
6264

63-
return &zapLogger{z}
65+
return &ZapLogger{z}
6466
}
6567

6668
// WithLogger attaches the given logger to the context.
6769
func WithLogger(ctx context.Context, l Logger) context.Context {
68-
if z, ok := l.(*zapLogger); ok {
70+
if z, ok := l.(*ZapLogger); ok {
6971
return logging.WithLogger(ctx, z.SugaredLogger)
7072
}
71-
fatal("unsupported logger type: " + fmt.Sprintf("%#v", l))
72-
return nil
73+
return context.WithValue(ctx, loggerKey, l)
7374
}
7475

75-
func loggerFrom(ctx context.Context) (*zap.SugaredLogger, error) {
76+
var loggerKey = struct{}{}
77+
78+
func zapLoggerFrom(ctx context.Context) (*zap.SugaredLogger, error) {
7679
l := logging.FromContext(ctx)
7780
if l.Desugar().Name() == "fallback" {
7881
return nil, ErrCallEnsureLoggerFirst
@@ -161,6 +164,8 @@ func activeLogLevel(defaultLevel zapcore.Level) zapcore.Level {
161164
return defaultLevel
162165
}
163166

167+
// ElapsedMillisTimeEncoder is a time encoder using elapsed time since the
168+
// logger setup.
164169
func ElapsedMillisTimeEncoder(setupTime time.Time) zapcore.TimeEncoder {
165170
return func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
166171
enc.AppendInt64(t.Sub(setupTime).Milliseconds())

pkg/output/logging/zap.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,24 @@ package logging
1818

1919
import "go.uber.org/zap"
2020

21-
type zapLogger struct {
21+
// ZapLogger is a Google' zap logger based logger.
22+
type ZapLogger struct {
2223
*zap.SugaredLogger
2324
}
2425

25-
func (z zapLogger) WithName(name string) Logger {
26-
return &zapLogger{
26+
func (z ZapLogger) WithName(name string) Logger {
27+
return &ZapLogger{
2728
SugaredLogger: z.SugaredLogger.Named(name),
2829
}
2930
}
3031

31-
func (z zapLogger) WithFields(fields Fields) Logger {
32+
func (z ZapLogger) WithFields(fields Fields) Logger {
3233
a := make([]interface{}, 0, len(fields)*2)
3334
for k, v := range fields {
3435
a = append(a, k, v)
3536
}
3637

37-
return &zapLogger{
38+
return &ZapLogger{
3839
SugaredLogger: z.SugaredLogger.With(a...),
3940
}
4041
}

0 commit comments

Comments
 (0)