diff --git a/crates/dtmm/src/main.rs b/crates/dtmm/src/main.rs index 5a6844c..f60bfd8 100644 --- a/crates/dtmm/src/main.rs +++ b/crates/dtmm/src/main.rs @@ -6,10 +6,8 @@ use std::path::PathBuf; use std::sync::Arc; -use clap::command; use clap::parser::ValueSource; -use clap::value_parser; -use clap::Arg; +use clap::{command, value_parser, Arg}; use color_eyre::eyre; use color_eyre::{Report, Result}; use druid::AppLauncher; @@ -19,6 +17,7 @@ use crate::controller::worker::work_thread; use crate::state::AsyncAction; use crate::state::{Delegate, State}; use crate::ui::theme; +use crate::util::log::LogLevel; mod controller; mod state; @@ -46,10 +45,22 @@ fn main() -> Result<()> { .value_parser(value_parser!(PathBuf)) .default_value(default_config_path.to_string_lossy().to_string()), ) + .arg( + Arg::new("log-level") + .long("log-level") + .help("The maximum level of log events to print") + .value_parser(value_parser!(LogLevel)) + .default_value("info"), + ) .get_matches(); let (log_tx, log_rx) = tokio::sync::mpsc::unbounded_channel(); - util::log::create_tracing_subscriber(log_tx); + let level = if matches.value_source("log-level") == Some(ValueSource::DefaultValue) { + None + } else { + matches.get_one::("log-level").cloned() + }; + util::log::create_tracing_subscriber(log_tx, level); let (action_tx, action_rx) = tokio::sync::mpsc::unbounded_channel(); diff --git a/crates/dtmm/src/util/log.rs b/crates/dtmm/src/util/log.rs index 75db550..b01ef5f 100644 --- a/crates/dtmm/src/util/log.rs +++ b/crates/dtmm/src/util/log.rs @@ -1,3 +1,4 @@ +use clap::ValueEnum; use tokio::sync::mpsc::UnboundedSender; use tracing_error::ErrorLayer; use tracing_subscriber::filter::FilterFn; @@ -7,6 +8,28 @@ use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::prelude::*; use tracing_subscriber::EnvFilter; +#[derive(Clone, Copy, ValueEnum)] +pub enum LogLevel { + Trace, + Debug, + Info, + Warn, + Error, +} + +impl From for EnvFilter { + fn from(level: LogLevel) -> Self { + let filter = match level { + LogLevel::Trace => "error,dtmm=trace,sdk=trace", + LogLevel::Debug => "error,dtmm=debug,sdk=debug", + LogLevel::Info => "error,dtmm=info", + LogLevel::Warn => "error,dtmm=warn", + LogLevel::Error => "error", + }; + EnvFilter::new(filter) + } +} + pub struct ChannelWriter { tx: UnboundedSender>, } @@ -32,8 +55,10 @@ impl std::io::Write for ChannelWriter { } } -pub fn create_tracing_subscriber(tx: UnboundedSender>) { - let env_layer = if cfg!(debug_assertions) { +pub fn create_tracing_subscriber(tx: UnboundedSender>, level: Option) { + let env_layer = if let Some(level) = level { + EnvFilter::from(level) + } else if cfg!(debug_assertions) { EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")) } else { EnvFilter::new("error,dtmm=info")