reflex-dev/reflex · error · EnvironmentVarValueError

Invalid log level value: {value} for {field_name}

Error message

Invalid log level value: {value} for {field_name}

What it means

For fields typed as LogLevel, interpret_env_var_value calls LogLevel.from_string(value); an unrecognized string (not a standard level name like 'debug', 'info', 'warning', 'error', 'critical') yields None and raises EnvironmentVarValueError.

Source

Thrown at packages/reflex-base/src/reflex_base/environment.py:323

        for arg in (union_types := get_args(field_type)):
            try:
                return interpret_env_var_value(value, arg, field_name)
            except (ValueError, EnvironmentVarValueError) as e:  # noqa: PERF203
                errors.append(e)
        msg = f"Could not interpret {value!r} for {field_name} as any of {union_types}: {errors}"
        raise EnvironmentVarValueError(msg)

    value = value.strip()

    if field_type is bool:
        return interpret_boolean_env(value, field_name)
    if field_type is str:
        return value
    if field_type is LogLevel:
        loglevel = LogLevel.from_string(value)
        if loglevel is None:
            msg = f"Invalid log level value: {value} for {field_name}"
            raise EnvironmentVarValueError(msg)
        return loglevel
    if field_type is int:
        return interpret_int_env(value, field_name)
    if field_type is float:
        return interpret_float_env(value, field_name)
    if field_type is Path:
        if PathExistsFlag in annotated_metadata:
            return interpret_existing_path_env(value, field_name)
        return interpret_path_env(value, field_name)
    if field_type is ExistingPath:
        return interpret_existing_path_env(value, field_name)
    if field_type is Plugin:
        return interpret_plugin_env(value, field_name)
    if get_origin(field_type) is type:
        type_args = get_args(field_type)
        if (
            type_args
            and isinstance(type_args[0], type)

View on GitHub (pinned to 45b8ed5ab7)

Solutions

  1. Use a standard level name accepted by LogLevel.from_string (e.g. 'debug', 'info', 'warning', 'error')
  2. Trim whitespace/quotes from the value
  3. If 'trace'/'notice' style levels are needed, map them to the nearest supported level at the deployment layer

Example fix

# before
LOG_LEVEL=trace
# after
LOG_LEVEL=debug
Defensive patterns

Strategy: validation

Validate before calling

VALID = {"debug", "info", "warning", "error", "critical"}
v = os.environ.get("LOG_LEVEL", "info").strip().lower()
assert v in VALID, f"LOG_LEVEL must be one of {sorted(VALID)}"

Type guard

def is_valid_log_level(v: str) -> bool:
    return LogLevel.from_string(v.strip()) is not None

Try / catch

except EnvironmentVarValueError:
    level = LogLevel.INFO  # fallback

Prevention

When it happens

Trigger: Setting a log-level env var to a non-level string: LOG_LEVEL=verbose, LOG_LEVEL=DEBUG???, or with stray whitespace/case issues outside what from_string accepts.

Common situations: Using levels from other logging systems ('trace', 'warn' vs 'warning', 'notice'), or copy-paste artifacts in env files.

Related errors


AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28). Data as JSON: /api/errors/82396588d2eebfcf. Report an issue: GitHub.