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
- Set K6_BROWSER_LOG_LEVEL to one of the listed values, e.g. export K6_BROWSER_LOG_LEVEL=debug
- Trim whitespace/case-fix the current value and retry
- Unset the variable to fall back to k6's default logger level
- 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
- Use lowercase canonical levels for K6_BROWSER_LOG_LEVEL
- Do not reuse K6_LOG_LEVEL values verbatim for the browser module
- Add a startup check that fails the CI job on unknown browser env vars
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
- K6_CLOUD_LOGS_PUSH_URL requires K6_CLOUD_TEST_RUN_TOKEN
- missing required url
- parsing K6_SHOW_CLOUD_LOGS returned an error: %w
- parsing K6_EXIT_ON_RUNNING returned an error: %w
- finding browser executable: %w
AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15).
Data as JSON: /api/errors/33c57505e61af6a1.
Report an issue: GitHub.