Tracing Subscriber Env Filter Init
Bootstrap tracing with EnvFilter directives, JSON output in production, pretty console in development, and span lifecycle events.
Code
use tracing::{debug, error, info, instrument, warn};
use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
#[instrument(name = "order_flow", skip(payload))]
fn process_order(order_id: u64, payload: &str) -> u64 {
debug!(bytes = payload.len(), "payload received");
let total = payload.len() as u64 * order_id % 97;
info!(total, "order total computed");
total
}
fn init_tracing() {
let filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new("info,order_service=debug"));
let is_prod = std::env::var("APP_ENV")
.map(|v| v == "production")
.unwrap_or(false);
let registry = tracing_subscriber::registry().with(filter);
if is_prod {
registry
.with(fmt::layer().json().flatten_event(true))
.init();
} else {
registry
.with(fmt::layer().pretty().with_target(false))
.init();
}
}
fn main() {
init_tracing();
let span = tracing::info_span!("startup", version = env!("CARGO_PKG_VERSION"));
let _guard = span.enter();
info!("service starting");
warn!("cache warmup skipped");
let total = process_order(42, "line-item;quantity=3");
error!(total, "downstream settlement slow");
drop(_guard);
info!("shutdown complete");
}Report a problem with this exampleOpens a pre-filled issue on GitHub.