mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 21:17:23 +00:00
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:
parent
a0dfd958d5
commit
40b38f09d9
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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")
|
||||||
|
@ -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{}
|
||||||
|
Loading…
Reference in New Issue
Block a user