use crossbeam_channel::unbounded; use crossbeam_channel::{ Sender, Receiver }; static bnd: (Sender>, Receiver>) = unbounded::>(); pub fn fetch_logs() -> Vec { if let Ok(bytes) = bnd.1.recv() { return bytes; } Vec::new() } pub fn push_log(data: Vec) { bnd.0.send(data); } #[derive(Debug, Clone, PartialEq, Eq, Default)] pub struct SimpleLogger {} 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() ); push_log(msg.as_bytes().to_vec()); } }