tecton-core 0.1.0

Shared utilities, configuration, logging, and types for Tecton
Documentation
//! Tracing/logging bootstrap helpers.

use crate::error::{Result, TectonError};
use tracing_subscriber::{fmt, prelude::*, EnvFilter};

/// Initialize structured logging with an env-filter.
///
/// Respects `RUST_LOG` when set; otherwise uses `default_level`.
pub fn init_tracing(default_level: &str) -> Result<()> {
    let filter = EnvFilter::try_from_default_env()
        .or_else(|_| EnvFilter::try_new(default_level))
        .map_err(|e| TectonError::config(format!("invalid log filter: {e}")))?;

    // Avoid double-init when CLI and UI share a process.
    if tracing::dispatcher::has_been_set() {
        return Ok(());
    }

    tracing_subscriber::registry()
        .with(filter)
        .with(
            fmt::layer()
                .with_target(true)
                .with_thread_ids(false)
                .compact(),
        )
        .try_init()
        .map_err(|e| TectonError::Internal(format!("failed to init tracing: {e}")))?;

    Ok(())
}