nats-io/nats-server · error

can set log max number of files only for file logger

Error message

can set log max number of files only for file logger

What it means

Logger.SetMaxNumFiles sets how many archived rotation files are retained, but like SetSizeLimit it operates on the underlying file logger. When l.fl is nil (no file sink attached), the call fails with this error.

Source

Thrown at logger/log.go:315

// and the current log is truncated.
func (l *Logger) SetSizeLimit(limit int64) error {
	l.Lock()
	if l.fl == nil {
		l.Unlock()
		return fmt.Errorf("can set log size limit only for file logger")
	}
	fl := l.fl
	l.Unlock()
	fl.setLimit(limit)
	return nil
}

// SetMaxNumFiles sets the number of archived log files that will be retained
func (l *Logger) SetMaxNumFiles(max int) error {
	l.Lock()
	if l.fl == nil {
		l.Unlock()
		return fmt.Errorf("can set log max number of files only for file logger")
	}
	fl := l.fl
	l.Unlock()
	fl.setMaxNumFiles(max)
	return nil
}

// NewTestLogger creates a logger with output directed to Stderr with a prefix.
// Useful for tracing in tests when multiple servers are in the same pid
func NewTestLogger(prefix string, time bool) *Logger {
	flags := 0
	if time {
		flags = log.LstdFlags | log.Lmicroseconds
	}
	l := &Logger{
		logger: log.New(os.Stderr, prefix, flags),
		debug:  true,
		trace:  true,

View on GitHub (pinned to 3a66a489d2)

Solutions

  1. Configure the file logger (SetFileName/OpenFile) before calling SetMaxNumFiles
  2. Gate rotation-config calls behind the same flag that enables file logging
  3. No-op or skip when the logger has no file sink

Example fix

// before
logger.SetMaxNumFiles(10) // panics-less error: no file logger
// after
if err := logger.SetFileName("/var/log/app.log"); err == nil {
    logger.SetMaxNumFiles(10)
}
Defensive patterns

Strategy: try-catch

Try / catch

if err := logger.SetMaxNumFiles(max); err != nil {
    if strings.Contains(err.Error(), "only for file logger") {
        return nil // rotation retention not applicable without file sink
    }
    return err
}

Prevention

When it happens

Trigger: Calling SetMaxNumFiles on a logger not opened against a file — SetFileName/OpenFile never called, or file logging disabled in configuration.

Common situations: Rotation settings applied globally to console loggers in dev environments; initialization order where SetMaxNumFiles precedes SetFileName; conditional file-logging setups.

Related errors


AI-assisted analysis of nats-io/nats-server@3a66a489d2 (2026-09-02). Data as JSON: /api/errors/b187d2453e2aad25. Report an issue: GitHub.