summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorcyqsimon <28627918+cyqsimon@users.noreply.github.com>2023-10-11 18:16:56 +0800
committerGitHub <noreply@github.com>2023-10-11 18:16:56 +0800
commit94ada5db8a8d82194a7f1dd05694fc4e2a8fc78b (patch)
treee819a44e34c1a62c99dba83d6d935ae117cd8ddb /src
parent5cb09cca196a3a23ad059dc163ce3ceb540cf894 (diff)
Add logging infrastructure (#302)
* Add logging dependencies * Initialise logging
Diffstat (limited to 'src')
-rw-r--r--src/cli.rs15
-rw-r--r--src/main.rs14
2 files changed, 26 insertions, 3 deletions
diff --git a/src/cli.rs b/src/cli.rs
index e466af9..5e1a0e2 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -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);