Преглед изворни кода

wallet: add file rotated logs for all platforms

darkfi пре 1 година
родитељ
комит
8212043bab

+ 3 - 3
bin/darkwallet/Cargo.toml

@@ -45,6 +45,9 @@ chrono = "0.4.38"
 async-gen = "0.2"
 async-trait = "0.1.82"
 blake3 = "1.5.4"
+simplelog = "0.12.1"
+# For log files
+file-rotate = "0.7.6"
 
 [patch.crates-io]
 freetype-rs = { git = "https://github.com/narodnik/freetype-rs" }
@@ -61,9 +64,6 @@ android_logger = "0.13.3"
 #rusqlite = {version = "0.31.0", features = ["bundled"]}
 tor-dirmgr = {version="0.21.0", features=["static"]}
 
-[target.'cfg(target_os = "linux")'.dependencies]
-simplelog = "0.12.1"
-
 [package.metadata.android.activity_attributes]
 "android:exported" = "true"
 "android:windowSoftInputMode" = "adjustResize"

+ 1 - 1
bin/darkwallet/src/darkirc2.rs

@@ -57,7 +57,7 @@ use crate::{
 
 #[cfg(target_os = "android")]
 const EVGRDB_PATH: &str = "/data/data/darkfi.darkwallet/evgr/";
-#[cfg(target_os = "linux")]
+#[cfg(not(target_os = "android"))]
 const EVGRDB_PATH: &str = "~/.local/darkfi/darkwallet/evgr/";
 
 //const ENDPOINT: &str = "tcp://agorism.dev:25588";

+ 113 - 0
bin/darkwallet/src/logger.rs

@@ -0,0 +1,113 @@
+use darkfi::util::path::expand_path;
+use file_rotate::{compression::Compression, suffix::AppendCount, ContentLimit, FileRotate};
+use log::{Level, LevelFilter, Log, Metadata, Record};
+use simplelog::{
+    ColorChoice, CombinedLogger, Config, ConfigBuilder, SharedLogger, TermLogger, TerminalMode,
+    WriteLogger,
+};
+use std::{thread::sleep, time::Duration};
+
+const LOGS_ENABLED: bool = true;
+
+#[cfg(target_os = "android")]
+const LOGFILE_PATH: &str = "/sdcard/Download/darkwallet.log";
+#[cfg(not(target_os = "android"))]
+const LOGFILE_PATH: &str = "~/.local/darkfi/darkwallet.log";
+
+#[cfg(target_os = "android")]
+mod android {
+    use super::*;
+    use android_logger::{AndroidLogger, Config as AndroidConfig};
+
+    /// Implements a wrapper around the android logger so it's compatible with simplelog.
+    pub struct AndroidLoggerWrapper {
+        logger: AndroidLogger,
+        level: LevelFilter,
+        config: Config,
+    }
+
+    impl AndroidLoggerWrapper {
+        pub fn new(level: LevelFilter, config: Config) -> Box<Self> {
+            let cfg = AndroidConfig::default().with_max_level(level).with_tag("darkfi");
+            Box::new(Self { logger: AndroidLogger::new(cfg), level, config })
+        }
+    }
+
+    impl Log for AndroidLoggerWrapper {
+        fn enabled(&self, metadata: &Metadata<'_>) -> bool {
+            let target = metadata.target();
+            if target.starts_with("sled") || target.starts_with("rustls") {
+                return false
+            }
+            if metadata.level() > self.level {
+                return false
+            }
+            self.logger.enabled(metadata)
+        }
+
+        fn log(&self, record: &Record<'_>) {
+            if self.enabled(record.metadata()) {
+                self.logger.log(record)
+            }
+        }
+
+        fn flush(&self) {}
+    }
+
+    impl SharedLogger for AndroidLoggerWrapper {
+        fn level(&self) -> LevelFilter {
+            self.level
+        }
+
+        fn config(&self) -> Option<&Config> {
+            Some(&self.config)
+        }
+
+        fn as_log(self: Box<Self>) -> Box<dyn Log> {
+            Box::new(*self)
+        }
+    }
+}
+
+pub fn setup_logging() {
+    // https://gist.github.com/jb-alvarado/6e223936446bb88cd9a93e7028fc2c4f
+    let mut loggers: Vec<Box<dyn SharedLogger>> = vec![];
+
+    let mut cfg = ConfigBuilder::new();
+    cfg.add_filter_ignore_str("sled");
+    cfg.add_filter_ignore_str("rustls");
+    let cfg = cfg.build();
+
+    if LOGS_ENABLED {
+        let logfile_path = expand_path(LOGFILE_PATH).unwrap();
+        let log_file = FileRotate::new(
+            logfile_path,
+            AppendCount::new(7),
+            ContentLimit::Lines(1000),
+            Compression::None,
+            #[cfg(unix)]
+            None,
+        );
+        let file_logger = WriteLogger::new(LevelFilter::Debug, cfg.clone(), log_file);
+        loggers.push(file_logger);
+    }
+
+    #[cfg(target_os = "android")]
+    {
+        use android::AndroidLoggerWrapper;
+        let android_logger = AndroidLoggerWrapper::new(LevelFilter::Debug, cfg);
+        loggers.push(android_logger);
+    }
+
+    #[cfg(not(target_os = "android"))]
+    {
+        // For ANSI colors in the terminal
+        colored::control::set_override(true);
+
+        let term_logger =
+            TermLogger::new(LevelFilter::Debug, cfg, TerminalMode::Mixed, ColorChoice::Auto);
+        loggers.push(term_logger);
+    }
+
+    CombinedLogger::init(loggers).expect("logger");
+}

+ 4 - 18
bin/darkwallet/src/main.rs

@@ -38,6 +38,7 @@
 //#![deny(unused_imports)]
 
 use async_lock::{Mutex as AsyncMutex, RwLock as AsyncRwLock};
+use file_rotate::{compression::Compression, suffix::AppendCount, ContentLimit, FileRotate};
 use std::sync::{mpsc, Arc};
 
 #[macro_use]
@@ -52,6 +53,7 @@ mod darkirc2;
 mod error;
 mod expr;
 mod gfx;
+mod logger;
 mod mesh;
 mod net;
 //mod plugin;
@@ -83,6 +85,8 @@ fn main() {
     // Exit the application on panic right away
     std::panic::set_hook(Box::new(panic_hook));
 
+    logger::setup_logging();
+
     #[cfg(target_os = "android")]
     {
         // Workaround for this bug
@@ -91,30 +95,12 @@ fn main() {
             std::env::set_var("HOME", "/data/data/darkfi.darkwallet/");
         }
 
-        android_logger::init_once(
-            android_logger::Config::default().with_max_level(LevelFilter::Debug).with_tag("darkfi"),
-        );
-
         let paths = std::fs::read_dir("/data/data/darkfi.darkwallet/").unwrap();
         for path in paths {
             debug!("{}", path.unwrap().path().display())
         }
     }
 
-    #[cfg(target_os = "linux")]
-    {
-        // For ANSI colors in the terminal
-        colored::control::set_override(true);
-
-        let term_logger = simplelog::TermLogger::new(
-            simplelog::LevelFilter::Debug,
-            simplelog::Config::default(),
-            simplelog::TerminalMode::Mixed,
-            simplelog::ColorChoice::Auto,
-        );
-        simplelog::CombinedLogger::init(vec![term_logger]).expect("logger");
-    }
-
     info!("Target OS: {}", build_info::TARGET_OS);
     info!("Target arch: {}", build_info::TARGET_ARCH);
 

+ 7 - 4
bin/darkwallet/src/ui/chatview/mod.rs

@@ -290,7 +290,12 @@ impl ChatView {
             on_modify.when_change(rect.prop(), redraw);
             on_modify.when_change(debug.prop(), redraw);
 
-            let mut tasks = vec![insert_line_method_task, insert_unconf_line_method_task, motion_task, bgload_task];
+            let mut tasks = vec![
+                insert_line_method_task,
+                insert_unconf_line_method_task,
+                motion_task,
+                bgload_task,
+            ];
             tasks.append(&mut on_modify.tasks);
 
             Self {
@@ -531,9 +536,7 @@ impl ChatView {
 
         // Add message to page
         let mut msgbuf = self.msgbuf.lock().await;
-        let Some(privmsg) = msgbuf.insert_privmsg(timest, msg_id, nick, text).await else {
-            return
-        };
+        let Some(privmsg) = msgbuf.insert_privmsg(timest, msg_id, nick, text).await else { return };
         privmsg.confirmed = false;
         self.redraw_cached(&mut msgbuf).await;
         self.bgload_cv.notify();

+ 10 - 6
bin/darkwallet/src/ui/chatview/page.rs

@@ -261,7 +261,13 @@ impl PrivMessage {
 
             let color = match section {
                 0 => nick_color,
-                _ => if self.confirmed { text_color } else { UNCONF_COLOR },
+                _ => {
+                    if self.confirmed {
+                        text_color
+                    } else {
+                        UNCONF_COLOR
+                    }
+                }
             };
 
             //if debug_render {
@@ -585,13 +591,13 @@ impl Message {
     fn get_privmsg(&self) -> Option<&PrivMessage> {
         match self {
             Message::Priv(msg) => Some(msg),
-            _ => None
+            _ => None,
         }
     }
     fn get_privmsg_mut(&mut self) -> Option<&mut PrivMessage> {
         match self {
             Message::Priv(msg) => Some(msg),
-            _ => None
+            _ => None,
         }
     }
 }
@@ -783,9 +789,7 @@ impl MessageBuffer {
         None
     }
     pub fn mark_confirmed(&mut self, msg_id: &MessageId) -> bool {
-        let Some(privmsg) = self.find_privmsg_mut(msg_id) else {
-            return false
-        };
+        let Some(privmsg) = self.find_privmsg_mut(msg_id) else { return false };
 
         assert_eq!(privmsg.confirmed, false);
         privmsg.confirmed = true;