{"record":{"id":"c768d6ba19ec37c8","repo":"GoogleContainerTools/skaffold","slug":"parsing-log-level-w","errorCode":null,"errorMessage":"parsing log level: %w","messagePattern":"parsing log level: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/skaffold/output/log/log.go","lineNumber":159,"sourceCode":"// We use a new instance instead of the default logrus singleton to avoid clashes with dependencies that also use logrus.\nfunc New() *logrus.Logger {\n\treturn logrus.New()\n}\n\n// KanikoLogLevel makes sure kaniko logs at least at Info level and at most Debug level (trace doesn't work with Kaniko)\nfunc KanikoLogLevel() logrus.Level {\n\tif GetLevel() <= InfoLevel {\n\t\treturn logrus.InfoLevel\n\t}\n\treturn logrus.DebugLevel\n}\n\n// SetupLogs sets up logrus logger for skaffold command line\nfunc SetupLogs(stdErr io.Writer, level string, timestamp bool, hook logrus.Hook) error {\n\tlogger.SetOutput(stdErr)\n\tlvl, err := logrus.ParseLevel(level)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"parsing log level: %w\", err)\n\t}\n\tlogger.SetLevel(lvl)\n\tlogger.SetFormatter(&logrus.TextFormatter{\n\t\tFullTimestamp: timestamp,\n\t})\n\tlogger.AddHook(hook)\n\tsetupStdLog(logger, lvl, stdlog.Default())\n\tsetupGGCRLogging(logger, lvl)\n\treturn nil\n}\n\n// AddHook adds a hook to the global Skaffold logger.\nfunc AddHook(hook logrus.Hook) {\n\tlogger.AddHook(hook)\n}\n\n// SetLevel sets the global Skaffold logger level.\nfunc SetLevel(level Level) {","sourceCodeStart":141,"sourceCodeEnd":177,"githubUrl":"https://github.com/GoogleContainerTools/skaffold/blob/a1189de023efc32d4b8e11f395acc678aa555011/pkg/skaffold/output/log/log.go#L141-L177","documentation":"SetupLogs configures the logrus logger and parses the requested level string via logrus.ParseLevel. If the level string is not one of logrus's valid levels (panic, fatal, error, warn, info, debug, trace), it wraps the parse failure. This is a configuration error from an invalid --verbosity/-v value or programmatic level string.","triggerScenarios":"Calling SetupLogs (via setUpLogs during CLI startup) with level strings like \"verbose\", \"WARN \", \"warning2\", or any value not accepted by logrus.ParseLevel.","commonSituations":"Typoing a level on the command line (--verbosity=verbose); scripts setting level from env vars with wrong values or stray whitespace/case issues; newer logrus versions renaming accepted spellings.","solutions":["Use a valid logrus level: panic, fatal, error, warn, warning, info, debug, trace","If sourcing from env/CLI input, normalize (lowercase, trim) and validate before calling","Default to \"warning\" or \"info\" when the value is empty or unrecognized"],"exampleFix":"// before\nlevel := os.Getenv(\"SKAFFOLD_VERBOSITY\") // e.g. \"VERBOSE\"\n// after\nlevel := strings.ToLower(strings.TrimSpace(os.Getenv(\"SKAFFOLD_VERBOSITY\")))\nif level == \"\" { level = \"warning\" }\nerr := output.SetupLogs(os.Stderr, level, timestamp, hook)","handlingStrategy":"validation","validationCode":"var validLevels = map[string]bool{\n  \"panic\": true, \"fatal\": true, \"error\": true, \"warn\": true,\n  \"warning\": true, \"info\": true, \"debug\": true, \"trace\": true,\n}\nlvl := strings.ToLower(strings.TrimSpace(level))\nif lvl == \"\" { lvl = \"warning\" }\nif !validLevels[lvl] { return fmt.Errorf(\"invalid log level %q\", level) }\nerr := output.SetupLogs(stdErr, lvl, timestamp, hook)","typeGuard":null,"tryCatchPattern":"if err := output.SetupLogs(os.Stderr, level, timestamp, hook); err != nil {\n    if strings.Contains(err.Error(), \"parsing log level\") {\n        fmt.Fprintf(os.Stderr, \"invalid --verbosity %q, using \\\"warning\\\"\\n\", level)\n        err = output.SetupLogs(os.Stderr, \"warning\", timestamp, hook)\n    }\n    if err != nil { os.Exit(1) }\n}","preventionTips":["Only pass logrus-valid level strings (panic..trace) to SetupLogs","Normalize CLI/env inputs: lowercase and trim whitespace before parsing","Provide a default fallback level for empty or unknown values","Add a CLI-level flag validation that lists accepted values in --help"],"tags":["logging","configuration","logrus"],"backgroundTag":"invalid-log-level","analyzedSha":"a1189de023efc32d4b8e11f395acc678aa555011","analyzedAt":"2026-09-05T12:09:27.064Z","contentChangedAt":"2026-09-05T12:09:27.064Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}