diff options
author | cyqsimon <28627918+cyqsimon@users.noreply.github.com> | 2023-10-11 18:16:56 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-11 18:16:56 +0800 |
commit | 94ada5db8a8d82194a7f1dd05694fc4e2a8fc78b (patch) | |
tree | e819a44e34c1a62c99dba83d6d935ae117cd8ddb /src | |
parent | 5cb09cca196a3a23ad059dc163ce3ceb540cf894 (diff) |
Add logging infrastructure (#302)
* Add logging dependencies
* Initialise logging
Diffstat (limited to 'src')
-rw-r--r-- | src/cli.rs | 15 | ||||
-rw-r--r-- | src/main.rs | 14 |
2 files changed, 26 insertions, 3 deletions
@@ -1,8 +1,11 @@ -use std::net::Ipv4Addr; +use std::{net::Ipv4Addr, path::PathBuf}; use clap::{Args, Parser}; +use clap_verbosity_flag::{InfoLevel, Verbosity}; +use derivative::Derivative; -#[derive(Clone, Debug, Default, Parser)] +#[derive(Clone, Debug, Derivative, Parser)] +#[derivative(Default)] #[command(name = "bandwhich", version)] pub struct Opt { #[arg(short, long)] @@ -25,6 +28,14 @@ pub struct Opt { /// A dns server ip to use instead of the system default pub dns_server: Option<Ipv4Addr>, + #[arg(long)] + /// Enable logging to a file + pub log_to: Option<PathBuf>, + + #[command(flatten)] + #[derivative(Default(value = "Verbosity::new(0, 0)"))] + pub verbosity: Verbosity<InfoLevel>, + #[command(flatten)] pub render_opts: RenderOpts, } diff --git a/src/main.rs b/src/main.rs index 2ba7f97..f55a116 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,7 @@ mod tests; use std::{ collections::HashMap, + fs::File, sync::{ atomic::{AtomicBool, AtomicUsize, Ordering}, Arc, Mutex, RwLock, @@ -29,6 +30,7 @@ use network::{ }; use pnet::datalink::{DataLinkReceiver, NetworkInterface}; use ratatui::backend::{Backend, CrosstermBackend}; +use simplelog::WriteLogger; use crate::cli::Opt; @@ -36,8 +38,18 @@ const DISPLAY_DELTA: Duration = Duration::from_millis(1000); fn main() -> anyhow::Result<()> { let opts = Opt::parse(); - let os_input = os::get_input(opts.interface.as_deref(), !opts.no_resolve, opts.dns_server)?; + // init logging + if let Some(ref log_path) = opts.log_to { + let log_file = File::options().create_new(true).open(log_path)?; + WriteLogger::init( + opts.verbosity.log_level_filter(), + Default::default(), + log_file, + )?; + } + + let os_input = os::get_input(opts.interface.as_deref(), !opts.no_resolve, opts.dns_server)?; if opts.raw { let terminal_backend = RawTerminalBackend {}; start(terminal_backend, os_input, opts); |