From 40b38f09d9b3f2cb3de7037758c3a40c7b108c37 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Fri, 26 Nov 2021 10:46:29 +0100 Subject: [PATCH] json: more flexible constructor The encoder configuration can now be chosen by the caller. This will be used by a benchmark to write messages without caller and time stamp. While at it, some places where the logger was unnecessarily tested with split output streams writing into the same actual stream were replaced with writing as single stream. This is a leftover from a previous incarnation of the split output stream patch where identical streams were used instead of nil for the error stream to indicate "single stream". --- .../k8s.io/component-base/logs/json/json.go | 29 ++++++++++--------- .../logs/json/json_benchmark_test.go | 6 ++-- .../component-base/logs/json/json_test.go | 10 +++---- .../component-base/logs/json/klog_test.go | 4 +-- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/staging/src/k8s.io/component-base/logs/json/json.go b/staging/src/k8s.io/component-base/logs/json/json.go index 32e66007a48..1adada10cd4 100644 --- a/staging/src/k8s.io/component-base/logs/json/json.go +++ b/staging/src/k8s.io/component-base/logs/json/json.go @@ -36,8 +36,20 @@ var ( // NewJSONLogger creates a new json logr.Logger and its associated // flush function. The separate error stream is optional and may be nil. -func NewJSONLogger(infoStream, errorStream zapcore.WriteSyncer) (logr.Logger, func()) { - encoder := zapcore.NewJSONEncoder(encoderConfig) +// The encoder config is also optional. +func NewJSONLogger(infoStream, errorStream zapcore.WriteSyncer, encoderConfig *zapcore.EncoderConfig) (logr.Logger, func()) { + if encoderConfig == nil { + encoderConfig = &zapcore.EncoderConfig{ + MessageKey: "msg", + CallerKey: "caller", + TimeKey: "ts", + EncodeTime: epochMillisTimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } + } + + encoder := zapcore.NewJSONEncoder(*encoderConfig) var core zapcore.Core if errorStream == nil { core = zapcore.NewCore(encoder, infoStream, zapcore.Level(-127)) @@ -59,15 +71,6 @@ func NewJSONLogger(infoStream, errorStream zapcore.WriteSyncer) (logr.Logger, fu } } -var encoderConfig = zapcore.EncoderConfig{ - MessageKey: "msg", - CallerKey: "caller", - TimeKey: "ts", - EncodeTime: epochMillisTimeEncoder, - EncodeDuration: zapcore.StringDurationEncoder, - EncodeCaller: zapcore.ShortCallerEncoder, -} - func epochMillisTimeEncoder(_ time.Time, enc zapcore.PrimitiveArrayEncoder) { nanos := timeNow().UnixNano() millis := float64(nanos) / float64(time.Millisecond) @@ -95,8 +98,8 @@ func (f Factory) Create(options config.FormatOptions) (logr.Logger, func()) { } } // stdout for info messages, stderr for errors. - return NewJSONLogger(stdout, stderr) + return NewJSONLogger(stdout, stderr, nil) } // Write info messages and errors to stderr to prevent mixing with normal program output. - return NewJSONLogger(stderr, nil) + return NewJSONLogger(stderr, nil, nil) } diff --git a/staging/src/k8s.io/component-base/logs/json/json_benchmark_test.go b/staging/src/k8s.io/component-base/logs/json/json_benchmark_test.go index 7d894896bcd..ca4d6949090 100644 --- a/staging/src/k8s.io/component-base/logs/json/json_benchmark_test.go +++ b/staging/src/k8s.io/component-base/logs/json/json_benchmark_test.go @@ -26,7 +26,7 @@ import ( var writer = zapcore.AddSync(&writeSyncer{}) func BenchmarkInfoLoggerInfo(b *testing.B) { - logger, _ := NewJSONLogger(writer, writer) + logger, _ := NewJSONLogger(writer, nil, nil) b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { @@ -55,7 +55,7 @@ func BenchmarkInfoLoggerInfo(b *testing.B) { } func BenchmarkZapLoggerError(b *testing.B) { - logger, _ := NewJSONLogger(writer, writer) + logger, _ := NewJSONLogger(writer, nil, nil) b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { @@ -85,7 +85,7 @@ func BenchmarkZapLoggerError(b *testing.B) { } func BenchmarkZapLoggerV(b *testing.B) { - logger, _ := NewJSONLogger(writer, writer) + logger, _ := NewJSONLogger(writer, nil, nil) b.ResetTimer() b.RunParallel(func(pb *testing.PB) { for pb.Next() { diff --git a/staging/src/k8s.io/component-base/logs/json/json_test.go b/staging/src/k8s.io/component-base/logs/json/json_test.go index 75edaad0986..a360d10c934 100644 --- a/staging/src/k8s.io/component-base/logs/json/json_test.go +++ b/staging/src/k8s.io/component-base/logs/json/json_test.go @@ -64,7 +64,7 @@ func TestZapLoggerInfo(t *testing.T) { for _, data := range testDataInfo { var buffer bytes.Buffer writer := zapcore.AddSync(&buffer) - sampleInfoLogger, _ := NewJSONLogger(writer, nil) + sampleInfoLogger, _ := NewJSONLogger(writer, nil, nil) sampleInfoLogger.Info(data.msg, data.keysValues...) logStr := buffer.String() @@ -94,7 +94,7 @@ func TestZapLoggerInfo(t *testing.T) { // TestZapLoggerEnabled test ZapLogger enabled func TestZapLoggerEnabled(t *testing.T) { - sampleInfoLogger, _ := NewJSONLogger(nil, nil) + sampleInfoLogger, _ := NewJSONLogger(nil, nil, nil) for i := 0; i < 11; i++ { if !sampleInfoLogger.V(i).Enabled() { t.Errorf("V(%d).Info should be enabled", i) @@ -111,7 +111,7 @@ func TestZapLoggerV(t *testing.T) { for i := 0; i < 11; i++ { var buffer bytes.Buffer writer := zapcore.AddSync(&buffer) - sampleInfoLogger, _ := NewJSONLogger(writer, nil) + sampleInfoLogger, _ := NewJSONLogger(writer, nil, nil) sampleInfoLogger.V(i).Info("test", "ns", "default", "podnum", 2, "time", time.Microsecond) logStr := buffer.String() var v, lineNo int @@ -138,7 +138,7 @@ func TestZapLoggerError(t *testing.T) { timeNow = func() time.Time { return time.Date(1970, time.January, 1, 0, 0, 0, 123, time.UTC) } - sampleInfoLogger, _ := NewJSONLogger(writer, nil) + sampleInfoLogger, _ := NewJSONLogger(writer, nil, nil) sampleInfoLogger.Error(fmt.Errorf("invalid namespace:%s", "default"), "wrong namespace", "ns", "default", "podnum", 2, "time", time.Microsecond) logStr := buffer.String() var ts float64 @@ -156,7 +156,7 @@ func TestZapLoggerError(t *testing.T) { func TestZapLoggerStreams(t *testing.T) { var infoBuffer, errorBuffer bytes.Buffer - log, _ := NewJSONLogger(zapcore.AddSync(&infoBuffer), zapcore.AddSync(&errorBuffer)) + log, _ := NewJSONLogger(zapcore.AddSync(&infoBuffer), zapcore.AddSync(&errorBuffer), nil) log.Error(fmt.Errorf("some error"), "failed") log.Info("hello world") diff --git a/staging/src/k8s.io/component-base/logs/json/klog_test.go b/staging/src/k8s.io/component-base/logs/json/klog_test.go index ae6441ff3cf..19c26590e6c 100644 --- a/staging/src/k8s.io/component-base/logs/json/klog_test.go +++ b/staging/src/k8s.io/component-base/logs/json/klog_test.go @@ -239,7 +239,7 @@ func TestKlogIntegration(t *testing.T) { t.Run(tc.name, func(t *testing.T) { var buffer bytes.Buffer writer := zapcore.AddSync(&buffer) - logger, _ := NewJSONLogger(writer, writer) + logger, _ := NewJSONLogger(writer, nil, nil) klog.SetLogger(logger) defer klog.ClearLogger() @@ -270,7 +270,7 @@ func TestKlogIntegration(t *testing.T) { func TestKlogV(t *testing.T) { var buffer testBuff writer := zapcore.AddSync(&buffer) - logger, _ := NewJSONLogger(writer, writer) + logger, _ := NewJSONLogger(writer, nil, nil) klog.SetLogger(logger) defer klog.ClearLogger() fs := flag.FlagSet{}