caddyserver/caddy · error

setting up default Caddy log: %v

Error message

setting up default Caddy log: %v

What it means

When no user-defined default log exists, Caddy constructs its production default log via newDefaultProductionLog. Failure there (building default options, opening the default writer) surfaces as this error during Logging setup.

Source

Thrown at logging.go:151

	return nil
}

func (logging *Logging) setupNewDefault(ctx Context) error {
	if logging.Logs == nil {
		logging.Logs = make(map[string]*CustomLog)
	}

	// 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...)

View on GitHub (pinned to 50e54ee279)

Solutions

  1. Ensure the process has a valid stderr (service unit with StandardError=journal or a file).
  2. Define an explicit default log ("log" with name default) with a concrete writer such as file, so the production stderr default is not needed.
  3. Check the wrapped error for the precise failing step.

Example fix

// before: no default log, stderr unusable
// after: explicit default log to file
"logging": { "logs": { "default": { "writer": { "output": "file", "filename": "/var/log/caddy.log" } } } }
Defensive patterns

Strategy: fallback

Prevention

When it happens

Trigger: Rare: the default production writer (stderr) cannot be opened — e.g. stderr closed/invalid in the process environment — or internal option building fails. Triggered inside setupNewDefault when DefaultLoggerName is absent from logging.Logs.

Common situations: Running Caddy as a service where stderr was closed or redirected to an invalid descriptor; unusual container runtimes detaching stderr; extremely constrained environments.

Related errors


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