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".
This commit is contained in:
Patrick Ohly 2021-11-26 10:46:29 +01:00
parent a0dfd958d5
commit 40b38f09d9
4 changed files with 26 additions and 23 deletions

View File

@ -36,8 +36,20 @@ var (
// NewJSONLogger creates a new json logr.Logger and its associated // NewJSONLogger creates a new json logr.Logger and its associated
// flush function. The separate error stream is optional and may be nil. // flush function. The separate error stream is optional and may be nil.
func NewJSONLogger(infoStream, errorStream zapcore.WriteSyncer) (logr.Logger, func()) { // The encoder config is also optional.
encoder := zapcore.NewJSONEncoder(encoderConfig) 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 var core zapcore.Core
if errorStream == nil { if errorStream == nil {
core = zapcore.NewCore(encoder, infoStream, zapcore.Level(-127)) 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) { func epochMillisTimeEncoder(_ time.Time, enc zapcore.PrimitiveArrayEncoder) {
nanos := timeNow().UnixNano() nanos := timeNow().UnixNano()
millis := float64(nanos) / float64(time.Millisecond) 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. // 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. // Write info messages and errors to stderr to prevent mixing with normal program output.
return NewJSONLogger(stderr, nil) return NewJSONLogger(stderr, nil, nil)
} }

View File

@ -26,7 +26,7 @@ import (
var writer = zapcore.AddSync(&writeSyncer{}) var writer = zapcore.AddSync(&writeSyncer{})
func BenchmarkInfoLoggerInfo(b *testing.B) { func BenchmarkInfoLoggerInfo(b *testing.B) {
logger, _ := NewJSONLogger(writer, writer) logger, _ := NewJSONLogger(writer, nil, nil)
b.ResetTimer() b.ResetTimer()
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {
@ -55,7 +55,7 @@ func BenchmarkInfoLoggerInfo(b *testing.B) {
} }
func BenchmarkZapLoggerError(b *testing.B) { func BenchmarkZapLoggerError(b *testing.B) {
logger, _ := NewJSONLogger(writer, writer) logger, _ := NewJSONLogger(writer, nil, nil)
b.ResetTimer() b.ResetTimer()
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {
@ -85,7 +85,7 @@ func BenchmarkZapLoggerError(b *testing.B) {
} }
func BenchmarkZapLoggerV(b *testing.B) { func BenchmarkZapLoggerV(b *testing.B) {
logger, _ := NewJSONLogger(writer, writer) logger, _ := NewJSONLogger(writer, nil, nil)
b.ResetTimer() b.ResetTimer()
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
for pb.Next() { for pb.Next() {

View File

@ -64,7 +64,7 @@ func TestZapLoggerInfo(t *testing.T) {
for _, data := range testDataInfo { for _, data := range testDataInfo {
var buffer bytes.Buffer var buffer bytes.Buffer
writer := zapcore.AddSync(&buffer) writer := zapcore.AddSync(&buffer)
sampleInfoLogger, _ := NewJSONLogger(writer, nil) sampleInfoLogger, _ := NewJSONLogger(writer, nil, nil)
sampleInfoLogger.Info(data.msg, data.keysValues...) sampleInfoLogger.Info(data.msg, data.keysValues...)
logStr := buffer.String() logStr := buffer.String()
@ -94,7 +94,7 @@ func TestZapLoggerInfo(t *testing.T) {
// TestZapLoggerEnabled test ZapLogger enabled // TestZapLoggerEnabled test ZapLogger enabled
func TestZapLoggerEnabled(t *testing.T) { func TestZapLoggerEnabled(t *testing.T) {
sampleInfoLogger, _ := NewJSONLogger(nil, nil) sampleInfoLogger, _ := NewJSONLogger(nil, nil, nil)
for i := 0; i < 11; i++ { for i := 0; i < 11; i++ {
if !sampleInfoLogger.V(i).Enabled() { if !sampleInfoLogger.V(i).Enabled() {
t.Errorf("V(%d).Info should be enabled", i) t.Errorf("V(%d).Info should be enabled", i)
@ -111,7 +111,7 @@ func TestZapLoggerV(t *testing.T) {
for i := 0; i < 11; i++ { for i := 0; i < 11; i++ {
var buffer bytes.Buffer var buffer bytes.Buffer
writer := zapcore.AddSync(&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) sampleInfoLogger.V(i).Info("test", "ns", "default", "podnum", 2, "time", time.Microsecond)
logStr := buffer.String() logStr := buffer.String()
var v, lineNo int var v, lineNo int
@ -138,7 +138,7 @@ func TestZapLoggerError(t *testing.T) {
timeNow = func() time.Time { timeNow = func() time.Time {
return time.Date(1970, time.January, 1, 0, 0, 0, 123, time.UTC) 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) sampleInfoLogger.Error(fmt.Errorf("invalid namespace:%s", "default"), "wrong namespace", "ns", "default", "podnum", 2, "time", time.Microsecond)
logStr := buffer.String() logStr := buffer.String()
var ts float64 var ts float64
@ -156,7 +156,7 @@ func TestZapLoggerError(t *testing.T) {
func TestZapLoggerStreams(t *testing.T) { func TestZapLoggerStreams(t *testing.T) {
var infoBuffer, errorBuffer bytes.Buffer 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.Error(fmt.Errorf("some error"), "failed")
log.Info("hello world") log.Info("hello world")

View File

@ -239,7 +239,7 @@ func TestKlogIntegration(t *testing.T) {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
var buffer bytes.Buffer var buffer bytes.Buffer
writer := zapcore.AddSync(&buffer) writer := zapcore.AddSync(&buffer)
logger, _ := NewJSONLogger(writer, writer) logger, _ := NewJSONLogger(writer, nil, nil)
klog.SetLogger(logger) klog.SetLogger(logger)
defer klog.ClearLogger() defer klog.ClearLogger()
@ -270,7 +270,7 @@ func TestKlogIntegration(t *testing.T) {
func TestKlogV(t *testing.T) { func TestKlogV(t *testing.T) {
var buffer testBuff var buffer testBuff
writer := zapcore.AddSync(&buffer) writer := zapcore.AddSync(&buffer)
logger, _ := NewJSONLogger(writer, writer) logger, _ := NewJSONLogger(writer, nil, nil)
klog.SetLogger(logger) klog.SetLogger(logger)
defer klog.ClearLogger() defer klog.ClearLogger()
fs := flag.FlagSet{} fs := flag.FlagSet{}