use std::sync::Mutex;
use std::collections::HashMap;
pub use log;
pub use paste;
lazy_static::lazy_static! {
static ref PRINT_COUNT: Mutex<HashMap<(log::Level, &'static str), u64>>
= Mutex::new(HashMap::new());
}
pub const MAX_PRINT_COUNT: u64 = 20;
pub fn init_stderr_color_debug() {
use simplelog::*;
TermLogger::init(
LevelFilter::Debug,
ConfigBuilder::new()
.set_location_level(LevelFilter::Debug)
.set_thread_level(LevelFilter::Trace)
.build(),
TerminalMode::Stderr,
ColorChoice::Auto,
).unwrap();
}
pub fn obtain_count(typ: log::Level, id: &'static str) -> u64 {
let mut print_counts = PRINT_COUNT.lock().unwrap();
match print_counts.get_mut(&(typ, id)) {
Some(v) => {
*v += 1;
*v
},
None => {
print_counts.insert((typ, id), 1);
1
}
}
}
#[macro_export]
macro_rules! log_monitor {
($typ:ident, $id:ident, $fmt:expr $(,$param:expr)*) => {{
let count = $crate::obtain_count(
$crate::paste::paste!($crate::log::Level::[<$typ:camel>]),
stringify!($id));
if count <= $crate::MAX_PRINT_COUNT {
$crate::log::$typ!(concat!("(", stringify!($id), ") ", $fmt)
$(,$param)*);
}
if count == $crate::MAX_PRINT_COUNT {
$crate::log::$typ!(
concat!("Further ",
stringify!($typ),
" (", stringify!($id), ") will be suppressed."));
}
}};
($typ:ident, $fmt:expr $(,$param:expr)*) => {{
$crate::log::$typ!($fmt $(,$param)*);
}}
}
#[macro_export]
macro_rules! info {
($t:tt $(,$p:expr)*) => ($crate::log_monitor!(info, $t $(,$p)*))
}
#[macro_export]
macro_rules! warn {
($t:tt $(,$p:expr)*) => ($crate::log_monitor!(warn, $t $(,$p)*))
}
#[macro_export]
macro_rules! error {
($t:tt $(,$p:expr)*) => ($crate::log_monitor!(error, $t $(,$p)*))
}
#[macro_export]
macro_rules! debug {
($t:tt $(,$p:expr)*) => ($crate::log_monitor!(debug, $t $(,$p)*))
}
#[macro_export]
macro_rules! trace {
($t:tt $(,$p:expr)*) => ($crate::log_monitor!(trace, $t $(,$p)*))
}
mod logging_timer;
pub use logging_timer::*;