kataras/iris · error

accesslog: SetFormatter called with nil Writer

Error message

accesslog: SetFormatter called with nil Writer

What it means

AccessLog.SetFormatter panics immediately if the AccessLog's Writer field is nil (middleware/accesslog/accesslog.go:672), because a formatter has nowhere to write output. The check runs before the formatter is even inspected.

Solutions

  1. Initialize the AccessLog with accesslog.New(io.Writer) so Writer is always set.
  2. Set ac.Writer to a valid io.Writer (e.g. an *os.File) before calling SetFormatter.
  3. Reorder code so SetFormatter is called after Writer assignment when building AccessLog manually.

Example fix

// before
ac := &accesslog.AccessLog{}
ac.SetFormatter(&accesslog.JSON{}) // panics: nil Writer

// after
f := accesslog.File("./access.log")
ac := accesslog.New(f)
ac.SetFormatter(&accesslog.JSON{})
Defensive patterns

Strategy: validation

Validate before calling

// Guard before calling SetFormatter
if ac.Writer == nil {
    return errors.New("accesslog writer not initialized")
}
ac.SetFormatter(&accesslog.JSON{})

Type guard

func writerSet(ac *accesslog.AccessLog) bool {
    return ac != nil && ac.Writer != nil
}

Try / catch

defer func() {
    if r := recover(); r != nil {
        log.Fatalf("SetFormatter: %v", r)
    }
}()

Prevention

When it happens

Trigger: Creating an AccessLog struct manually (not via accesslog.New, which requires a writer) with Writer left nil and then calling ac.SetFormatter(&accesslog.JSON{...}).

Common situations: Constructing &accesslog.AccessLog{} directly and setting fields piecemeal; assigning a nil writer variable by mistake; reordering initialization so SetFormatter runs before Writer is set.

Related errors


AI-assisted analysis of kataras/iris@7bedaf55a0 (2026-08-30). Data as JSON: /api/errors/abc7917f6b8687d8. Report an issue: GitHub.

Appendix: source

Thrown at middleware/accesslog/accesslog.go:672

				err = fmt.Errorf("%v, %v", err, tErr)
			}
		}
	}
	ac.mu.Unlock()

	return err
}

// SetFormatter sets a custom formatter to print the logs.
// Any custom output writers should be
// already registered before calling this method.
// Returns this AccessLog instance.
//
// Usage:
// ac.SetFormatter(&accesslog.JSON{Indent: "    "})
func (ac *AccessLog) SetFormatter(f Formatter) *AccessLog {
	if ac.Writer == nil {
		panic("accesslog: SetFormatter called with nil Writer")
	}

	if f == nil {
		return ac
	}

	if flusher, ok := ac.formatter.(Flusher); ok {
		// PREPEND formatter flushes, they should run before destination's ones.
		ac.Flushers = append([]Flusher{flusher}, ac.Flushers...)
	}

	// Inject the writer (AccessLog) here, the writer
	// is protected with mutex.
	f.SetOutput(ac)

	ac.formatter = f
	return ac
}

View on GitHub (pinned to 7bedaf55a0)