From 76413078f151289b09509c5c44047adf916fd54f Mon Sep 17 00:00:00 2001 From: Pierluigi Lenoci Date: Wed, 22 Apr 2026 09:44:47 +0200 Subject: [PATCH] fix: honor -stderrthreshold when -logtostderr is true (default) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit klog v2 defaults -logtostderr to true, which silently ignores the -stderrthreshold flag — all log levels are unconditionally sent to stderr. This makes it impossible for log-aggregation systems to filter by severity. Bump klog to v2.140.0 and opt into the fixed behavior by setting legacy_stderr_threshold_behavior=false and stderrthreshold=INFO across all binaries and test utilities. This preserves current output while letting users override via CLI flags. Ref: kubernetes/klog#212, kubernetes/klog#432 Signed-off-by: Pierluigi Lenoci --- client/clientexample/main.go | 5 +++++ cmd/cadvisor.go | 5 +++++ go.mod | 2 +- go.sum | 4 ++-- integration/runner/runner.go | 5 +++++ integration/tests/api/test_utils.go | 6 ++++++ integration/tests/crio/test_utils.go | 6 ++++++ integration/tests/healthz/test_utils.go | 11 ++++++++++- utils/oomparser/oomexample/main.go | 5 +++++ 9 files changed, 45 insertions(+), 4 deletions(-) diff --git a/client/clientexample/main.go b/client/clientexample/main.go index 8f29a1e109..f8419360ac 100644 --- a/client/clientexample/main.go +++ b/client/clientexample/main.go @@ -61,6 +61,11 @@ func streamingClientExample(url string) { // demonstrates how to use event clients func main() { klog.InitFlags(nil) + // Opt into the new klog behavior so that -stderrthreshold is honored even + // when -logtostderr=true (the default). + // Ref: kubernetes/klog#212, kubernetes/klog#432 + flag.Set("legacy_stderr_threshold_behavior", "false") //nolint:errcheck + flag.Set("stderrthreshold", "INFO") //nolint:errcheck flag.Parse() staticClientExample() streamingClientExample("?creation_events=true&stream=true&oom_events=true&deletion_events=true") diff --git a/cmd/cadvisor.go b/cmd/cadvisor.go index fac72809bd..b754e4ba5e 100644 --- a/cmd/cadvisor.go +++ b/cmd/cadvisor.go @@ -108,6 +108,11 @@ func init() { func main() { klog.InitFlags(nil) defer klog.Flush() + // Opt into the new klog behavior so that -stderrthreshold is honored even + // when -logtostderr=true (the default). + // Ref: kubernetes/klog#212, kubernetes/klog#432 + flag.Set("legacy_stderr_threshold_behavior", "false") //nolint:errcheck + flag.Set("stderrthreshold", "INFO") //nolint:errcheck // Default logging verbosity to V(2) _ = flag.Set("v", "2") flag.Parse() diff --git a/go.mod b/go.mod index f6fa4fa359..cee2a9fad9 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( golang.org/x/sys v0.39.0 google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.10 - k8s.io/klog/v2 v2.130.1 + k8s.io/klog/v2 v2.140.0 k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 ) diff --git a/go.sum b/go.sum index b8a9e3325a..8694824d2b 100644 --- a/go.sum +++ b/go.sum @@ -194,8 +194,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979 h1:jgJW5IePPXLGB8e/1wvd0Ich9QE97RvvF3a8J3fP/Lg= k8s.io/utils v0.0.0-20250502105355-0f33e8f1c979/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= diff --git a/integration/runner/runner.go b/integration/runner/runner.go index fe0e0aedda..c7a7484d86 100644 --- a/integration/runner/runner.go +++ b/integration/runner/runner.go @@ -281,6 +281,11 @@ func initRetryWhitelist() { func main() { klog.InitFlags(nil) + // Opt into the new klog behavior so that -stderrthreshold is honored even + // when -logtostderr=true (the default). + // Ref: kubernetes/klog#212, kubernetes/klog#432 + flag.Set("legacy_stderr_threshold_behavior", "false") //nolint:errcheck + flag.Set("stderrthreshold", "INFO") //nolint:errcheck flag.Parse() // Check usage. diff --git a/integration/tests/api/test_utils.go b/integration/tests/api/test_utils.go index 522e61c0b1..1c4a789ead 100644 --- a/integration/tests/api/test_utils.go +++ b/integration/tests/api/test_utils.go @@ -17,6 +17,7 @@ package api import ( + "flag" "testing" "time" @@ -29,6 +30,11 @@ import ( func init() { klog.InitFlags(nil) + // Opt into the new klog behavior so that -stderrthreshold is honored even + // when -logtostderr=true (the default). + // Ref: kubernetes/klog#212, kubernetes/klog#432 + flag.Set("legacy_stderr_threshold_behavior", "false") //nolint:errcheck + flag.Set("stderrthreshold", "INFO") //nolint:errcheck } // Checks that expected and actual are within delta of each other. diff --git a/integration/tests/crio/test_utils.go b/integration/tests/crio/test_utils.go index 7863f10f90..ef59f7ca2c 100644 --- a/integration/tests/crio/test_utils.go +++ b/integration/tests/crio/test_utils.go @@ -17,6 +17,7 @@ package crio import ( + "flag" "testing" "time" @@ -29,6 +30,11 @@ import ( func init() { klog.InitFlags(nil) + // Opt into the new klog behavior so that -stderrthreshold is honored even + // when -logtostderr=true (the default). + // Ref: kubernetes/klog#212, kubernetes/klog#432 + flag.Set("legacy_stderr_threshold_behavior", "false") //nolint:errcheck + flag.Set("stderrthreshold", "INFO") //nolint:errcheck } // Checks that expected and actual are within delta of each other. diff --git a/integration/tests/healthz/test_utils.go b/integration/tests/healthz/test_utils.go index 7c550274ad..d515eec3a3 100644 --- a/integration/tests/healthz/test_utils.go +++ b/integration/tests/healthz/test_utils.go @@ -14,8 +14,17 @@ package healthz -import "k8s.io/klog/v2" +import ( + "flag" + + "k8s.io/klog/v2" +) func init() { klog.InitFlags(nil) + // Opt into the new klog behavior so that -stderrthreshold is honored even + // when -logtostderr=true (the default). + // Ref: kubernetes/klog#212, kubernetes/klog#432 + flag.Set("legacy_stderr_threshold_behavior", "false") //nolint:errcheck + flag.Set("stderrthreshold", "INFO") //nolint:errcheck } diff --git a/utils/oomparser/oomexample/main.go b/utils/oomparser/oomexample/main.go index 7987a664f3..c8c8f88db1 100644 --- a/utils/oomparser/oomexample/main.go +++ b/utils/oomparser/oomexample/main.go @@ -27,6 +27,11 @@ import ( // demonstrates how to run oomparser.OomParser to get OomInstance information func main() { klog.InitFlags(nil) + // Opt into the new klog behavior so that -stderrthreshold is honored even + // when -logtostderr=true (the default). + // Ref: kubernetes/klog#212, kubernetes/klog#432 + flag.Set("legacy_stderr_threshold_behavior", "false") //nolint:errcheck + flag.Set("stderrthreshold", "INFO") //nolint:errcheck flag.Parse() // out is a user-provided channel from which the user can read incoming // OomInstance objects