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

  1. Check the wrapped cause for which logger option was rejected.
  2. Use --log-encoding=json or console only; --log-level=debug|info|warn|error.
  3. Inspect the logging section of the config file for invalid values.
  4. 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

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


AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01). Data as JSON: /api/errors/802f70654fe0c6ce. Report an issue: GitHub.