BloopAI/vibe-kanban · error

Failed to create tracing filter

Error message

Failed to create tracing filter

What it means

tracing_subscriber's EnvFilter::try_new returns a Result; it errors when the filter directive string is not valid RUST_LOG syntax. The server's main builds the filter from RUST_LOG and unwraps with expect("Failed to create tracing filter"), so a malformed RUST_LOG value crashes startup.

Source

Thrown at crates/server/src/main.rs:46

    #[error(transparent)]
    Other(#[from] AnyhowError),
}

#[tokio::main]
async fn main() -> Result<(), VibeKanbanError> {
    // Install rustls crypto provider before any TLS operations
    rustls::crypto::aws_lc_rs::default_provider()
        .install_default()
        .expect("Failed to install rustls crypto provider");

    sentry_utils::init_once(SentrySource::Backend);

    let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_string());
    let filter_string = format!(
        "warn,server={level},services={level},db={level},executors={level},deployment={level},local_deployment={level},utils={level},embedded_ssh={level},desktop_bridge={level},relay_hosts={level},relay_client={level},relay_webrtc={level},codex_core=off",
        level = log_level
    );
    let env_filter = EnvFilter::try_new(filter_string).expect("Failed to create tracing filter");
    tracing_subscriber::registry()
        .with(tracing_subscriber::fmt::layer().with_filter(env_filter))
        .with(sentry_layer())
        .init();

    // Create asset directory if it doesn't exist
    if !asset_dir().exists() {
        std::fs::create_dir_all(asset_dir())?;
    }

    // Copy old database to new location for safe downgrades
    let old_db = asset_dir().join("db.sqlite");
    let new_db = asset_dir().join("db.v2.sqlite");
    if !new_db.exists() && old_db.exists() {
        tracing::info!(
            "Copying database to new location: {:?} -> {:?}",
            old_db,
            new_db

View on GitHub (pinned to 4deb7eca8f)

Solutions

  1. Validate RUST_LOG early and fall back to the default "info" filter when try_new fails, logging a warning
  2. Fix the RUST_LOG environment variable to contain valid comma-separated directives with valid level names
  3. Trim/strip quotes from the env value before building filter_string
  4. Support per-module levels only via valid directive syntax (e.g. server=debug)

Example fix

// before
let env_filter = EnvFilter::try_new(filter_string).expect("Failed to create tracing filter");
// after
let env_filter = EnvFilter::try_new(&filter_string).unwrap_or_else(|e| {
    eprintln!("Invalid RUST_LOG ({e}); using default");
    EnvFilter::new("warn,server=info")
});
Defensive patterns

Strategy: fallback

Validate before calling

fn valid_filter(s: &str) -> bool { tracing_subscriber::EnvFilter::try_new(s).is_ok() }

Try / catch

let env_filter = EnvFilter::try_new(filter_string).unwrap_or_else(|e| {
    eprintln!("Invalid RUST_LOG ({e}); falling back to default");
    EnvFilter::new("warn,server=info")
});

Prevention

When it happens

Trigger: `main` reads RUST_LOG and interpolates it into `warn,server={level},...`; if RUST_LOG contains invalid directives (e.g. "info,,=bad", stray quotes, or empty/malformed level names), try_new returns Err and the expect panics.

Common situations: Users exporting RUST_LOG with typos ("RUST_LOG=info," or "RUST_LOG=trase"), whitespace/quote artifacts from .env files, or level names that aren't valid (trace/debug/info/warn/error).

Related errors


AI-assisted analysis of BloopAI/vibe-kanban@4deb7eca8f (2026-08-29). Data as JSON: /api/errors/7bf7610871b470a4. Report an issue: GitHub.