use tracing_subscriber::prelude::*;
use tracing_subscriber::{EnvFilter, Registry, fmt};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogFormat {
Text,
Tree,
Json,
}
impl LogFormat {
fn from_env() -> Self {
match std::env::var("TSZ_LOG_FORMAT")
.unwrap_or_default()
.to_lowercase()
.as_str()
{
"tree" => Self::Tree,
"json" => Self::Json,
_ => Self::Text,
}
}
}
fn build_filter() -> EnvFilter {
if let Ok(val) = std::env::var("TSZ_LOG") {
EnvFilter::builder().parse_lossy(val)
} else {
EnvFilter::from_default_env()
}
}
pub fn init_tracing() {
let has_tsz_log = std::env::var("TSZ_LOG").is_ok();
let has_rust_log = std::env::var("RUST_LOG").is_ok();
let has_perf = std::env::var_os("TSZ_PERF").is_some();
if !has_tsz_log && !has_rust_log && !has_perf {
return;
}
let filter = if has_tsz_log || has_rust_log {
build_filter()
} else {
EnvFilter::builder().parse_lossy("wasm::perf=info")
};
let format = LogFormat::from_env();
match format {
LogFormat::Tree => {
let tree_layer = tracing_tree::HierarchicalLayer::default()
.with_indent_amount(2)
.with_indent_lines(true)
.with_deferred_spans(true)
.with_span_retrace(true)
.with_targets(true);
Registry::default().with(filter).with(tree_layer).init();
}
LogFormat::Json => {
let json_layer = fmt::layer().json().with_writer(std::io::stderr);
Registry::default().with(filter).with(json_layer).init();
}
LogFormat::Text => {
tracing_subscriber::fmt()
.with_env_filter(filter)
.with_writer(std::io::stderr)
.init();
}
}
}