From c6f463179628c68b1f2ed914c433f8bcaeb5a19d Mon Sep 17 00:00:00 2001 From: Aleksei Bavshin Date: Fri, 11 Feb 2022 20:12:38 -0800 Subject: [PATCH] Convert (e)println to log macros Add and configure env_logger --- Cargo.lock | 30 ++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ README.md | 14 +++++++------- etc/swayrd.service | 3 +-- src/bin/swayr.rs | 5 ++++- src/bin/swayrd.rs | 4 ++++ src/cmds.rs | 22 +++++++++++----------- src/demon.rs | 40 ++++++++++++++++++++-------------------- src/layout.rs | 26 ++++++++++++++------------ src/util.rs | 14 +++++++------- 10 files changed, 100 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04b8e02..8dc00e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,6 +90,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "getrandom" version = "0.2.4" @@ -122,6 +135,12 @@ dependencies = [ "libc", ] +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "indexmap" version = "1.8.0" @@ -150,6 +169,15 @@ version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + [[package]] name = "memchr" version = "2.4.1" @@ -370,7 +398,9 @@ version = "0.13.0" dependencies = [ "clap", "directories", + "env_logger", "lazy_static", + "log", "rand", "regex", "rt-format", diff --git a/Cargo.toml b/Cargo.toml index aad3fbe..a6ff4b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,3 +20,5 @@ regex = "1.5.4" lazy_static = "1.4.0" rand = "0.8.4" rt-format = "0.3.0" +log = "0.4" +env_logger = "0.9.0" diff --git a/README.md b/README.md index f04d18d..cf4d8cb 100644 --- a/README.md +++ b/README.md @@ -166,14 +166,14 @@ You need to start the swayr demon `swayrd` in your sway config (`~/.config/sway/config`) like so: ``` -exec env RUST_BACKTRACE=1 swayrd > /tmp/swayrd.log 2>&1 +exec env RUST_BACKTRACE=1 RUST_LOG=swayr=debug swayrd > /tmp/swayrd.log 2>&1 ``` -The setting of `RUST_BACKTRACE=1` and the redirection of the output to some -logfile is optional but helps a lot when something doesn't work. Especially, -if you encounter a crash in certain situations and you want to report a bug, it -would be utmost helpful if you could reproduce the issue with backtrace and -logging and attach that to your bug report. +The setting of `RUST_BACKTRACE=1`, `RUST_LOG=swayr=debug` and the redirection +of the output to some logfile is optional but helps a lot when something +doesn't work. Especially, if you encounter a crash in certain situations and +you want to report a bug, it would be utmost helpful if you could reproduce +the issue with backtrace and logging and attach that to your bug report. Next to starting the demon, you want to bind swayr commands to some keys like so: @@ -183,7 +183,7 @@ bindsym $mod+Space exec env RUST_BACKTRACE=1 \ swayr switch-window >> /tmp/swayr.log 2>&1 bindsym $mod+Delete exec env RUST_BACKTRACE=1 \ - swayr quit-window > /tmp/swayr.log 2>&1 + swayr quit-window >> /tmp/swayr.log 2>&1 bindsym $mod+Tab exec env RUST_BACKTRACE=1 \ swayr switch-to-urgent-or-lru-window >> /tmp/swayr.log 2>&1 diff --git a/etc/swayrd.service b/etc/swayrd.service index 822fcbc..f657a1b 100644 --- a/etc/swayrd.service +++ b/etc/swayrd.service @@ -7,10 +7,9 @@ After=sway-session.target [Service] Type=simple Environment=RUST_BACKTRACE=1 +# Environment=RUST_LOG=swayr=debug ExecStart=/usr/bin/swayrd Restart=on-failure -# Remove or override this to send debug output to the journal -StandardOutput=null [Install] WantedBy=sway-session.target diff --git a/src/bin/swayr.rs b/src/bin/swayr.rs index 9b4b71d..069528a 100644 --- a/src/bin/swayr.rs +++ b/src/bin/swayr.rs @@ -16,6 +16,7 @@ //! The `swayr` binary. use clap::Parser; +use env_logger::Env; /// Windows are sorted urgent first, then windows in LRU order, focused window /// last. Licensed under the GPLv3 (or later). @@ -27,8 +28,10 @@ struct Opts { } fn main() { + env_logger::Builder::from_env(Env::default().default_filter_or("warn")) + .init(); let opts: Opts = Opts::parse(); if let Err(err) = swayr::client::send_swayr_cmd(opts.command) { - eprintln!("Could not send command: {}", err); + log::error!("Could not send command: {}", err); } } diff --git a/src/bin/swayrd.rs b/src/bin/swayrd.rs index 53c1ef1..3a468e0 100644 --- a/src/bin/swayrd.rs +++ b/src/bin/swayrd.rs @@ -15,6 +15,10 @@ //! The `swayrd` binary. +use env_logger::Env; + fn main() { + env_logger::Builder::from_env(Env::default().default_filter_or("warn")) + .init(); swayr::demon::run_demon(); } diff --git a/src/cmds.rs b/src/cmds.rs index 950c180..b8a0564 100644 --- a/src/cmds.rs +++ b/src/cmds.rs @@ -31,11 +31,11 @@ use std::sync::RwLock; use swayipc as s; pub fn run_sway_command_1(cmd: &str) { - println!("Running sway command: {}", cmd); + log::debug!("Running sway command: {}", cmd); match s::Connection::new() { Ok(mut con) => { if let Err(err) = con.run_command(cmd) { - eprintln!("Could not run sway command: {}", err) + log::error!("Could not run sway command: {}", err) } } Err(err) => panic!("{}", err), @@ -482,7 +482,7 @@ pub fn switch_to_urgent_or_lru_window( if let Some(win) = tree.get_windows().get(0) { focus_window_by_id(win.node.id) } else { - println!("No window to switch to.") + log::debug!("No window to switch to.") } } @@ -550,7 +550,7 @@ fn select_and_focus(prompt: &str, choices: &[t::DisplayNode]) { focus_window_by_id(tn.node.id) } t => { - eprintln!("Cannot handle {:?} in select_and_focus", t) + log::error!("Cannot handle {:?} in select_and_focus", t) } }, Err(non_matching_input) => { @@ -613,10 +613,10 @@ fn kill_process_by_pid(pid: Option) { .arg(format!("{}", pid)) .output() { - eprintln!("Error killing process {}: {}", pid, err) + log::error!("Error killing process {}: {}", pid, err) } } else { - eprintln!("Cannot kill window with no pid."); + log::error!("Cannot kill window with no pid."); } } @@ -638,7 +638,7 @@ fn select_and_quit(prompt: &str, choices: &[t::DisplayNode], kill: bool) { } } t => { - eprintln!("Cannot handle {:?} in quit_workspace_or_window", t) + log::error!("Cannot handle {:?} in quit_workspace_or_window", t) } } } @@ -721,7 +721,7 @@ fn select_and_move_focused_to(prompt: &str, choices: &[t::DisplayNode]) { t::Type::Container | t::Type::Window => { move_focused_to_container_or_window(tn.node.id) } - t => eprintln!("Cannot move focused to {:?}", t), + t => log::error!("Cannot move focused to {:?}", t), }, Err(input) => { let ws_name = chop_workspace_shortcut(&input); @@ -765,7 +765,7 @@ pub fn swap_focused_with(extra_props: &HashMap) { &format!("{}", tn.node.id), ]) } - t => eprintln!("Cannot move focused to {:?}", t), + t => log::error!("Cannot move focused to {:?}", t), }, Err(input) => { let ws_name = chop_workspace_shortcut(&input); @@ -914,7 +914,7 @@ fn tile_current_workspace(floating: &ConsiderFloating, shuffle: bool) { }), ) { Ok(_) => (), - Err(err) => eprintln!("Error retiling workspace: {:?}", err), + Err(err) => log::error!("Error retiling workspace: {:?}", err), } } @@ -946,7 +946,7 @@ fn tab_current_workspace(floating: &ConsiderFloating) { }), ) { Ok(_) => (), - Err(err) => eprintln!("Error retiling workspace: {:?}", err), + Err(err) => log::error!("Error retiling workspace: {:?}", err), } } diff --git a/src/demon.rs b/src/demon.rs index 449cd48..15381c4 100644 --- a/src/demon.rs +++ b/src/demon.rs @@ -62,10 +62,10 @@ pub fn monitor_sway_events( } resets += 1; - println!("Connecting to sway for subscribing to events..."); + log::debug!("Connecting to sway for subscribing to events..."); match connect_and_subscribe() { Err(err) => { - eprintln!("Could not connect and subscribe: {}", err); + log::warn!("Could not connect and subscribe: {}", err); std::thread::sleep(std::time::Duration::from_secs(3)); } Ok(iter) => { @@ -94,7 +94,7 @@ pub fn monitor_sway_events( ); } s::Event::Shutdown(sd_ev) => { - println!( + log::debug!( "Sway shuts down with reason '{:?}'.", sd_ev.change ); @@ -103,16 +103,16 @@ pub fn monitor_sway_events( _ => show_extra_props_state = false, }, Err(e) => { - eprintln!("Error while receiving events: {}", e); + log::warn!("Error while receiving events: {}", e); std::thread::sleep(std::time::Duration::from_secs( 3, )); show_extra_props_state = false; - eprintln!("Resetting!"); + log::warn!("Resetting!"); } } if show_extra_props_state { - println!( + log::debug!( "New extra_props state:\n{:#?}", *extra_props.read().unwrap() ); @@ -121,7 +121,7 @@ pub fn monitor_sway_events( } } } - println!("Swayr demon shutting down.") + log::debug!("Swayr demon shutting down.") } fn handle_window_event( @@ -137,28 +137,28 @@ fn handle_window_event( s::WindowChange::Focus => { layout::maybe_auto_tile(config); update_last_focus_tick(container.id, extra_props, focus_val); - println!("Handled window event type {:?}", change); + log::debug!("Handled window event type {:?}", change); true } s::WindowChange::New => { layout::maybe_auto_tile(config); update_last_focus_tick(container.id, extra_props, focus_val); - println!("Handled window event type {:?}", change); + log::debug!("Handled window event type {:?}", change); true } s::WindowChange::Close => { remove_extra_props(container.id, extra_props); layout::maybe_auto_tile(config); - println!("Handled window event type {:?}", change); + log::debug!("Handled window event type {:?}", change); true } s::WindowChange::Move | s::WindowChange::Floating => { layout::maybe_auto_tile(config); - println!("Handled window event type {:?}", change); + log::debug!("Handled window event type {:?}", change); false // We don't affect the extra_props state here. } _ => { - println!("Unhandled window event type {:?}", change); + log::debug!("Unhandled window event type {:?}", change); false } } @@ -184,7 +184,7 @@ fn handle_workspace_event( extra_props, focus_val, ); - println!("Handled workspace event type {:?}", change); + log::debug!("Handled workspace event type {:?}", change); true } s::WorkspaceChange::Empty => { @@ -192,7 +192,7 @@ fn handle_workspace_event( current.expect("No current in Empty workspace event").id, extra_props, ); - println!("Handled workspace event type {:?}", change); + log::debug!("Handled workspace event type {:?}", change); true } _ => false, @@ -229,8 +229,8 @@ pub fn serve_client_requests( extra_props: Arc>>, ) { match std::fs::remove_file(util::get_swayr_socket_path()) { - Ok(()) => println!("Deleted stale socket from previous run."), - Err(e) => eprintln!("Could not delete socket:\n{:?}", e), + Ok(()) => log::debug!("Deleted stale socket from previous run."), + Err(e) => log::error!("Could not delete socket:\n{:?}", e), } match UnixListener::bind(util::get_swayr_socket_path()) { @@ -241,14 +241,14 @@ pub fn serve_client_requests( handle_client_request(stream, extra_props.clone()); } Err(err) => { - eprintln!("Error handling client request: {}", err); + log::error!("Error handling client request: {}", err); break; } } } } Err(err) => { - eprintln!("Could not bind socket: {}", err) + log::error!("Could not bind socket: {}", err) } } } @@ -265,12 +265,12 @@ fn handle_client_request( extra_props, }); } else { - eprintln!( + log::error!( "Could not serialize following string to SwayrCommand.\n{}", cmd_str ); } } else { - eprintln!("Could not read command from client."); + log::error!("Could not read command from client."); } } diff --git a/src/layout.rs b/src/layout.rs index f00f512..07b4b15 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -26,7 +26,7 @@ pub fn auto_tile(res_to_min_width: &HashMap) { if let Ok(mut con) = s::Connection::new() { if let Ok(tree) = con.get_tree() { for output in &tree.nodes { - println!("output: {:?}", output.name); + log::debug!("output: {:?}", output.name); // Assert our assumption that all children of the tree's root // must be outputs. @@ -46,10 +46,10 @@ pub fn auto_tile(res_to_min_width: &HashMap) { t == t::Type::Workspace || t == t::Type::Container }) { if container.is_scratchpad() { - println!(" Skipping scratchpad"); + log::debug!(" Skipping scratchpad"); continue; } - println!( + log::debug!( " container: {:?}, layout {:?}, {} nodes", container.node_type, container.layout, @@ -63,7 +63,7 @@ pub fn auto_tile(res_to_min_width: &HashMap) { // Width if we'd split once more. let estimated_width = child_win.rect.width as f32 / 2.0; - println!( + log::debug!( " child_win: {:?}, estimated width after splith {} px", child_win.app_id, estimated_width ); @@ -81,7 +81,7 @@ pub fn auto_tile(res_to_min_width: &HashMap) { }; if let Some(split) = split { - println!( + log::debug!( "Auto-tiling performing {} on window {} \ because estimated width after another \ split is {} and the minimum window width \ @@ -96,36 +96,38 @@ pub fn auto_tile(res_to_min_width: &HashMap) { child_win.id, split )) { Ok(_) => (), - Err(e) => eprintln!( + Err(e) => log::error!( "Couldn't set {} on con {}: {:?}", - split, child_win.id, e + split, + child_win.id, + e ), } } } } } else { - eprintln!("No layout.auto_tile_min_window_width_per_output_width \ + log::error!("No layout.auto_tile_min_window_width_per_output_width \ setting for output_width {}", output_width); } } } else { - eprintln!("Couldn't call get_tree during auto_tile."); + log::error!("Couldn't call get_tree during auto_tile."); } } else { - eprintln!("Couldn't get connection for auto_tile"); + log::error!("Couldn't get connection for auto_tile"); } } pub fn maybe_auto_tile(config: &config::Config) { if config.is_layout_auto_tile() { - println!("\nauto_tile: start"); + log::debug!("\nauto_tile: start"); auto_tile( &config .get_layout_auto_tile_min_window_width_per_output_width_as_map( ), ); - println!("auto_tile: end\n"); + log::debug!("auto_tile: end\n"); } } diff --git a/src/util.rs b/src/util.rs index 6c7f50c..bf286c3 100644 --- a/src/util.rs +++ b/src/util.rs @@ -34,14 +34,14 @@ pub fn get_swayr_socket_path() -> String { match xdg_runtime_dir { Ok(val) => val, Err(_e) => { - eprintln!("Couldn't get XDG_RUNTIME_DIR!"); + log::error!("Couldn't get XDG_RUNTIME_DIR!"); String::from("/tmp") } }, match wayland_display { Ok(val) => val, Err(_e) => { - eprintln!("Couldn't get WAYLAND_DISPLAY!"); + log::error!("Couldn't get WAYLAND_DISPLAY!"); String::from("unknown") } } @@ -96,7 +96,7 @@ fn desktop_entries() -> Vec> { fn find_icon(icon_name: &str, icon_dirs: &[String]) -> Option> { let p = p::Path::new(icon_name); if p.is_file() { - println!("(1) Icon name '{}' -> {}", icon_name, p.display()); + log::debug!("(1) Icon name '{}' -> {}", icon_name, p.display()); return Some(p.to_path_buf().into_boxed_path()); } @@ -106,7 +106,7 @@ fn find_icon(icon_name: &str, icon_dirs: &[String]) -> Option> { pb.push(icon_name.to_owned() + "." + ext); let icon_file = pb.as_path(); if icon_file.is_file() { - println!( + log::debug!( "(2) Icon name '{}' -> {}", icon_name, icon_file.display() @@ -116,7 +116,7 @@ fn find_icon(icon_name: &str, icon_dirs: &[String]) -> Option> { } } - println!("(3) No icon for name {}", icon_name); + log::debug!("(3) No icon for name {}", icon_name); None } @@ -187,7 +187,7 @@ fn get_app_id_to_icon_map( } } - println!( + log::debug!( "Desktop entries to icon files ({} entries):\n{:#?}", map.len(), map @@ -278,7 +278,7 @@ where .as_mut() .expect("Failed to open the menu program's stdin"); let input = strs.join("\n"); - //println!("Menu program {} input:\n{}", menu_exec, input); + //log::debug!("Menu program {} input:\n{}", menu_exec, input); stdin .write_all(input.as_bytes()) .expect("Failed to write to the menu program's stdin");