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
- Ensure the process has a valid stderr (service unit with StandardError=journal or a file).
- Define an explicit default log ("log" with name default) with a concrete writer such as file, so the production stderr default is not needed.
- 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
- Define an explicit default log with a file writer when stderr is unreliable.
- Service units should keep a valid StandardError target.
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
- setting up sink log: %v
- setting up custom log '%s': %v
- invalid action type
- replacing listen address: %v
- reading environment file: %v
AI-assisted analysis of caddyserver/caddy@50e54ee279 (2026-08-15).
Data as JSON: /api/errors/c182f97e921604aa.
Report an issue: GitHub.