use tracing::{ debug, error, info, instrument, level_filters::LevelFilter, span, trace, warn, Level, }; use tracing_subscriber::{layer::SubscriberExt, registry::Registry, Layer}; use tracing_tree::HierarchicalLayer; fn main() { let layer = HierarchicalLayer::default() .with_writer(std::io::stdout) .with_indent_lines(true) .with_indent_amount(2) .with_thread_names(true) .with_thread_ids(true) .with_verbose_exit(true) .with_verbose_entry(true) .with_deferred_spans(true) .with_targets(true) .with_span_modes(true) .with_filter(LevelFilter::DEBUG); let subscriber = Registry::default().with(layer); tracing::subscriber::set_global_default(subscriber).unwrap(); #[cfg(feature = "tracing-log")] tracing_log::LogTracer::init().unwrap(); let app_span = span!(Level::DEBUG, "hierarchical-example", version = %0.1); let _e = app_span.enter(); let server_span = span!(Level::DEBUG, "server", host = "localhost", port = 8080); println!("-> This prints before the span open message"); let _e2 = server_span.enter(); info!("starting"); std::thread::sleep(std::time::Duration::from_millis(1000)); span!(Level::INFO, "empty-span").in_scope(|| { // empty span }); info!("listening"); // Defer two levels of spans println!("-> Deferring two levels of spans"); span!(Level::INFO, "connections").in_scope(|| { let peer1 = span!(Level::DEBUG, "conn", peer_addr = "82.9.9.9", port = 42381); peer1.in_scope(|| { debug!(peer = "peer1", "connected"); std::thread::sleep(std::time::Duration::from_millis(300)); debug!(length = 2, "message received"); }); drop(peer1); let peer2 = span!(Level::DEBUG, "conn", peer_addr = "82.9.9.9", port = 61548); // This span will not be printed at all since no event in it will pass the filter peer2.in_scope(|| { trace!(peer = "peer2", "connected"); std::thread::sleep(std::time::Duration::from_millis(300)); trace!(length = 2, "message received"); }); drop(peer2); let peer3 = span!(Level::DEBUG, "conn", peer_addr = "8.8.8.8", port = 18230); peer3.in_scope(|| { std::thread::sleep(std::time::Duration::from_millis(300)); debug!(peer = "peer3", "connected"); }); drop(peer3); let peer4 = span!( Level::DEBUG, "foomp", normal_var = 43, "{} <- format string", 42 ); peer4.in_scope(|| { error!("hello"); }); drop(peer4); let peer1 = span!(Level::DEBUG, "conn", peer_addr = "82.9.9.9", port = 42381); peer1.in_scope(|| { warn!(algo = "xor", "weak encryption requested"); std::thread::sleep(std::time::Duration::from_millis(300)); debug!(length = 8, "response sent"); debug!("disconnected"); }); drop(peer1); let peer2 = span!(Level::DEBUG, "conn", peer_addr = "8.8.8.8", port = 18230); peer2.in_scope(|| { debug!(length = 5, "message received"); std::thread::sleep(std::time::Duration::from_millis(300)); debug!(length = 8, "response sent"); debug!("disconnected"); }); drop(peer2); }); warn!("internal error"); log::error!("this is a log message"); info!("exit"); } #[instrument] fn call_a(name: &str) { info!(name, "got a name"); call_b(name) } #[instrument] fn call_b(name: &str) { info!(name, "got a name"); }