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          string

View on GitHub (pinned to 482b49bf1a)

Solutions

  1. Free disk space / check quotas (ENOSPC is common after stdout already consumed space)
  2. Ensure LogDir exists, is writable, and permits the process user to create the stderr file
  3. Fix rotation config values (positive MaxFiles and MaxFileSizeMB)
  4. Check the wrapped errno to target the exact filesystem problem
  5. 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

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


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/f25f9f14009d151d. Report an issue: GitHub.