grafana/k6 · error

invalid log level %q, should be one of: panic, fatal, error,

Error message

invalid log level %q, should be one of: panic, fatal, error, warn, warning, info, debug, trace

What it means

Returned by makeLogger during init (both Launch and Connect paths) when the K6_BROWSER_LOG_LEVEL environment variable is set but log.Logger.SetLevel rejects its value. Acceptable values are exactly: panic, fatal, error, warn, warning, info, debug, trace. The error aborts browser initialization before anything else happens, so it masks all later work until fixed.

Source

Thrown at internal/js/modules/k6/browser/chromium/browser_type.go:558

		hostResolver = append(hostResolver, fmt.Sprintf("MAP %s %s", k, v))
	}
	if len(hostResolver) > 0 {
		sort.Strings(hostResolver)
		flags["host-resolver-rules"] = strings.Join(hostResolver, ",")
	}

	return nil
}

// makeLogger makes and returns an extension wide logger.
func makeLogger(ctx context.Context, envLookup env.LookupFunc) (*log.Logger, error) {
	var (
		k6Logger = k6ext.GetVU(ctx).State().Logger
		logger   = log.New(k6Logger, common.GetIterationID(ctx))
	)
	if el, ok := envLookup(env.LogLevel); ok {
		if logger.SetLevel(el) != nil {
			return nil, fmt.Errorf(
				"invalid log level %q, should be one of: panic, fatal, error, warn, warning, info, debug, trace",
				el,
			)
		}
	}
	if _, ok := envLookup(env.LogCaller); ok {
		logger.ReportCaller()
	}

	return logger, nil
}

View on GitHub (pinned to 93accf6570)

Solutions

  1. Set K6_BROWSER_LOG_LEVEL to one of the listed values, e.g. export K6_BROWSER_LOG_LEVEL=debug
  2. Trim whitespace/case-fix the current value and retry
  3. Unset the variable to fall back to k6's default logger level
  4. Note the separate vars: K6_BROWSER_LOG_LEVEL (browser module) vs K6_LOG_LEVEL (k6 core) accept different sets

Example fix

# before
export K6_BROWSER_LOG_LEVEL=verbose

# after
export K6_BROWSER_LOG_LEVEL=debug
Defensive patterns

Strategy: validation

Validate before calling

const VALID = ['panic','fatal','error','warn','warning','info','debug','trace'];
if (__ENV.K6_BROWSER_LOG_LEVEL && !VALID.includes(__ENV.K6_BROWSER_LOG_LEVEL)) {
  throw new Error(`K6_BROWSER_LOG_LEVEL='${__ENV.K6_BROWSER_LOG_LEVEL}' invalid; use one of: ${VALID.join(', ')}`);
}

Type guard

function isBrowserLogLevel(v) {
  return ['panic','fatal','error','warn','warning','info','debug','trace'].includes(String(v).toLowerCase());
}

Prevention

When it happens

Trigger: Exporting K6_BROWSER_LOG_LEVEL with an unsupported value such as 'verbose', 'DEBUG' (case sensitivity depends on the level parser — safest to use lowercase), 'all', or an empty string; CI pipelines inheriting a LOG_LEVEL-style var renamed incorrectly.

Common situations: Teams standardizing on a 'debug'/'trace' convention but writing 'DEBUG' or 'fine'; copy-paste from k6's own K6_LOG_LEVEL which supports different values (info/debug) than the browser module; a stray space in the export: K6_BROWSER_LOG_LEVEL=' debug'.

Related errors


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/33c57505e61af6a1. Report an issue: GitHub.