gohugoio/hugo · error

invalid log level: , must be one of debug, warn, info or…

Error message

invalid log level: %q, must be one of debug, warn, info or error

What it means

The --logLevel flag accepts exactly four values: debug, info, warn (or warning), and error (commandeer.go:499-510). Any other string causes createLogger to return this error before the build starts. In devMode (--devMode) the level is forced to trace and this check is bypassed.

Solutions

  1. Use one of: debug, info, warn, error (warning is also accepted)
  2. Double-check the spelling of the flag value
  3. Omit --logLevel to use the default (warn)

Example fix

# before
hugo --logLevel trace
# after
hugo --logLevel debug
Defensive patterns

Strategy: validation

Validate before calling

// Validate the log level string before passing it to Hugo.
var validLogLevels = map[string]bool{"debug": true, "info": true, "warn": true, "warning": true, "error": true}
func validateLogLevel(level string) error {
    if level == "" {
        return nil
    }
    if !validLogLevels[strings.ToLower(level)] {
        return fmt.Errorf("invalid log level: %q", level)
    }
    return nil
}

Prevention

When it happens

Trigger: Passing --logLevel trace, --logLevel verbose, --logLevel fatal, or any value outside the allowed set.

Common situations: Assuming 'trace' or 'verbose' are valid log levels; typos like 'warng'; migrating from another tool's log-level vocabulary.

Related errors


AI-assisted analysis of gohugoio/hugo@52c9bd7908 (2026-08-09). Data as JSON: /api/errors/28a3134f4edb15b3. Report an issue: GitHub.

Appendix: source

Thrown at commands/commandeer.go:509

func (r *rootCommand) createLogger(running bool) (loggers.Logger, error) {
	level := logg.LevelWarn

	if r.devMode {
		level = logg.LevelTrace
	} else {
		if r.logLevel != "" {
			switch strings.ToLower(r.logLevel) {
			case "debug":
				level = logg.LevelDebug
			case "info":
				level = logg.LevelInfo
			case "warn", "warning":
				level = logg.LevelWarn
			case "error":
				level = logg.LevelError
			default:
				return nil, fmt.Errorf("invalid log level: %q, must be one of debug, warn, info or error", r.logLevel)
			}
		}
	}

	var logHookLast func(e *logg.Entry) error
	if r.panicOnWarning {
		logHookLast = loggers.PanicOnWarningHook
	}

	optsLogger := loggers.Options{
		DistinctLevel: logg.LevelWarn,
		Level:         level,
		StdOut:        r.StdOut,
		StdErr:        r.StdErr,
		StoreErrors:   running,
		HandlerPost:   logHookLast,
	}

View on GitHub (pinned to 52c9bd7908)