uber-go/zap · error

no encoder registered for name %q

Error message

no encoder registered for name %q

What it means

newEncoder looks up the requested encoder name in the global registry and returns fmt.Errorf("no encoder registered for name %q", name) when the name was never registered (and is not a built-in). The Config's Encoding field feeds this lookup during Build.

Source

Thrown at encoder.go:76

		return fmt.Errorf("encoder already registered for name %q", name)
	}
	_encoderNameToConstructor[name] = constructor
	return nil
}

func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) {
	if encoderConfig.TimeKey != "" && encoderConfig.EncodeTime == nil {
		return nil, errors.New("missing EncodeTime in EncoderConfig")
	}

	_encoderMutex.RLock()
	defer _encoderMutex.RUnlock()
	if name == "" {
		return nil, errNoEncoderNameSpecified
	}
	constructor, ok := _encoderNameToConstructor[name]
	if !ok {
		return nil, fmt.Errorf("no encoder registered for name %q", name)
	}
	return constructor(encoderConfig)
}

View on GitHub (pinned to bbd4ecbd87)

Solutions

  1. Register the encoder before Build: zap.RegisterEncoder("myencoder", ctor)
  2. Use a built-in encoding: "json" or "console"
  3. Fix the spelling of cfg.Encoding and ensure the package performing registration is imported

Example fix

// before
cfg := zap.Config{Encoding: "myencoder"}
logger, _ := cfg.Build()
// after
zap.RegisterEncoder("myencoder", myCtor)
cfg := zap.Config{Encoding: "myencoder"}
logger, _ := cfg.Build()
Defensive patterns

Strategy: validation

Validate before calling

switch cfg.Encoding {
case "", "json", "console":
    // built-ins are fine
default:
    if err := ensureCustomEncodersRegistered(); err != nil {
        return err
    }
}

Try / catch

logger, err := cfg.Build()
if err != nil {
    return fmt.Errorf("build logger (encoding=%q): %w", cfg.Encoding, err)
}

Prevention

When it happens

Trigger: Setting zap.Config{Encoding: "myencoder"} without having called RegisterEncoder("myencoder", ...), or misspelling the encoding name; using an encoding registered in a different binary.

Common situations: Typo in Encoding (e.g. "jsn"); custom encoder registered via init in a package that isn't imported; config file supplying an unsupported encoding value.

Related errors


AI-assisted analysis of uber-go/zap@bbd4ecbd87 (2026-08-31). Data as JSON: /api/errors/fbf5453b1cac7c54. Report an issue: GitHub.