diff options
Diffstat (limited to 'mullvad_daemon/src')
| -rw-r--r-- | mullvad_daemon/src/cli.rs | 45 | ||||
| -rw-r--r-- | mullvad_daemon/src/main.rs | 46 |
2 files changed, 87 insertions, 4 deletions
diff --git a/mullvad_daemon/src/cli.rs b/mullvad_daemon/src/cli.rs new file mode 100644 index 0000000000..670a2bf28b --- /dev/null +++ b/mullvad_daemon/src/cli.rs @@ -0,0 +1,45 @@ +use clap::{App, Arg}; +use log; + +use std::path::PathBuf; + +pub struct Config { + pub log_level: log::LogLevelFilter, + pub log_file: Option<PathBuf>, +} + +pub fn get_config() -> Config { + let app = create_app(); + let matches = app.get_matches(); + + let log_level = match matches.occurrences_of("v") { + 0 => log::LogLevelFilter::Info, + 1 => log::LogLevelFilter::Debug, + _ => log::LogLevelFilter::Trace, + }; + let log_file = matches.value_of_os("log_file").map(PathBuf::from); + + Config { + log_level, + log_file, + } +} + +fn create_app() -> App<'static, 'static> { + App::new(::CRATE_NAME) + .version(crate_version!()) + .author(crate_authors!()) + .about(crate_description!()) + .arg( + Arg::with_name("v") + .short("v") + .multiple(true) + .help("Sets the level of verbosity."), + ) + .arg( + Arg::with_name("log_file") + .long("log") + .takes_value(true) + .help("Activates file logging to the given path"), + ) +} diff --git a/mullvad_daemon/src/main.rs b/mullvad_daemon/src/main.rs index 51bf264465..74d6801cff 100644 --- a/mullvad_daemon/src/main.rs +++ b/mullvad_daemon/src/main.rs @@ -1,8 +1,11 @@ #[macro_use] +extern crate clap; +extern crate chrono; +#[macro_use] extern crate log; -extern crate env_logger; #[macro_use] extern crate error_chain; +extern crate fern; extern crate serde; #[macro_use] @@ -21,6 +24,7 @@ extern crate mullvad_types; extern crate talpid_core; extern crate talpid_ipc; +mod cli; mod management_interface; mod rpc_info; mod shutdown; @@ -29,6 +33,7 @@ use management_interface::{ManagementInterfaceServer, TunnelCommand}; use mullvad_types::states::{DaemonState, SecurityState, TargetState}; use std::io; +use std::path::PathBuf; use std::sync::{Arc, Mutex, mpsc}; use std::thread; @@ -67,6 +72,8 @@ lazy_static! { ]; } +static CRATE_NAME: &str = "mullvadd"; + /// All events that can happen in the daemon. Sent from various threads and exposed interfaces. pub enum DaemonEvent { @@ -452,7 +459,8 @@ fn log_error<E>(error: &E) quick_main!(run); fn run() -> Result<()> { - init_logger()?; + let config = cli::get_config(); + init_logger(config.log_level, config.log_file.as_ref())?; let daemon = Daemon::new().chain_err(|| "Unable to initialize daemon")?; @@ -466,6 +474,36 @@ fn run() -> Result<()> { Ok(()) } -fn init_logger() -> Result<()> { - env_logger::init().chain_err(|| "Failed to bootstrap logging system") +fn init_logger(log_level: log::LogLevelFilter, log_file: Option<&PathBuf>) -> Result<()> { + let silenced_crates = [ + "jsonrpc_core", + "tokio_core", + "jsonrpc_ws_server", + "ws", + "mio", + ]; + let mut config = fern::Dispatch::new() + .format( + |out, message, record| { + out.finish( + format_args!( + "{}[{}][{}] {}", + chrono::Local::now().format("[%Y-%m-%d %H:%M:%S]"), + record.target(), + record.level(), + message + ), + ) + }, + ) + .level(log_level) + .chain(std::io::stdout()); + for silenced_crate in &silenced_crates { + config = config.level_for(*silenced_crate, log::LogLevelFilter::Warn); + } + if let Some(ref log_file) = log_file { + let f = fern::log_file(log_file).chain_err(|| "Failed to open log file for writing")?; + config = config.chain(f); + } + config.apply().chain_err(|| "Failed to bootstrap logging system") } |
