use tracing::Level;
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogLevel {
Error,
Warn,
Info,
Debug,
Trace,
}
impl LogLevel {
fn to_tracing_level(self) -> Level {
match self {
LogLevel::Error => Level::ERROR,
LogLevel::Warn => Level::WARN,
LogLevel::Info => Level::INFO,
LogLevel::Debug => Level::DEBUG,
LogLevel::Trace => Level::TRACE,
}
}
}
pub fn init_logging(level: LogLevel) {
let env_filter = EnvFilter::try_from_env("RSTRUCTOR_LOG").unwrap_or_else(|_| {
EnvFilter::new(format!("rstructor={}", level.to_tracing_level()))
});
tracing_subscriber::registry()
.with(fmt::layer().with_target(true))
.with(env_filter)
.init();
tracing::info!("rstructor logging initialized at level: {:?}", level);
}
pub fn init_logging_with_filter(filter: &str) {
let env_filter = EnvFilter::try_new(filter).unwrap_or_else(|_| {
tracing::warn!("Invalid filter string: {}, using default (info)", filter);
EnvFilter::new("rstructor=info")
});
tracing_subscriber::registry()
.with(fmt::layer().with_target(true))
.with(env_filter)
.init();
tracing::info!(
"rstructor logging initialized with custom filter: {}",
filter
);
}