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_dbView on GitHub (pinned to 4deb7eca8f)
Solutions
- Validate RUST_LOG early and fall back to the default "info" filter when try_new fails, logging a warning
- Fix the RUST_LOG environment variable to contain valid comma-separated directives with valid level names
- Trim/strip quotes from the env value before building filter_string
- 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
- Never trust RUST_LOG content: always fall back to a safe default filter
- Trim quotes/whitespace from env values sourced from .env files
- Document valid level names in the README for operators
- Validate RUST_LOG at startup with a warning rather than a crash
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
- Failed to create tracing filter
- validated digest hour
- Default profiles v3 JSON is invalid
- request_id called for unsupported request variant
- handled non-session commands earlier
AI-assisted analysis of BloopAI/vibe-kanban@4deb7eca8f (2026-08-29).
Data as JSON: /api/errors/7bf7610871b470a4.
Report an issue: GitHub.