use crossbeam_channel::unbounded; use crossbeam_channel::{ Sender, Receiver }; use std::sync::LazyLock; #[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct SimpleLogger { env: Option<&JNIEnv> } impl log::Log for SimpleLogger { fn enabled(&self, metadata: &log::Metadata) -> bool { metadata.level() <= log::Level::Trace } fn log(&self, record: &log::Record) { if self.enabled(record.metadata()) { let current_crate_name = env!("CARGO_CRATE_NAME"); if record.module_path().unwrap_or("").starts_with(current_crate_name) { self.do_log(record); } } } fn flush(&self) {} } impl SimpleLogger { fn do_log(&self, record: &log::Record) { let timestamp: chrono::DateTime = chrono::Local::now(); let msg = format!( "[{} {:<5} {}] - {}", timestamp.format("%Y-%m-%d %H:%M:%S"), record.level(), record.module_path().unwrap_or(""), record.args() ); FridaLib::traceFromNative(self.env, msg); } fn set_env(&self, env: &JNIEnv) { self.env = Some(env); } }