pub mod logger;
pub mod config;
pub mod formatter;
pub mod rotation;
pub mod colors;
pub use logger::Logger;
pub use config::{Config, LogLevel, OutputTarget};
use std::sync::Once;
static INIT: Once = Once::new();
pub fn init() {
INIT.call_once(|| {
let config = Config::from_env();
Logger::init(config).expect("Failed to initialize logger");
});
}
pub fn init_with_config(config: Config) {
INIT.call_once(|| {
Logger::init(config).expect("Failed to initialize logger");
});
}
#[macro_export]
macro_rules! trace {
($($arg:tt)*) => {
$crate::logger::log($crate::LogLevel::Trace, format_args!($($arg)*))
};
}
#[macro_export]
macro_rules! debug {
($($arg:tt)*) => {
$crate::logger::log($crate::LogLevel::Debug, format_args!($($arg)*))
};
}
#[macro_export]
macro_rules! info {
($($arg:tt)*) => {
$crate::logger::log($crate::LogLevel::Info, format_args!($($arg)*))
};
}
#[macro_export]
macro_rules! warn {
($($arg:tt)*) => {
$crate::logger::log($crate::LogLevel::Warn, format_args!($($arg)*))
};
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
$crate::logger::log($crate::LogLevel::Error, format_args!($($arg)*))
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_macros() {
init();
trace!("This is a trace message");
debug!("This is a debug message");
info!("This is an info message");
warn!("This is a warning message");
error!("This is an error message");
}
}