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 convenienceView on GitHub (pinned to 50e54ee279)
Solutions
- Inspect the wrapped error; it names which option failed.
- Simplify the default log first (just writer + level) and re-add options one at a time.
- Cross-check level and sampling fields against current docs for the Caddy version in use.
- 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
- Restrict default-log overrides to well-known fields (level, writer).
- Re-adapt Caddyfile to JSON rather than hand-editing option objects.
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
- setting up sink log: %v
- setting up custom log '%s': %v
- loading log writer module: %v
- server %s: logger name must not have a port: %s
- invalid action type
AI-assisted analysis of caddyserver/caddy@50e54ee279 (2026-08-15).
Data as JSON: /api/errors/4e78a80866cd17f8.
Report an issue: GitHub.