Rust tracing basic setup
March 29, 2025 [Programming, Programming Languages, Rust, Tech]I spent ages yesterday trying to figure out how to use Rust's tracing library (and tracing-subscriber) for a very simple logging use-case.
I wanted to use tracing
because a) it's rapidly becoming standard everywhere
and b) I was using libraries that used it.
I found it very hard to find a simple example that either takes its log level
from the RUST_LOG
environment variable, or uses a non-trivial default. Here's
what I came up with:
$ cargo add tracing $ cargo add tracing-subscriber --features env-filter
use tracing_subscriber::FmtSubscriber; fn main() { const DEFAULT_LOGGING: &str = "myprogram=info,warn"; let rust_log = std::env::var("RUST_LOG") .ok() .and_then(|s| if s.is_empty() { None } else { Some(s) }) .unwrap_or_else(|| DEFAULT_LOGGING.to_owned()); tracing::subscriber::set_global_default( FmtSubscriber::builder().with_env_filter(rust_log).finish(), ) .expect("tracing setup failed"); // The rest of my program here ... }
The myprogram=info,warn
part sets the log level of my project to info
and
any libraries I use to warn
. You'll need to replace myprogram
with the name
of your project.
This sets a default logging level which can be overridden by launching the
program with e.g. RUST_LOG=debug ./myprogram
to set the level to debug
everywhere or e.g. RUST_LOG="myproject=debug,warn" ./myprogram
to do something
more clever.
(The format of these comma-separated lists of directives are kind of documented at tracing_fmt::Builder::with_env_filter and EnvFilter.)
Once that's done I can log using code like this:
use tracing::{debug, info}; pub fn myfun() { let x = 3; info!("The number is {x}"); debug!("DEBUG ONLY"); }
If anyone knows a simpler way to achieve these results, let me know. I spent a
long time fiddling with EnvFilter::with_default_directive
and similar stuff
before I decided I had to check the contents of RUST_LOG
manually if I wanted
a more complex default (not a single directive).
Side note: wow, tracing_subscriber
is hard to use! I couldn't find any simple
examples - links welcome.