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
- Register the encoder before Build: zap.RegisterEncoder("myencoder", ctor)
- Use a built-in encoding: "json" or "console"
- 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
- Blank-import the package that registers custom encoders: _ "mymodule/logencoders"
- Verify cfg.Encoding spelling against registered/built-in names
- Call RegisterEncoder before cfg.Build(), e.g. in init()
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
- no encoder name specified
- missing EncodeTime in EncoderConfig
- encoder already registered for name %q
- missing Level
- can't register a sink factory for empty string
AI-assisted analysis of uber-go/zap@bbd4ecbd87 (2026-08-31).
Data as JSON: /api/errors/fbf5453b1cac7c54.
Report an issue: GitHub.