From 43dc66c25e9a4db6d1ec48245b48f82b837c7663 Mon Sep 17 00:00:00 2001 From: Federico Terzi Date: Sat, 14 Sep 2019 22:54:16 +0200 Subject: [PATCH] Improve logging. Add log subcommand --- Cargo.lock | 18 +++++++++++--- Cargo.toml | 2 ++ src/main.rs | 59 +++++++++++++++++++++++++++++++++++++++++--- src/protocol/unix.rs | 4 +-- src/ui/windows.rs | 2 +- 5 files changed, 75 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2103613..f02183a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,7 +50,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", @@ -225,12 +225,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "espanso" version = "0.1.0" dependencies = [ + "backtrace 0.3.37 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "cmake 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "fs2 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log-panics 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -246,7 +248,7 @@ name = "failure" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.37 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -323,6 +325,15 @@ dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "log-panics" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.37 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "memchr" version = "2.2.1" @@ -741,7 +752,7 @@ dependencies = [ "checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba" "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" "checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875" -"checksum backtrace 0.3.36 (registry+https://github.com/rust-lang/crates.io-index)" = "e43b13e6ad6177777669f60f642e26307b44676392fae3610676edb54073681d" +"checksum backtrace 0.3.37 (registry+https://github.com/rust-lang/crates.io-index)" = "5180c5a20655b14a819b652fd2378fa5f1697b6c9ddad3e695c2f9cedf6df4e2" "checksum backtrace-sys 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "82a830b4ef2d1124a711c71d263c5abdc710ef8e907bd508c88be475cebc422b" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" @@ -773,6 +784,7 @@ dependencies = [ "checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +"checksum log-panics 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ae0136257df209261daa18d6c16394757c63e032e27aafd8b07788b051082bef" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" "checksum miniz_oxide 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7108aff85b876d06f22503dcce091e29f76733b2bfdd91eebce81f5e68203a10" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" diff --git a/Cargo.toml b/Cargo.toml index dfe9d1e..ec21038 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,8 @@ simplelog = "0.7.1" zip = "0.5.3" fs2 = "0.4.3" serde_json = "1.0.40" +log-panics = {version = "2.0.0", features = ["with-backtrace"]} +backtrace = "0.3.37" [target.'cfg(unix)'.dependencies] libc = "0.2.62" diff --git a/src/main.rs b/src/main.rs index eecceeb..86adb86 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ use std::time::Duration; use clap::{App, Arg, SubCommand, ArgMatches}; use fs2::FileExt; use log::{error, info, warn, LevelFilter}; -use simplelog::{CombinedLogger, SharedLogger, TerminalMode, TermLogger}; +use simplelog::{CombinedLogger, SharedLogger, TerminalMode, TermLogger, WriteLogger}; use crate::config::ConfigSet; use crate::config::runtime::RuntimeConfigManager; @@ -20,6 +20,7 @@ use crate::matcher::scrolling::ScrollingMatcher; use crate::system::SystemManager; use crate::ui::UIManager; use crate::protocol::*; +use std::io::{BufReader, BufRead}; mod ui; mod event; @@ -34,6 +35,7 @@ mod protocol; mod clipboard; const VERSION: &'static str = env!("CARGO_PKG_VERSION"); +const LOG_FILE: &str = "espanso.log"; fn main() { let matches = App::new("espanso") @@ -67,6 +69,8 @@ fn main() { .about("Tool to detect current window properties, to simplify filters creation.")) .subcommand(SubCommand::with_name("daemon") .about("Start the daemon without spawning a new process.")) + .subcommand(SubCommand::with_name("log") + .about("Print the latest daemon logs.")) .subcommand(SubCommand::with_name("start") .about("Start the daemon spawning a new process in the background.")) .subcommand(SubCommand::with_name("stop") @@ -122,6 +126,11 @@ fn main() { return; } + if let Some(_) = matches.subcommand_matches("log") { + log_main(); + return; + } + if let Some(_) = matches.subcommand_matches("start") { start_main(config_set); return; @@ -168,20 +177,35 @@ fn daemon_main(config_set: ConfigSet) { log_outputs.push(terminal_out); } - //TODO: WriteLogger::new(LevelFilter::Info, Config::default(), File::create("my_rust_binary.log").unwrap()), + // Initialize log file output + let espanso_dir = context::get_data_dir(); + let log_file_path = espanso_dir.join(LOG_FILE); + let log_file = OpenOptions::new() + .read(true) + .write(true) + .create(true) + .truncate(true) + .open(log_file_path) + .expect("Cannot create log file."); + let file_out = WriteLogger::new(LevelFilter::Info, simplelog::Config::default(), log_file); + log_outputs.push(file_out); + CombinedLogger::init( log_outputs ).expect("Error opening log destination"); + // Activate logging for panics + log_panics::init(); + info!("starting daemon..."); let (send_channel, receive_channel) = mpsc::channel(); let context = context::new(send_channel.clone()); - thread::spawn(move || { + thread::Builder::new().name("daemon_background".to_string()).spawn(move || { daemon_background(receive_channel, config_set); - }); + }).expect("Unable to spawn daemon background thread"); let ipc_server = protocol::get_ipc_server(send_channel.clone()); ipc_server.start(); @@ -293,6 +317,7 @@ fn stop_main(config_set: ConfigSet) { } } +/// Kill the daemon if running and start it again fn restart_main(config_set: ConfigSet) { // Kill the daemon if running let lock_file = acquire_lock(); @@ -346,6 +371,7 @@ fn detect_main() { } } +/// Send the given command to the espanso daemon fn cmd_main(config_set: ConfigSet, matches: &ArgMatches) { let command = if let Some(_) = matches.subcommand_matches("exit") { Some(IPCCommand { @@ -389,6 +415,31 @@ fn send_command(config_set: ConfigSet, command: IPCCommand) -> Result<(), String ipc_client.send_command(command) } +fn log_main() { + let espanso_dir = context::get_data_dir(); + let log_file_path = espanso_dir.join(LOG_FILE); + + if !log_file_path.exists() { + println!("No log file found."); + exit(2); + } + + let log_file = File::open(log_file_path); + if let Ok(log_file) = log_file { + let reader = BufReader::new(log_file); + for line in reader.lines() { + if let Ok(line) = line { + println!("{}", line); + } + } + + exit(0); + }else{ + println!("Error reading log file"); + exit(1); + } +} + fn acquire_lock() -> Option { let espanso_dir = context::get_data_dir(); let lock_file_path = espanso_dir.join("espanso.lock"); diff --git a/src/protocol/unix.rs b/src/protocol/unix.rs index cca977c..c965408 100644 --- a/src/protocol/unix.rs +++ b/src/protocol/unix.rs @@ -23,7 +23,7 @@ impl UnixIPCServer { impl super::IPCServer for UnixIPCServer { fn start(&self) { let event_channel = self.event_channel.clone(); - std::thread::spawn(move || { + std::thread::Builder::new().name("ipc_server".to_string()).spawn(move || { let espanso_dir = context::get_data_dir(); let unix_socket = espanso_dir.join(UNIX_SOCKET_NAME); @@ -62,7 +62,7 @@ impl super::IPCServer for UnixIPCServer { } } } - }); + }).expect("Unable to spawn IPC server thread"); } } diff --git a/src/ui/windows.rs b/src/ui/windows.rs index dc6c53c..0a6f397 100644 --- a/src/ui/windows.rs +++ b/src/ui/windows.rs @@ -26,7 +26,7 @@ impl super::UIManager for WindowsUIManager { // Setup a timeout to close the notification let id = Arc::clone(&self.id); - thread::spawn(move || { + thread::Builder::new().name("notification_thread".to_string()).spawn(move || { for i in 1..10 { let duration = time::Duration::from_millis(200); thread::sleep(duration);