From b4988a4259699cd15b6240a6a28122a00478221c Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 4 Nov 2021 10:24:01 +0100 Subject: [PATCH] component-base: use stderr as default output stream for JSON This makes it consistent with klog's text output and avoids polluting the programs normal output with log messages. This may become relevant for command line tools like "kubectl". --- staging/src/k8s.io/component-base/logs/example/cmd/logger.go | 2 ++ staging/src/k8s.io/component-base/logs/json/json.go | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/staging/src/k8s.io/component-base/logs/example/cmd/logger.go b/staging/src/k8s.io/component-base/logs/example/cmd/logger.go index f3d8e7c9dbb..a317208cbe7 100644 --- a/staging/src/k8s.io/component-base/logs/example/cmd/logger.go +++ b/staging/src/k8s.io/component-base/logs/example/cmd/logger.go @@ -54,6 +54,8 @@ func NewLoggerCommand() *cobra.Command { } func runLogger() { + fmt.Println("This is normal output via stdout.") + fmt.Fprintln(os.Stderr, "This is other output via stderr.") klog.Infof("Log using Infof, key: %s", "value") klog.InfoS("Log using InfoS", "key", "value") err := errors.New("fail") 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 37983a1ba05..732057b3688 100644 --- a/staging/src/k8s.io/component-base/logs/json/json.go +++ b/staging/src/k8s.io/component-base/logs/json/json.go @@ -93,6 +93,7 @@ var _ registry.LogFormatFactory = Factory{} func (f Factory) Create(options config.FormatOptions) (logr.Logger, func()) { if options.JSON.SplitStream { + // stdout for info messages, stderr for errors. infoStream := zapcore.Lock(os.Stdout) size := options.JSON.InfoBufferSize.Value() if size > 0 { @@ -107,7 +108,9 @@ func (f Factory) Create(options config.FormatOptions) (logr.Logger, func()) { } return NewJSONLogger(infoStream, zapcore.Lock(os.Stderr)) } - out := zapcore.Lock(os.Stdout) + // The default is to write to stderr (same as in klog's text output, + // doesn't get mixed with normal program output). + out := zapcore.Lock(os.Stderr) return NewJSONLogger(out, out) }