From 21923308893a1cb6fec774acf691e2309523b4d3 Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Wed, 13 Nov 2024 17:23:02 -0800 Subject: [PATCH] docs: Add example for setting default log level A new example, `log_level.rs`, demonstrates how to set the default log level for Verbosity to something other than the default. It can be run with `cargo run --example=log_level [default level] [flags]`. E.g.,: `cargo run --example=log_level off -vvvv` will set the default log level to `OffLevel` and then apply the verbosity flags to set the log level to `Debug`. --- examples/log_level.rs | 67 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 examples/log_level.rs diff --git a/examples/log_level.rs b/examples/log_level.rs new file mode 100644 index 0000000..90fdbff --- /dev/null +++ b/examples/log_level.rs @@ -0,0 +1,67 @@ +//! Demonstrates how to set the default log level for the logger to something other than the default +//! (`ErrorLevel`). This is done with multiple subcommands, each with their own verbosity level. + +use clap::{Parser, Subcommand}; +use clap_verbosity_flag::{ + DebugLevel, ErrorLevel, InfoLevel, OffLevel, TraceLevel, Verbosity, WarnLevel, +}; + +#[derive(Debug, Parser)] +struct Cli { + #[command(subcommand)] + command: Command, +} + +#[derive(Debug, Subcommand)] +enum Command { + Off { + #[command(flatten)] + verbose: Verbosity, + }, + Error { + #[command(flatten)] + verbose: Verbosity, + }, + Warn { + #[command(flatten)] + verbose: Verbosity, + }, + Info { + #[command(flatten)] + verbose: Verbosity, + }, + Debug { + #[command(flatten)] + verbose: Verbosity, + }, + Trace { + #[command(flatten)] + verbose: Verbosity, + }, +} + +impl Command { + fn log_level_filter(&self) -> log::LevelFilter { + match self { + Command::Off { verbose } => verbose.log_level_filter(), + Command::Error { verbose } => verbose.log_level_filter(), + Command::Warn { verbose } => verbose.log_level_filter(), + Command::Info { verbose } => verbose.log_level_filter(), + Command::Debug { verbose } => verbose.log_level_filter(), + Command::Trace { verbose } => verbose.log_level_filter(), + } + } +} + +fn main() { + let cli = Cli::parse(); + env_logger::Builder::new() + .filter_level(cli.command.log_level_filter()) + .init(); + + log::error!("Engines exploded"); + log::warn!("Engines smoking"); + log::info!("Engines exist"); + log::debug!("Engine temperature is 200 degrees"); + log::trace!("Engine subsection is 300 degrees"); +}