jaegertracing/jaeger · error

cannot create logger

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.

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.

Appendix: 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)