GoogleContainerTools/skaffold · error
parsing log level: %w
Error message
parsing log level: %w
What it means
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.
Source
Thrown at pkg/skaffold/output/log/log.go:159
// We use a new instance instead of the default logrus singleton to avoid clashes with dependencies that also use logrus.
func New() *logrus.Logger {
return logrus.New()
}
// KanikoLogLevel makes sure kaniko logs at least at Info level and at most Debug level (trace doesn't work with Kaniko)
func KanikoLogLevel() logrus.Level {
if GetLevel() <= InfoLevel {
return logrus.InfoLevel
}
return logrus.DebugLevel
}
// SetupLogs sets up logrus logger for skaffold command line
func SetupLogs(stdErr io.Writer, level string, timestamp bool, hook logrus.Hook) error {
logger.SetOutput(stdErr)
lvl, err := logrus.ParseLevel(level)
if err != nil {
return fmt.Errorf("parsing log level: %w", err)
}
logger.SetLevel(lvl)
logger.SetFormatter(&logrus.TextFormatter{
FullTimestamp: timestamp,
})
logger.AddHook(hook)
setupStdLog(logger, lvl, stdlog.Default())
setupGGCRLogging(logger, lvl)
return nil
}
// AddHook adds a hook to the global Skaffold logger.
func AddHook(hook logrus.Hook) {
logger.AddHook(hook)
}
// SetLevel sets the global Skaffold logger level.
func SetLevel(level Level) {View on GitHub (pinned to a1189de023)
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
Example fix
// before
level := os.Getenv("SKAFFOLD_VERBOSITY") // e.g. "VERBOSE"
// after
level := strings.ToLower(strings.TrimSpace(os.Getenv("SKAFFOLD_VERBOSITY")))
if level == "" { level = "warning" }
err := output.SetupLogs(os.Stderr, level, timestamp, hook) Defensive patterns
Strategy: validation
Validate before calling
var validLevels = map[string]bool{
"panic": true, "fatal": true, "error": true, "warn": true,
"warning": true, "info": true, "debug": true, "trace": true,
}
lvl := strings.ToLower(strings.TrimSpace(level))
if lvl == "" { lvl = "warning" }
if !validLevels[lvl] { return fmt.Errorf("invalid log level %q", level) }
err := output.SetupLogs(stdErr, lvl, timestamp, hook) Try / catch
if err := output.SetupLogs(os.Stderr, level, timestamp, hook); err != nil {
if strings.Contains(err.Error(), "parsing log level") {
fmt.Fprintf(os.Stderr, "invalid --verbosity %q, using \"warning\"\n", level)
err = output.SetupLogs(os.Stderr, "warning", timestamp, hook)
}
if err != nil { os.Exit(1) }
} Prevention
- 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
When it happens
Trigger: Calling SetupLogs (via setUpLogs during CLI startup) with level strings like "verbose", "WARN ", "warning2", or any value not accepted by logrus.ParseLevel.
Common situations: 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.
Related errors
- value must be one of `always`, `missing`, or `never`
- CONFIG_REMOTE_REPO_CACHE_NOT_FOUND_ERR
- CONFIG_REMOTE_REPO_CACHE_NOT_FOUND_ERR
- INSPECT_BUILD_ENV_ALREADY_EXISTS_ERR
- INSPECT_BUILD_ENV_INCORRECT_TYPE_ERR
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/c768d6ba19ec37c8.
Report an issue: GitHub.