cirious_codex_logger/
log.rs1use crate::{Dispatcher, Level};
2use std::{
3 collections::BTreeMap,
4 error::Error,
5 sync::{atomic::AtomicU8, OnceLock, RwLock},
6};
7
8pub static GLOBAL_FILTER: AtomicU8 = AtomicU8::new(Level::Info as u8);
10
11pub static MODULE_FILTERS: RwLock<BTreeMap<String, Level>> = RwLock::new(BTreeMap::new());
13
14pub fn set_module_filter(module: &str, level: Level) -> Result<(), Box<dyn Error>> {
22 MODULE_FILTERS.write()?.insert(module.to_string(), level);
23 Ok(())
24}
25
26static GLOBAL_LOGGER: OnceLock<Box<dyn Dispatcher + Send + Sync>> = OnceLock::new();
28
29pub fn init(dispatcher: Box<dyn Dispatcher + Send + Sync>) -> Result<(), Box<dyn Dispatcher + Send + Sync>> {
34 cirious_codex_term::init_term();
35 GLOBAL_LOGGER.set(dispatcher)
36}
37
38pub fn get_logger() -> Option<&'static (dyn Dispatcher + Send + Sync)> {
40 GLOBAL_LOGGER.get().map(std::convert::AsRef::as_ref)
41}
42
43#[macro_export]
45#[doc(hidden)]
46macro_rules! __log_internal {
47 ($level:expr, $($arg:tt)+) => {
48 {
49 let current_level = $level as u8;
50 let module = module_path!();
51
52 let allowed = if let Ok(filters) = $crate::log::MODULE_FILTERS.read() {
53 if let Some(mod_level) = filters.get(module) {
54 current_level >= (*mod_level as u8)
55 } else {
56 current_level >= $crate::log::GLOBAL_FILTER.load(std::sync::atomic::Ordering::Relaxed)
57 }
58 } else {
59 current_level >= $crate::log::GLOBAL_FILTER.load(std::sync::atomic::Ordering::Relaxed)
60 };
61
62 if allowed {
63 if let Some(logger) = $crate::get_logger() {
64 let record = $crate::format::Record {
65 level: $level,
66 args: format!($($arg)+),
67 file: file!(),
68 line: line!(),
69 module_path: module,
70 timestamp: std::time::SystemTime::now(),
71 };
72 let _ = logger.dispatch(&record);
73 }
74 }
75 }
76 };
77}
78
79#[macro_export]
84macro_rules! error { ($($arg:tt)+) => { $crate::__log_internal!($crate::level::Level::Error, $($arg)+); } }
85
86#[macro_export]
91macro_rules! warn { ($($arg:tt)+) => { $crate::__log_internal!($crate::level::Level::Warn, $($arg)+); } }
92
93#[macro_export]
98macro_rules! info { ($($arg:tt)+) => { $crate::__log_internal!($crate::level::Level::Info, $($arg)+); } }
99
100#[macro_export]
105macro_rules! debug { ($($arg:tt)+) => { $crate::__log_internal!($crate::level::Level::Debug, $($arg)+); } }
106
107#[macro_export]
112macro_rules! trace { ($($arg:tt)+) => { $crate::__log_internal!($crate::level::Level::Trace, $($arg)+); } }