use std::sync::Once;
use tracing_subscriber::fmt::time::FormatTime;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{EnvFilter, Layer};
use crate::config::LoggingConfig;
static INIT: Once = Once::new();
struct CompactTime;
impl FormatTime for CompactTime {
fn format_time(&self, w: &mut tracing_subscriber::fmt::format::Writer<'_>) -> std::fmt::Result {
write!(w, "{}", chrono::Local::now().format("%H:%M:%S%.3f"))
}
}
const EXTERNAL_TARGETS: &[&str] = &["cli", "tantivy", "pipeline", "semantic", "rag"];
pub fn init_with_config(config: &LoggingConfig) {
INIT.call_once(|| {
let filter = if std::env::var("RUST_LOG").is_ok() {
EnvFilter::from_default_env()
} else {
let mut filter_str = config.default.clone();
for (module, level) in &config.modules {
let target = if EXTERNAL_TARGETS.contains(&module.as_str()) {
module.clone()
} else {
format!("codanna::{module}")
};
filter_str.push_str(&format!(",{target}={level}"));
}
EnvFilter::new(&filter_str)
};
let fmt_layer = tracing_subscriber::fmt::layer()
.with_writer(std::io::stderr)
.with_target(true) .with_timer(CompactTime)
.with_level(true)
.with_filter(filter);
tracing_subscriber::registry().with(fmt_layer).init();
});
}
#[deprecated(
since = "0.9.12",
note = "Use init_with_config() instead - all logging now goes to stderr"
)]
pub fn init_with_config_stderr(config: &LoggingConfig) {
init_with_config(config);
}
pub fn init() {
init_with_config(&LoggingConfig::default());
}
#[macro_export]
macro_rules! log_event {
($handler:expr, $event:expr) => {
tracing::info!("[{}] {}", $handler, $event)
};
($handler:expr, $event:expr, $($arg:tt)*) => {
tracing::info!("[{}] {}: {}", $handler, $event, format!($($arg)*))
};
}
#[macro_export]
macro_rules! debug_event {
($handler:expr, $event:expr) => {
tracing::debug!("[{}] {}", $handler, $event)
};
($handler:expr, $event:expr, $($arg:tt)*) => {
tracing::debug!("[{}] {}: {}", $handler, $event, format!($($arg)*))
};
}
#[macro_export]
macro_rules! trace_event {
($handler:expr, $event:expr) => {
tracing::trace!("[{}] {}", $handler, $event)
};
($handler:expr, $event:expr, $($arg:tt)*) => {
tracing::trace!("[{}] {}: {}", $handler, $event, format!($($arg)*))
};
}