jaegertracing/jaeger · error
cannot create logger: %w
Error message
cannot create logger: %w
What it means
After loading config and flags, Service.Start builds the zap logger via sFlags.NewLogger; a failure there (invalid log level/encoding values, bad zap config) is wrapped as "cannot create logger". Since logging is required for everything else, the service exits at boot.
Source
Thrown at cmd/internal/flags/service.go:73
AddConfigFileFlag(flagSet)
AddLoggingFlags(flagSet)
metricsbuilder.AddFlags(flagSet)
s.Admin.AddFlags(flagSet)
featuregate.GlobalRegistry().RegisterFlags(flagSet)
}
// Start bootstraps the service and starts the admin server.
func (s *Service) Start(v *viper.Viper) error {
if err := TryLoadConfigFile(v); err != nil {
return fmt.Errorf("cannot load config file: %w", err)
}
sFlags := new(SharedFlags).InitFromViper(v)
newProdConfig := zap.NewProductionConfig()
newProdConfig.Sampling = nil
logger, err := sFlags.NewLogger(newProdConfig)
if err != nil {
return fmt.Errorf("cannot create logger: %w", err)
}
s.Logger = logger
grpclog.SetLoggerV2(zapgrpc.NewLogger(
logger.WithOptions(
zap.AddCallerSkip(5), // ensure the actual caller:lineNo is shown
),
))
metricsBuilder := new(metricsbuilder.Builder).InitFromViper(v)
metricsFactory, err := metricsBuilder.CreateMetricsFactory("")
if err != nil {
return fmt.Errorf("cannot create metrics factory: %w", err)
}
s.MetricsFactory = metricsFactory
if err = s.Admin.initFromViper(v, s.Logger); err != nil {
return fmt.Errorf("cannot initialize admin server: %w", err)
}View on GitHub (pinned to 806f444784)
Solutions
- Check the wrapped cause for which logger option was rejected.
- Use --log-encoding=json or console only; --log-level=debug|info|warn|error.
- Inspect the logging section of the config file for invalid values.
- Run with defaults (omit logging flags) to confirm flags are the cause.
Example fix
// before --log-encoding=text // after --log-encoding=console
Defensive patterns
Strategy: validation
Validate before calling
level := v.GetString("log-level")
if level != "" {
if _, err := zapcore.ParseLevel(level); err != nil {
return fmt.Errorf("invalid --log-level %q", level)
}
}
enc := v.GetString("log-encoding")
if enc != "" && enc != "json" && enc != "console" {
return fmt.Errorf("invalid --log-encoding %q", enc)
} Try / catch
if err := svc.Start(v); err != nil {
if strings.Contains(err.Error(), "cannot create logger") {
// fix --log-level / --log-encoding values
}
return err
} Prevention
- Use only json or console for --log-encoding.
- Use standard level names (debug, info, warn, error) for --log-level.
- Keep the config file's logging section schema-valid.
- Smoke-test service startup with default logging flags.
When it happens
Trigger: Passing --log-level with an unparseable value or --log-encoding set to something other than json/console that zap's config conversion rejects, making SharedFlags.NewLogger return an error.
Common situations: Typo like --log-encoding=text (valid values: json, console); invalid zap level string; a config file supplying a malformed logging section applied through InitFromViper.
Related errors
- no sampling strategy provider specified, expecting 'adaptive
- only one sampling strategy provider can be specified, 'adapt
- reload interval must be a positive value, or zero to disable
- unknown metrics backend specified
- CalculationInterval and AggregationBuckets must be greater t
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/802f70654fe0c6ce.
Report an issue: GitHub.