use std::ffi::c_int;
use tracing::level_filters::LevelFilter;
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
const WHITELISTED_LOG_TARGETS: &[&str] = &["wasmer", "wasmer_wasix", "virtual_fs"];
#[unsafe(no_mangle)]
pub extern "C" fn wasmer_setup_tracing(verbosity_level: c_int, use_color: c_int) {
let fmt_layer = fmt::layer()
.with_target(true)
.with_span_events(fmt::format::FmtSpan::CLOSE)
.with_ansi(use_color > 0)
.with_thread_ids(true)
.with_writer(std::io::stderr);
let filter_layer = {
let default_filters = [
LevelFilter::OFF,
LevelFilter::WARN,
LevelFilter::INFO,
LevelFilter::DEBUG,
];
let default_level = default_filters
.get(verbosity_level as usize)
.copied()
.unwrap_or(LevelFilter::TRACE);
let mut filter = EnvFilter::builder()
.with_default_directive(default_level.into())
.from_env_lossy();
let specific_filters = [LevelFilter::WARN, LevelFilter::INFO, LevelFilter::DEBUG];
if verbosity_level > 0 {
let level = specific_filters
.get(verbosity_level as usize)
.copied()
.unwrap_or(LevelFilter::TRACE);
for target in WHITELISTED_LOG_TARGETS {
let directive = format!("{target}={level}").parse().unwrap();
filter = filter.add_directive(directive);
}
}
filter
};
tracing_subscriber::registry()
.with(filter_layer)
.with(fmt_layer.compact().with_target(true))
.init();
}