From 4fa7d51489db47f9d9105b4440f67fe9e526c08a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Fri, 15 Sep 2023 21:53:24 +0200 Subject: [PATCH] Handsome logger --- Cargo.lock | 48 +++++++++++++++++++++++++++++++++++ czkawka_cli/Cargo.toml | 3 +++ czkawka_cli/src/main.rs | 3 +++ czkawka_core/Cargo.toml | 3 +++ czkawka_core/src/duplicate.rs | 24 ++++++++++++++++++ czkawka_gui/Cargo.toml | 3 +++ czkawka_gui/src/main.rs | 2 ++ 7 files changed, 86 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 45f6028..7d634a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -520,7 +520,9 @@ version = "6.0.0" dependencies = [ "clap", "czkawka_core", + "handsome_logger", "image_hasher", + "log", ] [[package]] @@ -539,6 +541,7 @@ dependencies = [ "ffmpeg_cmdline_utils", "futures", "hamming", + "handsome_logger", "humansize", "i18n-embed", "i18n-embed-fl", @@ -549,6 +552,7 @@ dependencies = [ "libheif-rs", "libheif-sys", "lofty", + "log", "mime_guess", "num_cpus", "once_cell", @@ -580,11 +584,13 @@ dependencies = [ "gdk4", "glib", "gtk4", + "handsome_logger", "humansize", "i18n-embed", "i18n-embed-fl", "image", "image_hasher", + "log", "once_cell", "open", "regex", @@ -1348,6 +1354,17 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65043da274378d68241eb9a8f8f8aa54e349136f7b8e12f63e3ef44043cc30e1" +[[package]] +name = "handsome_logger" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cd219376bdbd869ce764bf83e45407ef1a640503e2927605e8524575fda474" +dependencies = [ + "log", + "termcolor", + "time", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1951,6 +1968,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -3001,6 +3027,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.48" @@ -3049,8 +3084,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" dependencies = [ "deranged", + "itoa", + "libc", + "num_threads", "serde", "time-core", + "time-macros", ] [[package]] @@ -3059,6 +3098,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +[[package]] +name = "time-macros" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" +dependencies = [ + "time-core", +] + [[package]] name = "tinystr" version = "0.7.1" diff --git a/czkawka_cli/Cargo.toml b/czkawka_cli/Cargo.toml index 84adbc1..4432205 100644 --- a/czkawka_cli/Cargo.toml +++ b/czkawka_cli/Cargo.toml @@ -15,6 +15,9 @@ clap = { version = "4.3", features = ["derive"] } # For enum types image_hasher = "1.2" +log = "0.4.20" +handsome_logger = "0.6.0" + [dependencies.czkawka_core] path = "../czkawka_core" version = "6.0.0" diff --git a/czkawka_cli/src/main.rs b/czkawka_cli/src/main.rs index a705a57..033d74b 100644 --- a/czkawka_cli/src/main.rs +++ b/czkawka_cli/src/main.rs @@ -3,6 +3,7 @@ use std::process; use clap::Parser; +use handsome_logger::{ColorChoice, Config, ConfigBuilder, LevelFilter, TerminalMode}; use commands::Commands; use czkawka_core::bad_extensions::BadExtensions; @@ -30,6 +31,8 @@ mod commands; fn main() { let command = Args::parse().command; + handsome_logger::TermLogger::init(ConfigBuilder::default().set_level(LevelFilter::Debug).build(), TerminalMode::Mixed, ColorChoice::Always).unwrap(); + #[cfg(debug_assertions)] println!("{command:?}"); diff --git a/czkawka_core/Cargo.toml b/czkawka_core/Cargo.toml index 506497b..4aa82a3 100644 --- a/czkawka_core/Cargo.toml +++ b/czkawka_core/Cargo.toml @@ -79,6 +79,9 @@ anyhow = { version = "1.0" } state = "0.6" +log = "0.4.20" +handsome_logger = "0.6.0" + [features] default = [] heif = ["dep:libheif-rs", "dep:libheif-sys"] diff --git a/czkawka_core/src/duplicate.rs b/czkawka_core/src/duplicate.rs index 47e9e0b..ca61593 100644 --- a/czkawka_core/src/duplicate.rs +++ b/czkawka_core/src/duplicate.rs @@ -15,6 +15,7 @@ use std::{fs, mem}; use crossbeam_channel::Receiver; use futures::channel::mpsc::UnboundedSender; use humansize::{format_size, BINARY}; +use log::debug; use rayon::prelude::*; use xxhash_rust::xxh3::Xxh3; @@ -505,6 +506,7 @@ impl DuplicateFinder { /// Read file length and puts it to different boxes(each for different lengths) /// If in box is only 1 result, then it is removed fn check_files_size(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&UnboundedSender>) -> bool { + debug!("check_file_size - start"); let max_stage = match self.check_method { CheckingMethod::Size => 0, CheckingMethod::Hash => 2, @@ -525,6 +527,7 @@ impl DuplicateFinder { .maximal_file_size(self.maximal_file_size) .build() .run(); + debug!("check_file_size - after finding file sizes"); match result { DirTraversalResult::SuccessFiles { grouped_file_entries, warnings } => { self.files_with_identical_size = grouped_file_entries; @@ -548,6 +551,7 @@ impl DuplicateFinder { self.filter_reference_folders_by_size(); self.calculate_size_stats(); + debug!("check_file_size - after calculating size stats/duplicates"); true } DirTraversalResult::SuccessFolders { .. } => { @@ -606,6 +610,7 @@ impl DuplicateFinder { let mut non_cached_files_to_check: BTreeMap> = Default::default(); if self.use_prehash_cache { + debug!("prehash_load_cache_at_start - using prehash cache start"); loaded_hash_map = match load_hashes_from_file(&mut self.text_messages, self.delete_outdated_cache, &self.hash_type, true) { Some(t) => t, None => Default::default(), @@ -634,15 +639,19 @@ impl DuplicateFinder { } } } + debug!("prehash_load_cache_at_start - using prehash cache end"); } else { + debug!("prehash_load_cache_at_start - not using prehash cache start"); loaded_hash_map = Default::default(); mem::swap(&mut self.files_with_identical_size, &mut non_cached_files_to_check); + debug!("prehash_load_cache_at_start - not using prehash cache end"); } (loaded_hash_map, records_already_cached, non_cached_files_to_check) } fn prehash_save_cache_at_exit(&mut self, loaded_hash_map: BTreeMap>, pre_hash_results: &Vec<(u64, BTreeMap>, Vec)>) { if self.use_prehash_cache { + debug!("prehash_save_cache_at_exit - saving prehash cache start"); // All results = records already cached + computed results let mut save_cache_to_hashmap: BTreeMap = Default::default(); @@ -665,6 +674,7 @@ impl DuplicateFinder { } save_hashes_to_file(&save_cache_to_hashmap, &mut self.text_messages, &self.hash_type, true, self.minimal_prehash_cache_file_size); + debug!("prehash_save_cache_at_exit - saving prehash cache end"); } } @@ -674,6 +684,7 @@ impl DuplicateFinder { progress_sender: Option<&UnboundedSender>, pre_checked_map: &mut BTreeMap>, ) -> Option<()> { + debug!("prehashing - start"); let check_type = self.hash_type; let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = prepare_thread_handler_common( progress_sender, @@ -712,7 +723,9 @@ impl DuplicateFinder { .while_some() .collect(); + debug!("prehashing - ended prehashing, start sending info to progress thread"); send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); + debug!("prehashing - ended prehashing, got info about progress thread end"); // Check if user aborted search(only from GUI) if check_was_stopped.load(Ordering::Relaxed) { @@ -736,6 +749,7 @@ impl DuplicateFinder { self.prehash_save_cache_at_exit(loaded_hash_map, &pre_hash_results); + debug!("prehashing - end"); Some(()) } @@ -743,11 +757,13 @@ impl DuplicateFinder { &mut self, mut pre_checked_map: BTreeMap>, ) -> (BTreeMap>, BTreeMap>, BTreeMap>) { + debug!("full_hashing_load_cache_at_start - start"); let loaded_hash_map; let mut records_already_cached: BTreeMap> = Default::default(); let mut non_cached_files_to_check: BTreeMap> = Default::default(); if self.use_cache { + debug!("full_hashing_load_cache_at_start - using cache"); loaded_hash_map = match load_hashes_from_file(&mut self.text_messages, self.delete_outdated_cache, &self.hash_type, false) { Some(t) => t, None => Default::default(), @@ -778,9 +794,11 @@ impl DuplicateFinder { } } } else { + debug!("full_hashing_load_cache_at_start - not using cache"); loaded_hash_map = Default::default(); mem::swap(&mut pre_checked_map, &mut non_cached_files_to_check); } + debug!("full_hashing_load_cache_at_start - end"); (loaded_hash_map, records_already_cached, non_cached_files_to_check) } @@ -790,6 +808,7 @@ impl DuplicateFinder { full_hash_results: &mut Vec<(u64, BTreeMap>, Vec)>, loaded_hash_map: BTreeMap>, ) { + debug!("full_hashing_save_cache_at_exit - start"); if !self.use_cache { return; } @@ -826,6 +845,7 @@ impl DuplicateFinder { } } save_hashes_to_file(&all_results, &mut self.text_messages, &self.hash_type, false, self.minimal_cache_file_size); + debug!("full_hashing_save_cache_at_exit - end"); } fn full_hashing( @@ -834,6 +854,7 @@ impl DuplicateFinder { progress_sender: Option<&UnboundedSender>, pre_checked_map: BTreeMap>, ) -> Option<()> { + debug!("full_hashing - start"); let check_type = self.hash_type; let (progress_thread_handle, progress_thread_run, atomic_counter, check_was_stopped) = @@ -872,7 +893,9 @@ impl DuplicateFinder { self.full_hashing_save_cache_at_exit(records_already_cached, &mut full_hash_results, loaded_hash_map); + debug!("full_hashing - starting sending info to progress thread"); send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); + debug!("full_hashing - after sending info to progress thread"); // Break if stop was clicked after saving to cache if check_was_stopped.load(Ordering::Relaxed) { @@ -889,6 +912,7 @@ impl DuplicateFinder { } } + debug!("full_hashing - end"); Some(()) } diff --git a/czkawka_gui/Cargo.toml b/czkawka_gui/Cargo.toml index 4427dbb..6d81700 100644 --- a/czkawka_gui/Cargo.toml +++ b/czkawka_gui/Cargo.toml @@ -49,6 +49,9 @@ i18n-embed-fl = "0.7" rust-embed = "8.0.0" once_cell = "1.18" +log = "0.4.20" +handsome_logger = "0.6.0" + [target.'cfg(windows)'.dependencies] winapi = { version = "0.3.9", features = ["combaseapi", "objbase", "shobjidl_core", "windef", "winerror", "wtypesbase", "winuser"] } diff --git a/czkawka_gui/src/main.rs b/czkawka_gui/src/main.rs index 318289a..33b3de3 100644 --- a/czkawka_gui/src/main.rs +++ b/czkawka_gui/src/main.rs @@ -14,6 +14,7 @@ use glib::Priority; use gtk4::gio::ApplicationFlags; use gtk4::prelude::*; use gtk4::Application; +use handsome_logger::{ColorChoice, ConfigBuilder, LevelFilter, TerminalMode}; use connect_things::connect_about_buttons::*; use connect_things::connect_button_compare::*; @@ -71,6 +72,7 @@ mod tests; fn main() { let application = Application::new(None::, ApplicationFlags::HANDLES_OPEN | ApplicationFlags::HANDLES_COMMAND_LINE); application.connect_command_line(move |app, cmdline| { + handsome_logger::TermLogger::init(ConfigBuilder::default().set_level(LevelFilter::Debug).build(), TerminalMode::Mixed, ColorChoice::Always).unwrap(); build_ui(app, &cmdline.arguments()); 0 });