diff --git a/internal/monocular/client.go b/internal/monocular/client.go index f4ef5d647..c964ad62c 100644 --- a/internal/monocular/client.go +++ b/internal/monocular/client.go @@ -18,6 +18,7 @@ package monocular import ( "errors" + "log/slog" "net/url" ) diff --git a/pkg/cli/logger.go b/pkg/cli/logger.go new file mode 100644 index 000000000..243284d76 --- /dev/null +++ b/pkg/cli/logger.go @@ -0,0 +1,43 @@ +/* +Copyright The Helm Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cli + +import ( + "log/slog" + "os" +) + +func NewLogger(debug bool) *slog.Logger { + level := slog.LevelInfo + if debug { + level = slog.LevelDebug + } + + // Create a handler that removes timestamps + handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + Level: level, + ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr { + // Remove the time attribute + if a.Key == slog.TimeKey { + return slog.Attr{} + } + return a + }, + }) + + return slog.New(handler) +} diff --git a/pkg/cmd/helpers_test.go b/pkg/cmd/helpers_test.go index 96bf6434b..a67267fc9 100644 --- a/pkg/cmd/helpers_test.go +++ b/pkg/cmd/helpers_test.go @@ -19,6 +19,7 @@ package cmd import ( "bytes" "io" + "log/slog" "os" "strings" "testing" diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index f246fbd66..8b509a3f9 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "io" + "log/slog" "net/http" "strings" "sync" diff --git a/pkg/kube/ready_test.go b/pkg/kube/ready_test.go index db0d02cbe..e89e74a57 100644 --- a/pkg/kube/ready_test.go +++ b/pkg/kube/ready_test.go @@ -17,6 +17,8 @@ package kube // import "helm.sh/helm/v4/pkg/kube" import ( "context" + "io" + "log/slog" "testing" appsv1 "k8s.io/api/apps/v1" diff --git a/pkg/kube/statuswait_test.go b/pkg/kube/statuswait_test.go index 4b06da896..ed13e1b33 100644 --- a/pkg/kube/statuswait_test.go +++ b/pkg/kube/statuswait_test.go @@ -18,6 +18,8 @@ package kube // import "helm.sh/helm/v3/pkg/kube" import ( "errors" + "io" + "log/slog" "testing" "time" diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index 2b319371e..30980fafe 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -151,9 +151,9 @@ func (hw *legacyWaiter) WaitForDelete(deleted ResourceList, timeout time.Duratio elapsed := time.Since(startTime).Round(time.Second) if err != nil { - slog.Debug("wait for resources failed", "elapsed", elapsed, slog.Any("error", err)) + hw.log.Debug("wait for resources failed", "elapsed", elapsed, "error", err) } else { - slog.Debug("wait for resources succeeded", "elapsed", elapsed) + hw.log.Debug("wait for resources succeeded", "elapsed", elapsed) } return err @@ -397,7 +397,7 @@ func (hw *legacyWaiter) watchUntilReady(timeout time.Duration, info *resource.In return nil } - hw.log("Watching for changes to %s %s with timeout of %v", kind, info.Name, timeout) + hw.log.Debug("watching for resource changes", "kind", kind, "resource", info.Name, "timeout", timeout) // Use a selector on the name of the resource. This should be unique for the // given version and kind @@ -425,7 +425,8 @@ func (hw *legacyWaiter) watchUntilReady(timeout time.Duration, info *resource.In // we get. We care mostly about jobs, where what we want to see is // the status go into a good state. For other types, like ReplicaSet // we don't really do anything to support these as hooks. - hw.log("Add/Modify event for %s: %v", info.Name, e.Type) + hw.log.Debug("add/modify event received", "resource", info.Name, "eventType", e.Type) + switch kind { case "Job": return hw.waitForJob(obj, info.Name) @@ -434,11 +435,11 @@ func (hw *legacyWaiter) watchUntilReady(timeout time.Duration, info *resource.In } return true, nil case watch.Deleted: - hw.log("Deleted event for %s", info.Name) + hw.log.Debug("deleted event received", "resource", info.Name) return true, nil case watch.Error: // Handle error and return with an error. - hw.log("Error event for %s", info.Name) + hw.log.Error("error event received", "resource", info.Name) return true, errors.Errorf("failed to deploy %s", info.Name) default: return false, nil @@ -464,7 +465,7 @@ func (hw *HelmWaiter) waitForJob(obj runtime.Object, name string) (bool, error) } } - hw.log("%s: Jobs active: %d, jobs failed: %d, jobs succeeded: %d", name, o.Status.Active, o.Status.Failed, o.Status.Succeeded) + hw.log.Debug("job status update", "job", name, "active", o.Status.Active, "failed", o.Status.Failed, "succeeded", o.Status.Succeeded) return false, nil } diff --git a/pkg/storage/driver/mock_test.go b/pkg/storage/driver/mock_test.go index 7dba5fea2..6f8e651e5 100644 --- a/pkg/storage/driver/mock_test.go +++ b/pkg/storage/driver/mock_test.go @@ -19,6 +19,8 @@ package driver // import "helm.sh/helm/v4/pkg/storage/driver" import ( "context" "fmt" + "io" + "log/slog" "testing" sqlmock "github.com/DATA-DOG/go-sqlmock"