diff --git a/test/output.go b/test/output.go index 4dc52f76..ecba5d44 100644 --- a/test/output.go +++ b/test/output.go @@ -39,6 +39,7 @@ import ( "github.com/go-logr/logr" "k8s.io/klog/v2" + "k8s.io/klog/v2/textlogger" ) // InitKlog must be called in a test to configure klog for testing. @@ -577,7 +578,7 @@ func Output(t *testing.T, config OutputConfig) { if config.AsBackend { testOutput(t, printWithKlogLine-1, func(buffer *bytes.Buffer) { - klog.SetLogger(config.NewLogger(buffer, 10, test.vmodule)) + setLogger(config.NewLogger(buffer, 10, test.vmodule)) printWithKlog(test) }) return @@ -765,10 +766,11 @@ func Output(t *testing.T, config OutputConfig) { for i, test := range tests { t.Run(test.name, func(t *testing.T) { var buffer bytes.Buffer + haveWriteKlogBuffer := false if config.NewLogger == nil { klog.SetOutput(&buffer) } else { - klog.SetLogger(config.NewLogger(&buffer, 10, "")) + haveWriteKlogBuffer = setLogger(config.NewLogger(&buffer, 10, "")) defer klog.ClearLogger() } test.logFunc() @@ -789,6 +791,7 @@ func Output(t *testing.T, config OutputConfig) { // result, including a trailing newline, to // Logger.Info. if config.NewLogger != nil && + !haveWriteKlogBuffer && !strings.HasSuffix(test.name, "S") && !strings.HasSuffix(test.name, "SDepth") { // klog: I output.go:] hello world @@ -851,7 +854,7 @@ func Benchmark(b *testing.B, config OutputConfig) { } if config.AsBackend { - klog.SetLogger(config.NewLogger(io.Discard, 10, "")) + setLogger(config.NewLogger(io.Discard, 10, "")) for i := 0; i < b.N; i++ { printWithKlog(test) } @@ -871,6 +874,17 @@ func Benchmark(b *testing.B, config OutputConfig) { } } +func setLogger(logger logr.Logger) bool { + haveWriteKlogBuffer := false + var opts []klog.LoggerOption + if writer, ok := logger.GetSink().(textlogger.KlogBufferWriter); ok { + opts = append(opts, klog.WriteKlogBuffer(writer.WriteKlogBuffer)) + haveWriteKlogBuffer = true + } + klog.SetLoggerWithOptions(logger, opts...) + return haveWriteKlogBuffer +} + func copySlice(in []interface{}) []interface{} { return append([]interface{}{}, in...) } diff --git a/textlogger/textlogger.go b/textlogger/textlogger.go index be946e0f..b53b3b79 100644 --- a/textlogger/textlogger.go +++ b/textlogger/textlogger.go @@ -134,6 +134,10 @@ func (l *tlogger) print(err error, s severity.Severity, msg string, kvList []int l.config.co.output.Write(b.Bytes()) } +func (l *tlogger) WriteKlogBuffer(data []byte) { + l.config.co.output.Write(data) +} + // WithName returns a new logr.Logger with the specified name appended. klogr // uses '/' characters to separate name elements. Callers should not pass '/' // in the provided name string, but this library does not actually enforce that. @@ -152,5 +156,15 @@ func (l *tlogger) WithValues(kvList ...interface{}) logr.LogSink { return &new } +// KlogBufferWriter is implemented by the textlogger LogSink. +type KlogBufferWriter interface { + // WriteKlogBuffer takes a pre-formatted buffer prepared by klog and + // writes it unchanged to the output stream. Can be used with + // klog.WriteKlogBuffer when setting a logger through + // klog.SetLoggerWithOptions. + WriteKlogBuffer([]byte) +} + var _ logr.LogSink = &tlogger{} var _ logr.CallDepthLogSink = &tlogger{} +var _ KlogBufferWriter = &tlogger{}