Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Set log level on the command line

It is nice that one can set the log-level using the RUST_LOG environment variable, but if your project already has various command-line options then it seem to make sense to be able to set the log level via a command-line flag as well. Here is one way to do it using the env_logger and the log crates.

use clap::Parser;

#[derive(Parser, Debug)]
#[command(version)]
struct Cli {
    #[arg(long, help = "Set logging level (debug, info, warn, error). Default is 'warn'")]
    log: Option<log::Level>,
}


fn main() {
    let args = Cli::parse();

    let mut builder = env_logger::Builder::new();

    let log_level = if let Some(level) = args.log {
        level.to_string()
    } else {
        std::env::var("RUST_LOG").unwrap_or(String::from("warn"))
    };

    builder.parse_filters(&log_level);
    builder.init();


    log::debug!("Debug level log");
    log::info!("Info level log");
    log::warn!("Warn level log");
    log::error!("Error level log");
}

Try some of the following commands:

The default log level is "warn":

cargo run

Set the log level to debug using the command line:

cargo run -- --log debug

Set the log level to info using the environment variable:

RUST_LOG=info cargo run

Set the log level to debug using the command line: The command-line option overrides the environment variable.

RUST_LOG=info cargo run -- --log debug

Invalid log-levels will be stopped when parsing the command-line argument list:

cargo run -- --log duck
[package]
name = "env-logger-set-log-level-on-the-command-line"
version = "0.1.0"
edition = "2024"

[dependencies]
clap = { version = "4.5.49", features = ["derive"] }
env_logger = "0.11.8"
log = "0.4.28"
serde = { version = "1.0.228", features = ["derive"] }