diff --git a/.golangci.yml b/.golangci.yml index 103b3e35a..80547f7e8 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -33,6 +33,7 @@ linters: - prealloc - reassign - revive + - sloglint - staticcheck - stylecheck - tenv diff --git a/cmd/admin/admin.go b/cmd/admin/admin.go index d5730217e..2f1397a0b 100644 --- a/cmd/admin/admin.go +++ b/cmd/admin/admin.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "github.com/netapp/harvest/v2/pkg/conf" - "github.com/netapp/harvest/v2/pkg/logging" "github.com/netapp/harvest/v2/pkg/util" "github.com/rs/zerolog" "github.com/spf13/cobra" @@ -111,7 +110,6 @@ func (a *Admin) APISD(w http.ResponseWriter, r *http.Request) { func (a *Admin) setupLogger() { zerolog.SetGlobalLevel(zerolog.InfoLevel) - zerolog.ErrorStackMarshaler = logging.MarshalStack //nolint:reassign a.logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}). With().Caller().Timestamp().Logger() diff --git a/cmd/collectors/restperf/plugins/nic/nic.go b/cmd/collectors/restperf/plugins/nic/nic.go index 5464b129b..9d0d34f45 100644 --- a/cmd/collectors/restperf/plugins/nic/nic.go +++ b/cmd/collectors/restperf/plugins/nic/nic.go @@ -74,7 +74,7 @@ func (n *Nic) Init() error { timeout, _ := time.ParseDuration(rest.DefaultTimeout) if n.client, err = rest.New(conf.ZapiPoller(n.ParentParams), timeout, n.Auth); err != nil { - n.Logger.Error().Stack().Err(err).Msg("connecting") + n.Logger.Error().Err(err).Msg("connecting") return err } diff --git a/cmd/poller/collector/collector.go b/cmd/poller/collector/collector.go index 58f324c07..69e12707b 100644 --- a/cmd/poller/collector/collector.go +++ b/cmd/poller/collector/collector.go @@ -18,6 +18,7 @@ package collector import ( "errors" + "fmt" "github.com/netapp/harvest/v2/pkg/auth" "github.com/netapp/harvest/v2/pkg/conf" "github.com/netapp/harvest/v2/pkg/logging" @@ -26,6 +27,7 @@ import ( "math" "math/rand" "reflect" + "runtime/debug" "strconv" "strings" "sync" @@ -304,7 +306,8 @@ func (c *AbstractCollector) Start(wg *sync.WaitGroup) { defer wg.Done() defer func() { if r := recover(); r != nil { - c.Logger.Error().Stack().Err(errs.New(errs.ErrPanic, "")).Any("err", r).Msg("Collector panicked") + err := fmt.Sprintf("%+v\n", r) + c.Logger.Error().Str("err", err).Bytes("stack", debug.Stack()).Msg("Collector panicked") } }() diff --git a/cmd/poller/poller.go b/cmd/poller/poller.go index 20be8c529..ecf45a16f 100644 --- a/cmd/poller/poller.go +++ b/cmd/poller/poller.go @@ -1404,14 +1404,5 @@ func init() { // start poller, if fails try to write to syslog func main() { - // don't recover if a goroutine has panicked, instead - // log as much as possible - defer func() { - if r := recover(); r != nil { - logger.Error().Stack().Any("err", r).Msg("Poller panicked") - logger.Fatal().Msg(`(main) terminating abnormally, tip: run in foreground mode (with "--loglevel 0") to debug`) - } - }() - cobra.CheckErr(pollerCmd.Execute()) } diff --git a/integration/certer/main.go b/integration/certer/main.go index ca8509655..abd53ca76 100644 --- a/integration/certer/main.go +++ b/integration/certer/main.go @@ -9,7 +9,7 @@ import ( "github.com/Netapp/harvest-automation/certer/models" "github.com/Netapp/harvest-automation/test/utils" "github.com/carlmjohnson/requests" - "github.com/rs/zerolog/log" + "log/slog" "net/http" "os" "os/exec" @@ -64,7 +64,7 @@ func printRequired(name string) { } func begin() { - log.Info().Str("ip", ip).Msg("Create certificates for ip") + slog.Info("Create certificates for ip", slog.String("ip", ip)) // Get admin SVM fetchAdminSVM() @@ -72,7 +72,7 @@ func begin() { // Query for existing CA certificates, err := fetchCA() if err != nil { - log.Error().Err(err).Send() + slog.Error("", slog.Any("err", err)) return } @@ -84,19 +84,19 @@ func begin() { // Create private key and certificate signing request (CSR) csr, err := ensureOpenSSLInstalled() if err != nil { - log.Error().Err(err).Send() + slog.Error("", slog.Any("err", err)) return } // Delete existing if certificates.NumRecords > 0 { - log.Info(). - Int("num", certificates.NumRecords). - Str("common_name", commonName). - Msg("Deleting matching certificates") + slog.Info("Deleting matching certificates", + slog.Int("num", certificates.NumRecords), + slog.String("common_name", commonName)) + err := deleteCertificates(certificates) if err != nil { - log.Error().Err(err).Msg("failed to delete certificates") + slog.Error("failed to delete certificates", slog.Any("err", err)) return } } @@ -104,21 +104,22 @@ func begin() { // Create a root CA certificate that will be used to sign certificate requests for the user account(s) err = createRootCA() if err != nil { - log.Error().Err(err).Msg("failed") + slog.Error("failed", slog.Any("err", err)) return } // Sign the locally created certificate with the root CA generated above err = signCSR(csr) if err != nil { - log.Error().Err(err).Msg("failed") + slog.Error("failed", slog.Any("err", err)) return } // Add certificate auth to this ONTAP user err = addCertificateAuthToHarvestUser() if err != nil { - log.Error().Err(err).Send() + slog.Error("", slog.Any("err", err)) + } fmt.Printf("Success! Test with:\n") @@ -130,15 +131,16 @@ func begin() { func sleep(s string) { duration, err := time.ParseDuration(s) if err != nil { - log.Error().Err(err).Msg("failed to sleep") + slog.Error("failed to sleep", slog.Any("err", err)) } - log.Info().Str("sleep", s).Msg("sleep") + slog.Info("sleep", slog.String("sleep", s)) time.Sleep(duration) } func curlServer() { if _, err := os.Stat(local(".crt")); errors.Is(err, os.ErrNotExist) { - log.Panic().Str("crt", local(".crt")).Msg("does not exist") + slog.Error("does not exist", slog.String("crt", local(".crt"))) + os.Exit(1) } for range 60 { @@ -147,7 +149,7 @@ func curlServer() { fmt.Sprintf("https://%s/api/cluster?fields=version", ip)) output, err := command.CombinedOutput() if err != nil { - log.Error().Err(err).Str("output", string(output)).Msg("failed to exec curl") + slog.Error("failed to exec curl", slog.Any("err", err), slog.String("output", string(output))) } else { fmt.Println(string(output)) return @@ -159,7 +161,7 @@ func curlServer() { func certsAreFresh(certificates models.Certificates) bool { cert := certificates.Records[0] date := cert.ExpiryTime.Format("2006-01-02") - log.Info().Str("expire", date).Msg("Certificates are fresh. Done") + slog.Info("Certificates are fresh. Done", slog.String("expire", date)) return cert.ExpiryTime.After(time.Now().Add(8 * time.Hour)) } @@ -271,7 +273,7 @@ func ensureOpenSSLInstalled() (string, error) { if err != nil { return "", fmt.Errorf("err=%w output=%s", err, output) } - log.Debug().Str("output", string(output)).Msg("created private key") + slog.Debug("created private key", slog.String("output", string(output))) // openssl req -days 3650 -sha256 -new -nodes -key cert/u2.key -subj /CN=harvest -out u2.csr command = exec.Command("openssl", "req", "-days", "3650", "-sha256", "-new", "-nodes", "-key", privateKey, @@ -281,8 +283,8 @@ func ensureOpenSSLInstalled() (string, error) { return "", fmt.Errorf("error creating csr err=%w output=%s", err, output) } - log.Debug().Str("output", string(output)).Msg("created csr") - log.Info().Str("privateKey", privateKey).Msg("Created private key and certificate signing request (CSR)") + slog.Debug("created csr", slog.String("output", string(output))) + slog.Info("Created private key and certificate signing request (CSR)", slog.String("privateKey", privateKey)) data, err := os.ReadFile(csr) if err != nil { @@ -308,7 +310,7 @@ func createRootCA() error { if err != nil { return fmt.Errorf("failed to create root CA err=%w", err) } - log.Info().Msg("Created Root CA") + slog.Info("Created Root CA") return nil } @@ -321,7 +323,7 @@ func fetchAdminSVM() { ToJSON(&svmResp). Fetch(context.Background()) if err != nil { - log.Error().Err(err).Msg("failed to fetch admin SVM") + slog.Error("failed to fetch admin SVM", slog.Any("err", err)) return } adminSVM = svmResp.Records[0].Vserver diff --git a/integration/go.mod b/integration/go.mod index 794785b6a..bcc3c6d28 100644 --- a/integration/go.mod +++ b/integration/go.mod @@ -9,9 +9,8 @@ replace github.com/netapp/harvest/v2 => ../ require ( github.com/carlmjohnson/requests v0.23.5 github.com/netapp/harvest/v2 v2.0.0-20240618123731-00a4fa826af5 - github.com/rs/zerolog v1.33.0 github.com/tidwall/gjson v1.17.3 - golang.org/x/text v0.17.0 + golang.org/x/text v0.18.0 ) require ( @@ -28,7 +27,8 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/shirou/gopsutil/v4 v4.24.7 // indirect + github.com/rs/zerolog v1.33.0 // indirect + github.com/shirou/gopsutil/v4 v4.24.8 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -38,7 +38,7 @@ require ( github.com/tklauser/numcpus v0.8.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/net v0.26.0 // indirect - golang.org/x/sys v0.24.0 // indirect + golang.org/x/sys v0.25.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/integration/go.sum b/integration/go.sum index d5cbe598e..6f671812a 100644 --- a/integration/go.sum +++ b/integration/go.sum @@ -49,8 +49,8 @@ github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil/v4 v4.24.7 h1:V9UGTK4gQ8HvcnPKf6Zt3XHyQq/peaekfxpJ2HSocJk= -github.com/shirou/gopsutil/v4 v4.24.7/go.mod h1:0uW/073rP7FYLOkvxolUQM5rMOLTNmRXnFKafpb71rw= +github.com/shirou/gopsutil/v4 v4.24.8 h1:pVQjIenQkIhqO81mwTaXjTzOMT7d3TZkf43PlVFHENI= +github.com/shirou/gopsutil/v4 v4.24.8/go.mod h1:wE0OrJtj4dG+hYkxqDH3QiBICdKSf04/npcvLLc/oRg= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -82,10 +82,10 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/integration/test/copy_logs_test.go b/integration/test/copy_logs_test.go index 45041e5c1..5185163d2 100644 --- a/integration/test/copy_logs_test.go +++ b/integration/test/copy_logs_test.go @@ -6,7 +6,7 @@ import ( "github.com/Netapp/harvest-automation/test/docker" "github.com/Netapp/harvest-automation/test/installer" "github.com/Netapp/harvest-automation/test/utils" - "github.com/rs/zerolog/log" + "log/slog" "os/exec" "testing" ) @@ -26,7 +26,12 @@ func TestCopyLogs(t *testing.T) { dest := harvestLogDir + "/" + containerShortID + ".log" err = docker.StoreContainerLog(containerShortID, dest) if err != nil { - log.Error().Err(err).Str("id", containerShortID).Str("dest", dest).Msg("Unable to copy logs") + slog.Error( + "Unable to copy logs", + slog.Any("err", err), + slog.String("id", containerShortID), + slog.String("dest", dest), + ) } } } diff --git a/integration/test/counter_test.go b/integration/test/counter_test.go index faa57be43..e204f15a8 100644 --- a/integration/test/counter_test.go +++ b/integration/test/counter_test.go @@ -13,7 +13,7 @@ import ( "github.com/netapp/harvest/v2/pkg/tree/node" "github.com/netapp/harvest/v2/pkg/util" "github.com/netapp/harvest/v2/third_party/go-version" - "github.com/rs/zerolog/log" + "log/slog" "os" "path/filepath" "strings" @@ -46,29 +46,39 @@ func TestCounters(t *testing.T) { utils.SkipIfMissing(t, utils.Regression) _, err := conf.LoadHarvestConfig(installer.HarvestConfigFile) if err != nil { - log.Fatal().Err(err).Msg("Unable to load harvest config") + slog.Error("Unable to load harvest config", slog.Any("err", err)) + os.Exit(1) } pollerName := "dc1" if poller, err = conf.PollerNamed(pollerName); err != nil { - log.Fatal().Err(err).Str("poller", pollerName).Send() + slog.Error("", slog.Any("err", err), slog.String("poller", pollerName)) + os.Exit(1) } if poller.Addr == "" { - log.Fatal().Str("poller", pollerName).Msg("Address is empty") + slog.Error("Address is empty", slog.String("poller", pollerName)) + os.Exit(1) } timeout, _ := time.ParseDuration(rest2.DefaultTimeout) if client, err = rest2.New(poller, timeout, auth.NewCredentials(poller, logging.Get())); err != nil { - log.Fatal().Err(err).Str("poller", pollerName).Msg("error creating new client") + slog.Error( + "error creating new client", + slog.Any("err", err), + slog.String("poller", pollerName), + ) + os.Exit(1) } if err = client.Init(5); err != nil { - log.Fatal().Err(err).Msg("client init failed") + slog.Error("client init failed", slog.Any("err", err)) + os.Exit(1) } restCounters := processRestCounters(client) if err = invokeRestCall(client, restCounters); err != nil { - log.Error().Err(err).Msg("rest call failed") + slog.Error("rest call failed", slog.Any("err", err)) + os.Exit(1) } } @@ -109,7 +119,8 @@ func visitRestTemplates(dir string, client *rest2.Client, eachTemp func(path str result := make(map[string][]counterData) err := filepath.Walk(dir, func(path string, _ os.FileInfo, err error) error { if err != nil { - log.Fatal().Err(err).Msg("failed to read directory:") + slog.Error("failed to read directory:", slog.Any("err", err)) + os.Exit(1) } ext := filepath.Ext(path) if ext != ".yaml" { @@ -131,7 +142,8 @@ func visitRestTemplates(dir string, client *rest2.Client, eachTemp func(path str }) if err != nil { - log.Fatal().Err(err).Str("dir", dir).Msg("failed to walk directory: %s") + slog.Error("failed to walk directory", slog.Any("err", err), slog.String("dir", dir)) + os.Exit(1) } return result diff --git a/integration/test/dashboard/data_validation.go b/integration/test/dashboard/data_validation.go index 1968db7ef..3eff3aac1 100644 --- a/integration/test/dashboard/data_validation.go +++ b/integration/test/dashboard/data_validation.go @@ -3,8 +3,8 @@ package dashboard import ( "fmt" "github.com/Netapp/harvest-automation/test/utils" - "github.com/rs/zerolog/log" "github.com/tidwall/gjson" + "log/slog" "net/url" "strings" ) @@ -36,6 +36,11 @@ func HasMinRecord(query string, limit int) bool { return true } } - log.Info().Str("Query", query).Str("Query Url", queryURL).Str("Response", resp).Msg("failed query info") + slog.Info( + "failed query info", + slog.String("Query", query), + slog.String("Query Url", queryURL), + slog.String("Response", resp), + ) return false } diff --git a/integration/test/dashboard_json_test.go b/integration/test/dashboard_json_test.go index 6698fbbbc..39a1c32c3 100644 --- a/integration/test/dashboard_json_test.go +++ b/integration/test/dashboard_json_test.go @@ -4,10 +4,10 @@ import ( "fmt" "github.com/Netapp/harvest-automation/test/dashboard" "github.com/Netapp/harvest-automation/test/utils" - "github.com/rs/zerolog/log" "github.com/tidwall/gjson" "golang.org/x/text/cases" "golang.org/x/text/language" + "log/slog" "os" "path/filepath" "regexp" @@ -125,12 +125,12 @@ func TestMain(m *testing.M) { func TestDashboardsLoad(t *testing.T) { utils.SkipIfMissing(t, utils.Regression) jsonDir := utils.GetHarvestRootDir() + "/grafana/dashboards" - log.Info().Str("jsonDir", jsonDir).Msg("Dashboard directory path") + slog.Info("Dashboard directory path", slog.String("jsonDir", jsonDir)) fileSet = GetAllJsons(jsonDir) if len(fileSet) == 0 { t.Fatalf("No json file found @ %s", jsonDir) } - log.Info().Int("fileSet", len(fileSet)).Msg("Json files") + slog.Info("Json files", slog.Int("fileSet", len(fileSet))) } func TestJsonExpression(t *testing.T) { @@ -159,14 +159,15 @@ func TestJsonExpression(t *testing.T) { } } - log.Info(). - Str("dur", time.Since(now).Round(time.Millisecond).String()). - Msg("Pre-check counters done") + slog.Info( + "Pre-check counters done", + slog.String("dur", time.Since(now).Round(time.Millisecond).String()), + ) for _, filePath := range fileSet { dashPath := shortPath(filePath) if shouldSkipDashboard(filePath) { - log.Info().Str("path", dashPath).Msg("Skip") + slog.Info("Skip", slog.String("path", dashPath)) continue } sub := time.Now() @@ -230,35 +231,35 @@ func TestJsonExpression(t *testing.T) { strings.Join(counters, " "), actualExpression) } } - log.Info(). - Str("path", dashPath). - Int("numCounters", subCounters). - Int("missing", sumMissing). - Int("flaky", subFlaky). - Str("dur", time.Since(sub).Round(time.Millisecond).String()). - Msg("Dashboard validation completed") + slog.Info("Dashboard validation completed", + slog.String("path", dashPath), + slog.Int("numCounters", subCounters), + slog.Int("missing", sumMissing), + slog.Int("flaky", subFlaky), + slog.String("dur", time.Since(sub).Round(time.Millisecond).String()), + ) } if restFails > 0 { t.Errorf("Rest validation failures=%d", restFails) } else { - log.Info().Msg("Rest Validation looks good!!") + slog.Info("Rest Validation looks good!!") } if zapiFails > 0 { t.Errorf("Zapi validation failures=%d", zapiFails) } else { - log.Info().Msg("Zapi Validation looks good!!") + slog.Info("Zapi Validation looks good!!") } - log.Info(). - Str("durMs", time.Since(now).Round(time.Millisecond).String()). - Int("exprIgnored", exprIgnored). - Int("numCounters", numCounters). - Int("restMiss", restFails). - Int("restFlaky", restFlaky). - Int("zapiMiss", zapiFails). - Int("zapiFlaky", zapiFlaky). - Msg("Dashboard Json validated") + slog.Info("Dashboard Json validated", + slog.String("durMs", time.Since(now).Round(time.Millisecond).String()), + slog.Int("exprIgnored", exprIgnored), + slog.Int("numCounters", numCounters), + slog.Int("restMiss", restFails), + slog.Int("restFlaky", restFlaky), + slog.Int("zapiMiss", zapiFails), + slog.Int("zapiFlaky", zapiFlaky), + ) // Add checks for queries in Prometheus for _, query := range validateQueries { diff --git a/integration/test/dashboard_test.go b/integration/test/dashboard_test.go index 64e45672b..634651fad 100644 --- a/integration/test/dashboard_test.go +++ b/integration/test/dashboard_test.go @@ -3,10 +3,9 @@ package main import ( "encoding/json" "errors" - "fmt" "github.com/Netapp/harvest-automation/test/grafana" "github.com/Netapp/harvest-automation/test/utils" - "github.com/rs/zerolog/log" + "log/slog" "testing" "time" ) @@ -29,7 +28,7 @@ var cDotFolder, sevenModeFolder string func TestGrafanaAndPrometheusAreConfigured(t *testing.T) { utils.SkipIfMissing(t, utils.Regression) - log.Info().Msg("Verify Grafana and Prometheus are configured") + slog.Info("Verify Grafana and Prometheus are configured") if !utils.IsURLReachable(utils.GetGrafanaHTTPURL()) { panic(errors.New("grafana is not reachable")) } @@ -38,7 +37,7 @@ func TestGrafanaAndPrometheusAreConfigured(t *testing.T) { } cDotFolder = "Harvest-main-cDOT" sevenModeFolder = "Harvest-main-7mode" - log.Info().Str("cMode", cDotFolder).Str("7mode", sevenModeFolder).Msg("Folder name details") + slog.Info("Folder name details", slog.String("cMode", cDotFolder), slog.String("7mode", sevenModeFolder)) status, out := new(grafana.Mgr).Import() if !status { t.Errorf("Grafana import operation failed out=%s", out) @@ -48,7 +47,7 @@ func TestGrafanaAndPrometheusAreConfigured(t *testing.T) { func TestImport(t *testing.T) { utils.SkipIfMissing(t, utils.Regression) - log.Info().Msg("Verify harvest folder") + slog.Info("Verify harvest folder") data, err := utils.GetResponseBody(utils.GetGrafanaHTTPURL() + "/api/folders?limit=10") utils.PanicIfNotNil(err) var dataFolder []Folder @@ -59,7 +58,7 @@ func TestImport(t *testing.T) { return } } - log.Info().Bytes("Data", data).Msg("Folder data") + slog.Info("Folder data", slog.String("Data", string(data))) t.Error("Unable to find harvest folder") } @@ -107,7 +106,7 @@ func TestSevenModeDashboardCount(t *testing.T) { } func getFolderID(t *testing.T, folderName string) int64 { - log.Info().Msg("Find " + folderName + " folder id") + slog.Info("Find " + folderName + " folder id") data, err := utils.GetResponseBody(utils.GetGrafanaHTTPURL() + "/api/folders?limit=100") utils.PanicIfNotNil(err) var dataFolder []Folder @@ -127,9 +126,9 @@ func getFolderID(t *testing.T, folderName string) int64 { } func verifyDashboards(t *testing.T, folderID int64, expectedName []string) { - log.Info().Msg(fmt.Sprintf("Find list of dashboard for folder %d", folderID)) + slog.Info("Find list of dashboard for folder", slog.Int64("folderID", folderID)) url := utils.GetGrafanaHTTPURL() + "/api/search?type=dash-db" - log.Info().Msg(url) + slog.Info(url) data, err := utils.GetResponseBody(url) utils.PanicIfNotNil(err) var dataDashboard []Dashboard @@ -137,7 +136,7 @@ func verifyDashboards(t *testing.T, folderID int64, expectedName []string) { utils.PanicIfNotNil(err) actualNames := make([]string, 0, len(dataDashboard)) var notFoundList []string - log.Info().Int64("folderID", folderID).Msg("Folder details") + slog.Info("Folder details", slog.Int64("folderID", folderID)) for _, values := range dataDashboard { actualNames = append(actualNames, values.Title) } @@ -147,7 +146,7 @@ func verifyDashboards(t *testing.T, folderID int64, expectedName []string) { } } if len(notFoundList) > 0 { - log.Info().Msg("The following dashboards were not imported successfully.") + slog.Info("The following dashboards were not imported successfully.") t.Errorf("One or more dashboards %s were missing/ not imported", notFoundList) } } diff --git a/integration/test/docker/docker_mgr.go b/integration/test/docker/docker_mgr.go index bdd936b83..5d48486f5 100644 --- a/integration/test/docker/docker_mgr.go +++ b/integration/test/docker/docker_mgr.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" "os/exec" "strings" ) @@ -29,7 +29,7 @@ func StoreContainerLog(containerID string, logFile string) error { } func ReStartContainers(commandSubString string) error { - log.Printf("ReStartContainers start %s\n", commandSubString) + slog.Info("ReStartContainers start", slog.String("commandSubString", commandSubString)) containers, err := Containers(commandSubString) if err != nil { return err @@ -37,19 +37,19 @@ func ReStartContainers(commandSubString string) error { var errs []error for _, container := range containers { - log.Println("Restarting container", container.ID[:10], "...") + slog.Info("Restarting container", slog.String("containerID", container.ID[:10])) command := exec.Command("docker", "container", "restart", container.ID) //nolint:gosec err = command.Run() if err != nil { errs = append(errs, err) } } - log.Printf("ReStartContainers complete %s\n", commandSubString) + slog.Info("ReStartContainers complete", slog.String("commandSubString", commandSubString)) return errors.Join(errs...) } func StopContainers(commandSubString string) error { - log.Printf("StopContainers start %s \n", commandSubString) + slog.Info("StopContainers start", slog.String("commandSubString", commandSubString)) containers, err := Containers(commandSubString) if err != nil { return err @@ -57,14 +57,14 @@ func StopContainers(commandSubString string) error { var errs []error for _, container := range containers { - log.Println("Stopping container", container.ID[:10], "...") + slog.Info("Stopping container", slog.String("containerID", container.ID[:10])) command := exec.Command("docker", "container", "stop", container.ID) //nolint:gosec err = command.Run() if err != nil { errs = append(errs, err) } } - log.Printf("StopContainers complete %s \n", commandSubString) + slog.Info("StopContainers complete", slog.String("commandSubString", commandSubString)) return errors.Join(errs...) } diff --git a/integration/test/grafana/grafana_mgr.go b/integration/test/grafana/grafana_mgr.go index de379f780..47267d02b 100644 --- a/integration/test/grafana/grafana_mgr.go +++ b/integration/test/grafana/grafana_mgr.go @@ -5,7 +5,7 @@ import ( "github.com/Netapp/harvest-automation/test/docker" "github.com/Netapp/harvest-automation/test/installer" "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" "regexp" ) @@ -18,7 +18,7 @@ func (g *Mgr) Import() (bool, string) { status bool err error ) - log.Println("Verify Grafana and Prometheus are configured") + slog.Info("Verify Grafana and Prometheus are configured") var re = regexp.MustCompile(`404|not-found|error`) if !utils.IsURLReachable(utils.GetGrafanaHTTPURL()) { panic(errors.New("grafana is not reachable")) @@ -26,7 +26,7 @@ func (g *Mgr) Import() (bool, string) { if !utils.IsURLReachable(utils.GetPrometheusURL()) { panic(errors.New("prometheus is not reachable")) } - log.Println("Import dashboard from grafana/dashboards") + slog.Info("Import dashboard from grafana/dashboards") containerIDs, err := docker.Containers("poller") if err != nil { panic(err) @@ -41,11 +41,11 @@ func (g *Mgr) Import() (bool, string) { params = append(params, importCmds...) importOutput, err = utils.Run("docker", params...) } else { - log.Println("It is non docker based harvest") + slog.Info("It is non docker based harvest") importOutput, err = utils.Exec(installer.HarvestHome, "bin/harvest", nil, importCmds...) } if err != nil { - log.Printf("error %s", err) + slog.Error("error", slog.Any("err", err)) panic(err) } if re.MatchString(importOutput) { @@ -53,6 +53,6 @@ func (g *Mgr) Import() (bool, string) { } else { status = true } - log.Printf("Grafana import status : %t", status) + slog.Info("Grafana import status", slog.Bool("status", status)) return status, importOutput } diff --git a/integration/test/installer/grafana.go b/integration/test/installer/grafana.go index 4d84f74fa..0eb3cc709 100644 --- a/integration/test/installer/grafana.go +++ b/integration/test/installer/grafana.go @@ -4,7 +4,7 @@ import ( "errors" "github.com/Netapp/harvest-automation/test/docker" "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" "os" "os/exec" "time" @@ -20,7 +20,7 @@ func (g *Grafana) Init(image string) { func (g *Grafana) Install() bool { g.image = "grafana/grafana:8.1.8" - log.Println("Grafana image : " + g.image) + slog.Info("Grafana image : " + g.image) imageName := "grafana" _ = docker.StopContainers(imageName) cmd := exec.Command("docker", "run", "-d", "-e", "GF_LOG_LEVEL=debug", "-p", utils.GrafanaPort+":"+utils.GrafanaPort, g.image) //nolint:gosec @@ -36,7 +36,7 @@ func (g *Grafana) Install() bool { return true } } - log.Printf("Reached maximum timeout. Grafana is failed to start after %d min\n", maxWaitCount) + slog.Info("Reached maximum timeout. Grafana is failed to start", slog.Int("maxWaitCount", maxWaitCount)) return false } diff --git a/integration/test/installer/harvest.go b/integration/test/installer/harvest.go index 12c781d26..af467313b 100644 --- a/integration/test/installer/harvest.go +++ b/integration/test/installer/harvest.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/Netapp/harvest-automation/test/core" "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" "strings" "time" ) @@ -18,7 +18,7 @@ type Harvest struct { func (h *Harvest) Start() { status, err := utils.Exec(HarvestHome, HarvestBin, nil, "start") if err != nil { - log.Printf("error %s", err) + slog.Error("", slog.Any("err", err)) panic(err) } fmt.Println(status) @@ -29,7 +29,7 @@ func (h *Harvest) Start() { func (h *Harvest) Stop() { status, err := utils.Exec(HarvestHome, HarvestBin, nil, "stop") if err != nil { - log.Printf("error %s", err) + slog.Error("", slog.Any("err", err)) panic(err) } fmt.Println(status) @@ -46,10 +46,10 @@ func (h *Harvest) AllRunning() bool { } func (h *Harvest) GetPollerInfo() []core.Poller { - log.Println("Getting all pollers details") + slog.Info("Getting all pollers details") harvestStatus, err := utils.Exec(HarvestHome, HarvestBin, nil, "status") if err != nil { - log.Printf("error %s", err) + slog.Error("", slog.Any("err", err)) panic(err) } fmt.Println(harvestStatus) diff --git a/integration/test/installer/install_utils.go b/integration/test/installer/install_utils.go index 16e08e22f..b64762fb5 100644 --- a/integration/test/installer/install_utils.go +++ b/integration/test/installer/install_utils.go @@ -2,13 +2,13 @@ package installer import ( "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" ) const LogDir = "/var/log/harvest" func Uninstall() { - log.Println("Check and remove harvest ") + slog.Info("Check and remove harvest ") UninstallRPM() UninstallNativePkg() CleanLogDir() @@ -19,7 +19,7 @@ func UninstallRPM() { } func UninstallNativePkg() { - log.Println("Uninstalling native pkg if any") + slog.Info("Uninstalling native pkg if any") if utils.FileExists(HarvestHome) { harvestObj := new(Harvest) if utils.FileExists(HarvestHome + "/bin/harvest") { @@ -29,7 +29,7 @@ func UninstallNativePkg() { } _, _ = utils.Run("rm", "-rf", HarvestHome) } else { - log.Printf(" %s doesnt exists.\n", HarvestHome) + slog.Info("Harvest doesnt exists.", slog.String("HarvestHome", HarvestHome)) } } diff --git a/integration/test/installer/installer.go b/integration/test/installer/installer.go index 4be30c9f8..e9a96f286 100644 --- a/integration/test/installer/installer.go +++ b/integration/test/installer/installer.go @@ -3,7 +3,7 @@ package installer import ( "bufio" "github.com/Netapp/harvest-automation/test/utils" - "github.com/rs/zerolog/log" + "log/slog" "os" "strings" ) @@ -27,7 +27,7 @@ func GetPerfFileWithQosCounters(source string, target string) string { writeBuffer := bufio.NewWriter(writeFile) file, err := os.Open(utils.GetHarvestRootDir() + "/" + source) if err != nil { - log.Error().Err(err).Send() + slog.Error("", slog.Any("err", err)) } defer func(file *os.File) { _ = file.Close() }(file) @@ -41,7 +41,7 @@ func GetPerfFileWithQosCounters(source string, target string) string { _, _ = writeBuffer.WriteString(lineString + "\n") } if err := scanner.Err(); err != nil { - log.Error().Err(err).Send() + slog.Error("", slog.Any("err", err)) } _ = writeBuffer.Flush() return modifiedFilePath diff --git a/integration/test/installer/native.go b/integration/test/installer/native.go index aabac4a6d..09f3d4068 100644 --- a/integration/test/installer/native.go +++ b/integration/test/installer/native.go @@ -3,7 +3,7 @@ package installer import ( "errors" "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" ) type Native struct { @@ -23,15 +23,15 @@ func (n *Native) Install() bool { if err != nil { panic(err) } - log.Println("Downloaded: " + n.path) + slog.Info("Downloaded: " + n.path) Uninstall() - log.Println("Installing " + tarFileName) + slog.Info("Installing " + tarFileName) unTarOutput, err := utils.Run("tar", "-xf", tarFileName, "--one-top-level=harvest", "--strip-components", "1", "-C", "/opt") if err != nil { - log.Printf("error %s", err) + slog.Error("", slog.Any("err", err)) panic(err) } - log.Println(unTarOutput) + slog.Info("Untar output: " + unTarOutput) utils.RemoveSafely(HarvestHome + "/" + harvestFile) utils.UseCertFile(HarvestHome) _, err1 := utils.Run("cp", GetPerfFileWithQosCounters(ZapiPerfDefaultFile, "defaultZapi.yaml"), HarvestHome+"/"+ZapiPerfDefaultFile) diff --git a/integration/test/installer/prometheus.go b/integration/test/installer/prometheus.go index b73bad8f4..24368affd 100644 --- a/integration/test/installer/prometheus.go +++ b/integration/test/installer/prometheus.go @@ -4,7 +4,7 @@ import ( "errors" "github.com/Netapp/harvest-automation/test/docker" "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" "os" "os/exec" "time" @@ -20,7 +20,7 @@ func (p *Prometheus) Init(image string) { func (p *Prometheus) Install() bool { p.image = "prom/prometheus:v2.33.0" - log.Println("Prometheus image : " + p.image) + slog.Info("Prometheus image : " + p.image) imageName := "prometheus" err := docker.StopContainers(imageName) utils.PanicIfNotNil(err) @@ -42,7 +42,7 @@ func (p *Prometheus) Install() bool { return true } } - log.Printf("Reached maximum timeout. Prometheus is failed to start after %d min\n", maxWaitCount) + slog.Info("Reached maximum timeout. Prometheus is failed to start", slog.Int("maxWaitCount", maxWaitCount)) return false } diff --git a/integration/test/installer/rpm.go b/integration/test/installer/rpm.go index 6c9fcd4ee..7feec789f 100644 --- a/integration/test/installer/rpm.go +++ b/integration/test/installer/rpm.go @@ -3,7 +3,7 @@ package installer import ( "errors" "github.com/Netapp/harvest-automation/test/utils" - "log" + "log/slog" "strings" ) @@ -23,17 +23,17 @@ func (r *RPM) Install() bool { if err != nil { panic(err) } - log.Println("Downloaded: " + r.path) + slog.Info("Downloaded: " + r.path) Uninstall() harvestObj := new(Harvest) - log.Println("Installing " + rpmFileName) + slog.Info("Installing " + rpmFileName) installOutput, err := utils.Run("yum", "install", "-y", rpmFileName) if err != nil { - log.Printf("error %s", err) + slog.Error("", slog.Any("err", err)) panic(err) } - log.Println(installOutput) - log.Println("Stopping harvest") + slog.Info(installOutput) + slog.Info("Stopping harvest") harvestObj.Stop() _, err = utils.Run("cp", harvestFile, HarvestHome+"/"+harvestFile) if err != nil { @@ -56,16 +56,16 @@ func (r *RPM) Upgrade() bool { versionCmd := []string{"-qa", "harvest"} out, err := utils.Run("rpm", versionCmd...) if err != nil { - log.Printf("error %s", err) + slog.Error("", slog.Any("err", err)) panic(err) } previousVersion := strings.TrimSpace(out) err = utils.DownloadFile(rpmFileName, r.path) utils.PanicIfNotNil(err) - log.Println("Downloaded: " + r.path) - log.Println("Updating " + rpmFileName) + slog.Info("Downloaded: " + r.path) + slog.Info("Updating " + rpmFileName) installOutput, _ := utils.Run("yum", "upgrade", "-y", rpmFileName) - log.Println(installOutput) + slog.Info(installOutput) out, _ = utils.Run("rpm", versionCmd...) installedVersion := strings.TrimSpace(out) if previousVersion == installedVersion { diff --git a/integration/test/metric_test.go b/integration/test/metric_test.go index cc93648f4..205945504 100644 --- a/integration/test/metric_test.go +++ b/integration/test/metric_test.go @@ -5,7 +5,8 @@ import ( "github.com/Netapp/harvest-automation/test/installer" "github.com/Netapp/harvest-automation/test/utils" "github.com/netapp/harvest/v2/pkg/conf" - "github.com/rs/zerolog/log" + "log/slog" + "os" "sort" "strconv" "strings" @@ -27,7 +28,8 @@ func TestPollerMetrics(t *testing.T) { utils.SkipIfMissing(t, utils.Regression) _, err := conf.LoadHarvestConfig(installer.HarvestConfigFile) if err != nil { - log.Fatal().Err(err).Msg("Unable to load harvest config") + slog.Error("Unable to load harvest config", slog.Any("err", err)) + os.Exit(1) } var duplicateMetrics []string for _, pollerName := range conf.Config.PollersOrdered { @@ -74,7 +76,6 @@ func TestPollerMetrics(t *testing.T) { if uniqueSetOfMetricLabels[key] { _, ok := skipDuplicates[metricName] if ok { - log.Trace().Str("metric", key).Msg("Ignore duplicate") continue } duplicateMetrics = append(duplicateMetrics, @@ -86,13 +87,17 @@ func TestPollerMetrics(t *testing.T) { validCounters++ } } else { - log.Error().Str("row", row).Msg("Invalid string data found in the metric output") + slog.Error("Invalid string data found in the metric output", slog.String("row", row)) } } if validCounters == 0 { panic("Empty values found for all counters for poller " + pollerName) } - log.Info().Int("numCounters", validCounters).Str("poller", pollerName).Msg("Valid Counters for poller") + slog.Info( + "Valid Counters for poller", + slog.Int("numCounters", validCounters), + slog.String("poller", pollerName), + ) } sort.Strings(duplicateMetrics) for _, dupMetric := range duplicateMetrics { diff --git a/integration/test/utils/http_utils.go b/integration/test/utils/http_utils.go index b16fef649..afd3bb0e0 100644 --- a/integration/test/utils/http_utils.go +++ b/integration/test/utils/http_utils.go @@ -6,8 +6,9 @@ import ( "fmt" "github.com/netapp/harvest/v2/pkg/requests" "io" - "log" + "log/slog" "net/http" + "os" ) func GetResponse(url string) (string, error) { @@ -26,12 +27,13 @@ func GetResponse(url string) (string, error) { func GetResponseBody(url string) ([]byte, error) { resp, err := http.Get(url) //nolint:gosec if err != nil { - log.Fatalln(err) + slog.Error("", slog.Any("err", err)) + os.Exit(1) } body, err := io.ReadAll(resp.Body) if err != nil { - log.Fatalln(err) - return nil, err + slog.Error("", slog.Any("err", err)) + os.Exit(1) } resp.Body.Close() return body, nil @@ -51,7 +53,7 @@ func SendReqAndGetRes(url string, method string, defer res.Body.Close() body, err := io.ReadAll(res.Body) PanicIfNotNil(err) - log.Println(string(body)) + slog.Info(string(body)) var data map[string]interface{} err = json.Unmarshal(body, &data) PanicIfNotNil(err) diff --git a/integration/test/utils/utils.go b/integration/test/utils/utils.go index c4982a59b..eaaef5101 100644 --- a/integration/test/utils/utils.go +++ b/integration/test/utils/utils.go @@ -7,9 +7,8 @@ import ( "fmt" "github.com/netapp/harvest/v2/cmd/tools/grafana" "github.com/netapp/harvest/v2/pkg/conf" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" "io" + "log/slog" "net" "net/http" "os" @@ -143,7 +142,7 @@ func UseCertFile(harvestHome string) { _, _ = Run("certer", "-ip", "10.193.48.11") path := harvestHome + "/cert" - log.Info().Str("path", path).Msg("Copy certificate files") + slog.Info("Copy certificate files", slog.String("path", path)) if FileExists(path) { err := RemoveDir(path) PanicIfNotNil(err) @@ -189,7 +188,7 @@ func IsURLReachable(url string) bool { } func AddPrometheusToGrafana() { - log.Info().Msg("Add Prometheus into Grafana") + slog.Info("Add Prometheus into Grafana") url := GetGrafanaHTTPURL() + "/api/datasources" method := "POST" //goland:noinspection HttpUrlsUsage @@ -200,14 +199,14 @@ func AddPrometheusToGrafana() { data := SendReqAndGetRes(url, method, jsonValue) key := fmt.Sprintf("%v", data["message"]) if key == "Datasource added" { - log.Info().Msg("Prometheus has been added successfully into Grafana .") + slog.Info("Prometheus has been added successfully into Grafana .") return } panic(errors.New("ERROR: unable to add Prometheus into grafana")) } func CreateGrafanaToken() string { - log.Info().Msg("Creating grafana API Key.") + slog.Info("Creating grafana API Key.") url := GetGrafanaHTTPURL() + "/api/auth/keys" method := "POST" name := strconv.FormatInt(time.Now().Unix(), 10) @@ -219,7 +218,7 @@ func CreateGrafanaToken() string { data := SendReqAndGetRes(url, method, jsonValue) key := fmt.Sprintf("%v", data["key"]) if key != "" { - log.Info().Msg("Grafana: Token has been created successfully.") + slog.Info("Grafana: Token has been created successfully.") return key } panic(errors.New("ERROR: unable to create grafana token")) @@ -263,18 +262,19 @@ func WriteToken(token string) { tools := conf.Config.Tools if tools != nil { if tools.GrafanaAPIToken != "" { - log.Error().Str("path", abs).Msg("Harvest.yml contains a grafana token") + slog.Error("Harvest.yml contains a grafana token", slog.String("path", abs)) return } } f, err := os.OpenFile(filename, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0600) if err != nil { - log.Fatal().Err(err).Msg("Failed to open file") + slog.Error("Failed to open file", slog.Any("err", err)) + os.Exit(1) } defer func(f *os.File) { _ = f.Close() }(f) _, _ = fmt.Fprintf(f, "\n%s\n", "Tools:") _, _ = fmt.Fprintf(f, " %s: %s\n", GrafanaTokeKey, token) - log.Info().Str("path", abs).Msg("Wrote Grafana token to harvest.yml") + slog.Info("Wrote Grafana token to harvest.yml", slog.String("path", abs)) } func GetGrafanaHTTPURL() string { @@ -320,10 +320,17 @@ func RemoveDuplicateStr(strSlice []string) []string { } func SetupLogging() { - zerolog.SetGlobalLevel(zerolog.InfoLevel) - zerolog.ErrorStackMarshaler = MarshalStack //nolint:reassign - log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr, NoColor: true}). - With().Caller().Stack().Timestamp().Logger() + logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ + AddSource: true, + ReplaceAttr: func(_ []string, a slog.Attr) slog.Attr { + if a.Key == slog.SourceKey { + source := a.Value.Any().(*slog.Source) + source.File = filepath.Base(source.File) + } + return a + }, + })) + slog.SetDefault(logger) } func MarshalStack(err error) interface{} { diff --git a/pkg/logging/logger.go b/pkg/logging/logger.go index dde8002ca..84c95e17b 100644 --- a/pkg/logging/logger.go +++ b/pkg/logging/logger.go @@ -5,7 +5,6 @@ import ( "io" "os" "path" - "runtime" "strconv" "sync" "time" @@ -16,7 +15,6 @@ import ( const ( defaultLogFileName = "harvest.log" - defaultLogLevel = zerolog.InfoLevel defaultConsoleLoggingEnabled = true defaultFileLoggingEnabled = false // false to avoid opening many file descriptors for same log file DefaultLogMaxMegaBytes = 10 // 10 MB @@ -65,7 +63,7 @@ func Get() *Logger { logConfig := LogConfig{ConsoleLoggingEnabled: defaultConsoleLoggingEnabled, PrefixKey: defaultPrefixKey, PrefixValue: defaultPrefixValue, - LogLevel: defaultLogLevel, + LogLevel: zerolog.InfoLevel, FileLoggingEnabled: defaultFileLoggingEnabled, Directory: GetLogPath(), Filename: defaultLogFileName, @@ -111,7 +109,6 @@ func Configure(config LogConfig) *Logger { multiWriters := zerolog.MultiLevelWriter(writers...) zerolog.SetGlobalLevel(config.LogLevel) - zerolog.ErrorStackMarshaler = MarshalStack //nolint:reassign zerolog.CallerMarshalFunc = ShortFile zeroLogger := zerolog.New(multiWriters).With().Caller().Str(config.PrefixKey, config.PrefixValue).Timestamp().Logger() @@ -149,25 +146,6 @@ func ShortFile(_ uintptr, file string, line int) string { return short + ":" + strconv.Itoa(line) } -func MarshalStack(err error) interface{} { - if err == nil { - return nil - } - // We don't know how big the stack trace will be, so start with 10K and double a few times if needed - n := 10_000 - var trace []byte - for range 5 { - trace = make([]byte, n) - bytesWritten := runtime.Stack(trace, false) - if bytesWritten < len(trace) { - trace = trace[:bytesWritten] - break - } - n *= 2 - } - return string(trace) -} - // returns lumberjack writer func newRollingFile(config LogConfig) io.Writer { return &lumberjack.Logger{