use std::collections::HashMap;
use std::sync::Arc;
use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug, Default, Clone)]
pub struct LogCounter {
debug: Arc<AtomicU64>,
info: Arc<AtomicU64>,
warn: Arc<AtomicU64>,
error: Arc<AtomicU64>,
}
impl LogCounter {
pub fn new() -> Self {
Self::default()
}
pub fn increment(&self, level: tracing::Level) {
match level {
tracing::Level::DEBUG | tracing::Level::TRACE => {
self.debug.fetch_add(1, Ordering::Relaxed);
}
tracing::Level::INFO => {
self.info.fetch_add(1, Ordering::Relaxed);
}
tracing::Level::WARN => {
self.warn.fetch_add(1, Ordering::Relaxed);
}
tracing::Level::ERROR => {
self.error.fetch_add(1, Ordering::Relaxed);
}
}
}
pub fn counts(&self) -> HashMap<String, u64> {
HashMap::from([
("debug".into(), self.debug.load(Ordering::Relaxed)),
("info".into(), self.info.load(Ordering::Relaxed)),
("warning".into(), self.warn.load(Ordering::Relaxed)),
("error".into(), self.error.load(Ordering::Relaxed)),
])
}
}