diff --git a/Cargo.toml b/Cargo.toml index 7eb660f..2705d54 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rust_util" -version = "0.6.47" +version = "0.6.48" authors = ["Hatter Jiang "] edition = "2018" description = "Hatter's Rust Util" diff --git a/examples/log.rs b/examples/log.rs index 8df6fd0..18e150c 100644 --- a/examples/log.rs +++ b/examples/log.rs @@ -1,10 +1,22 @@ #[macro_use] extern crate rust_util; +use std::sync::mpsc::channel; +use std::thread; use rust_util::{XResult, SimpleError}; -use rust_util::util_msg::set_logger_std_out; +use rust_util::util_msg::{set_logger_sender, set_logger_std_out}; // cargo run --example log fn main() -> XResult<()> { + let (sender, receiver) = channel::(); + set_logger_sender(sender); + + let _t = thread::spawn(move || { + loop { + let msg = receiver.recv(); + println!("[RECV]: {:?}", msg) + } + }); + std::env::set_var("LOGGER_LEVEL", "*"); println!(r##"env LOGGER_LEVEL set to: debug or * diff --git a/src/util_msg.rs b/src/util_msg.rs index 5eba52c..91c78ea 100644 --- a/src/util_msg.rs +++ b/src/util_msg.rs @@ -1,14 +1,21 @@ use std::env; use std::io::{self, Write}; use std::sync::{Arc, Mutex, RwLock}; +use std::sync::mpsc::Sender; lazy_static! { pub static ref IS_ATTY: bool = is_atty(); static ref LOGGER_LEVEL: MessageType = get_logger_level(); + static ref LOGGER_SENDER: Arc>>> = Arc::new(RwLock::new(None)); static ref LOGGER_TO_STDOUT: Arc> = Arc::new(RwLock::new(true)); static ref PRINT_MESSAGE_LOCK: Arc> = Arc::new(Mutex::new(())); } +pub fn set_logger_sender(sender: Sender) { + let mut logger_sender_opt = LOGGER_SENDER.write().unwrap(); + logger_sender_opt.replace(sender); +} + pub fn set_logger_std_out(is_std_out: bool) { let mut std_out = LOGGER_TO_STDOUT.write().unwrap(); *std_out = is_std_out; @@ -105,6 +112,13 @@ pub fn print_color_and_flush(color: Option, is_bold: bool, m } pub fn print_message_ex(color: Option, h: &str, message: &str) { + { + let logger_sender_opt = LOGGER_SENDER.read().unwrap(); + if let Some(logger_sender) = &*logger_sender_opt { + logger_sender.send(format!("{} {}", h, message)).ok(); + return; + } + } let is_std_out = get_logger_std_out(); let mut lock = PRINT_MESSAGE_LOCK.lock().unwrap(); print_color(is_std_out, color, true, h);