hashicorp/nomad · error
failed to create stderr logfile for
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.
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
- failed to create fifo for extracting logs
- configuration install failed
- error creating fifo
- error opening fifo parent directory
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/f25f9f14009d151d.
Report an issue: GitHub.
Appendix: 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)