mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-01-10 07:08:05 -05:00
wallet: add file rotated logs for all platforms
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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
bin/darkwallet/src/logger.rs
Normal file
113
bin/darkwallet/src/logger.rs
Normal file
@@ -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");
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user