caddyserver/caddy · error

setting up default log: %v

Error message

setting up default log: %v

What it means

While setting up the default log, Caddy builds zap logger options from the default CustomLog (buildOptions). This error wraps a failure in that option construction — typically an invalid level, sampling, or encoding configuration carried on the default log definition.

Source

Thrown at logging.go:159

	// extract the user-defined default log, if any
	newDefault := new(defaultCustomLog)
	if userDefault, ok := logging.Logs[DefaultLoggerName]; ok {
		newDefault.CustomLog = userDefault
	} else {
		// if none, make one with our own default settings
		var err error
		newDefault, err = newDefaultProductionLog()
		if err != nil {
			return fmt.Errorf("setting up default Caddy log: %v", err)
		}
		logging.Logs[DefaultLoggerName] = newDefault.CustomLog
	}

	// options for the default logger
	options, err := newDefault.CustomLog.buildOptions()
	if err != nil {
		return fmt.Errorf("setting up default log: %v", err)
	}

	// set up this new log
	err = newDefault.CustomLog.provision(ctx, logging)
	if err != nil {
		return fmt.Errorf("setting up default log: %v", err)
	}

	filteringCore := &filteringCore{newDefault.CustomLog.core, newDefault.CustomLog}
	newDefault.logger = zap.New(filteringCore, options...)

	// redirect the default caddy logs
	defaultLoggerMu.Lock()
	oldDefault := defaultLogger
	defaultLogger = newDefault
	defaultLoggerMu.Unlock()

	// if the new writer is different, indicate it in the logs for convenience

View on GitHub (pinned to 50e54ee279)

Solutions

  1. Inspect the wrapped error; it names which option failed.
  2. Simplify the default log first (just writer + level) and re-add options one at a time.
  3. Cross-check level and sampling fields against current docs for the Caddy version in use.
  4. Use 'caddy adapt --pretty' to regenerate canonical JSON from a Caddyfile.

Example fix

// before
"default": { "level": "VERBOSE" }
// after
"default": { "level": "DEBUG" }
Defensive patterns

Strategy: validation

Validate before calling

var validLevels = map[string]bool{"DEBUG": true, "INFO": true, "WARN": true, "ERROR": true}

func levelOK(l string) bool { return validLevels[strings.ToUpper(l)] }

Prevention

When it happens

Trigger: A user-defined log named 'default' whose fields are invalid: bad level string, malformed sampling config, or an encoder configuration buildOptions cannot turn into zap options.

Common situations: JSON config defining logging.logs.default with non-zap-compatible values; upgrading Caddy versions where accepted option shapes changed; hand-edited adapted configs.

Related errors


AI-assisted analysis of caddyserver/caddy@50e54ee279 (2026-08-15). Data as JSON: /api/errors/4e78a80866cd17f8. Report an issue: GitHub.