hashicorp/nomad · error
failed to create stderr logfile for %q: %v
Error message
failed to create stderr logfile for %q: %v
What it means
Analogous to the stdout case, NewTaskLogger creates the stderr file rotator via logging.NewFileRotator; failure to create/open the stderr log file aborts task logger creation with this error naming the stderr log file. The task cannot start logging until both stdout and stderr rotators exist.
Source
Thrown at client/logmon/logmon.go:157
logFileSize := int64(cfg.MaxFileSizeMB * 1024 * 1024)
lro, err := logging.NewFileRotator(cfg.LogDir, cfg.StdoutLogFile,
cfg.MaxFiles, logFileSize, logger)
if err != nil {
return nil, fmt.Errorf("failed to create stdout logfile for %q: %v", cfg.StdoutLogFile, err)
}
wrapperOut, err := newLogRotatorWrapper(cfg.StdoutFifo, logger, lro)
if err != nil {
return nil, err
}
tl.lro = wrapperOut
lre, err := logging.NewFileRotator(cfg.LogDir, cfg.StderrLogFile,
cfg.MaxFiles, logFileSize, logger)
if err != nil {
return nil, fmt.Errorf("failed to create stderr logfile for %q: %v", cfg.StderrLogFile, err)
}
wrapperErr, err := newLogRotatorWrapper(cfg.StderrFifo, logger, lre)
if err != nil {
return nil, err
}
tl.lre = wrapperErr
return tl, nil
}
// logRotatorWrapper wraps our log rotator and exposes a pipe that can feed the
// log rotator data. The processOutWriter should be attached to the process and
// data will be copied from the reader to the rotator.
type logRotatorWrapper struct {
fifoPath stringView on GitHub (pinned to 482b49bf1a)
Solutions
- Free disk space / check quotas (ENOSPC is common after stdout already consumed space)
- Ensure LogDir exists, is writable, and permits the process user to create the stderr file
- Fix rotation config values (positive MaxFiles and MaxFileSizeMB)
- Check the wrapped errno to target the exact filesystem problem
- Verify SELinux/AppArmor allows file creation in the log dir
Example fix
// before
lre, err := logging.NewFileRotator(cfg.LogDir, cfg.StderrLogFile, 0, size, logger) // invalid MaxFiles
// after
cfg.MaxFiles = 10 // valid rotation config
lre, err := logging.NewFileRotator(cfg.LogDir, cfg.StderrLogFile, cfg.MaxFiles, size, logger)
if err != nil {
return nil, fmt.Errorf("failed to create stderr logfile for %q: %w", cfg.StderrLogFile, err)
} Defensive patterns
Strategy: validation
Validate before calling
func ensureLogDirUsable(dir string) error {
if err := os.MkdirAll(dir, 0o755); err != nil {
return fmt.Errorf("log dir not creatable: %w", err)
}
probe := filepath.Join(dir, ".probe")
if err := os.WriteFile(probe, []byte("x"), 0o600); err != nil {
return fmt.Errorf("log dir not writable: %w", err)
}
return os.Remove(probe)
} Try / catch
tl, err := NewTaskLogger(cfg)
if err != nil {
if strings.Contains(err.Error(), "failed to create stderr logfile") {
return fmt.Errorf("check log_dir permissions and free disk (stdout may have filled it): %w", err)
}
return err
} Prevention
- Reserve disk headroom so stderr creation never hits ENOSPC
- Use positive MaxFiles/MaxFileSizeMB in logmon config
- Run logmon as a user permitted to create files in log_dir
- Pre-flight the log dir with a write probe before task start
When it happens
Trigger: NewFileRotator failing for the stderr log file: unwritable or missing LogDir, no disk space, permission errors, or invalid rotation parameters (MaxFiles <= 0, negative size).
Common situations: Same environment issues as stdout (read-only volume, quota, wrong ownership) but surfacing on stderr; partial setup where stdout succeeded and stderr failed — often indicates intermittent disk-full conditions.
Related errors
- failed to create stdout logfile for %q: %v
- failed to create fifo for extracting logs: %v
- No nomad log file defined
- No nomad log file defined
- error creating fifo %v: %w
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/f25f9f14009d151d.
Report an issue: GitHub.