Home
Head's Up: I'm in the middle of upgrading my site. Most things are in place, but there are something missing and/or broken including image alt text. Please bear with me while I'm getting things fixed.

Write Logs To A File And STDOUT At The Same Time In Rust

rust
````cargo
[dependencies]
tracing = "0.1.40"
tracing-appender = "0.2"
tracing-subscriber = { version = "0.3", features = ["json"] }
```

use tracing::{Level, event, instrument};
use tracing_subscriber::prelude::*;
use tracing_subscriber::{fmt, filter};

fn main() {
  let log_dir = "./";
  let log_basename = "example-log.log";

  let file_appender = tracing_appender::rolling::never(log_dir, log_basename);
  let (file_writer, _guard) = tracing_appender::non_blocking(file_appender);
  let file_layer_format = tracing_subscriber::fmt::format()
    .json();
  let file_layer = fmt::Layer::default()
    .event_format(file_layer_format)
    .with_writer(file_writer)
    .json();

  let stdout_layer = fmt::Layer::default()
    .with_writer(std::io::stdout)
    .with_ansi(false)
    .with_filter(filter::LevelFilter::INFO);

  let subscriber = tracing_subscriber::Registry::default()
    .with(file_layer)
    .with(stdout_layer);

  tracing::subscriber::set_global_default(subscriber).expect("unable to set global subscriber");

  do_something();
}

#[instrument]
fn do_something() {
  event!(Level::ERROR, "Error message");
  event!(Level::WARN, "Warn message");
  event!(Level::INFO, "Info message");
  event!(Level::DEBUG, "Debug message");
  event!(Level::TRACE, "Trace message");
}
results start

For most projects I send log messages to the command line or to a files. Sometimes, I want both. This is how I'm doing that in Rust with the tracing crate.

Footnotes And References