#[macro_export]
macro_rules! trace {
($($arg:tt)*) => {
$crate::log(&$crate::Record::new(
$crate::LogLevel::Trace,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
};
}
#[macro_export]
macro_rules! debug {
($($arg:tt)*) => {
$crate::log(&$crate::Record::new(
$crate::LogLevel::Debug,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
};
}
#[macro_export]
macro_rules! info {
($($arg:tt)*) => {
$crate::log(&$crate::Record::new(
$crate::LogLevel::Info,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
};
}
#[macro_export]
macro_rules! success {
($($arg:tt)*) => {
$crate::log(&$crate::Record::new(
$crate::LogLevel::Success,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
};
}
#[macro_export]
macro_rules! warn {
($($arg:tt)*) => {
$crate::log(&$crate::Record::new(
$crate::LogLevel::Warning,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
};
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
$crate::log(&$crate::Record::new(
$crate::LogLevel::Error,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
};
}
#[macro_export]
macro_rules! critical {
($($arg:tt)*) => {
$crate::log(&$crate::Record::new(
$crate::LogLevel::Critical,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
};
}
#[macro_export]
macro_rules! log_with_metadata {
($level:expr, $($key:expr => $value:expr),+; $($arg:tt)*) => {
{
let mut record = $crate::Record::new(
$level,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
);
$(
record = record.with_metadata($key, $value);
)+
let result = $crate::log(&record);
println!("Log with metadata result: {}", result);
result
}
};
}
#[macro_export]
macro_rules! push_context {
( $( $key:expr => $val:expr ),* $(,)? ) => {
{
let mut ctx = ::std::collections::HashMap::new();
$( ctx.insert($key.to_string(), $crate::context::ContextValue::String($val.to_string())); )*
$crate::context::push_context(ctx);
}
};
}
#[macro_export]
macro_rules! pop_context {
() => {
$crate::context::pop_context();
};
}
#[macro_export]
macro_rules! set_context {
($key:expr, $val:expr) => {
$crate::context::set_context_value(
$key,
$crate::context::ContextValue::String($val.to_string()),
);
};
}
#[macro_export]
macro_rules! get_context {
($key:expr) => {
$crate::context::get_context_value($key)
};
}
#[macro_export]
macro_rules! scope {
($name:expr) => {
$crate::scope::ScopeGuard::enter($name)
};
}
#[macro_export]
macro_rules! scoped_info {
($name:expr) => {{
$crate::info!("Entering scope: {}", $name);
let _guard = $crate::scope::ScopeGuard::enter($name);
struct ScopeLogger<'a> {
name: &'a str,
start: ::std::time::Instant,
}
impl<'a> ::std::ops::Drop for ScopeLogger<'a> {
fn drop(&mut self) {
let elapsed = self.start.elapsed();
$crate::info!("Exiting scope: {} (elapsed: {:?})", self.name, elapsed);
}
}
ScopeLogger {
name: $name,
start: ::std::time::Instant::now(),
}
}};
}
#[macro_export]
macro_rules! log_error {
($err:expr) => {
$crate::error!("{}", $err);
};
($err:expr, $msg:expr) => {
$crate::error!("{}: {}", $msg, $err);
};
}
#[macro_export]
macro_rules! log_error_with_context {
($err:expr, $ctx:expr) => {
$crate::error!("{} (context: {:?})", $err, $ctx);
};
}
#[macro_export]
macro_rules! try_log {
($expr:expr, $msg:expr) => {{
match $expr {
Ok(val) => Ok(val),
Err(e) => {
$crate::error!("{}: {}", $msg, e);
Err(e)
}
}
}};
(option $expr:expr, $msg:expr) => {{
match $expr {
Some(val) => Some(val),
None => {
$crate::error!("{}: None value", $msg);
None
}
}
}};
}
#[macro_export]
macro_rules! log_if_enabled {
($level:expr, $($arg:tt)*) => {
if $level >= $crate::STATIC_LEVEL {
$crate::log(&$crate::Record::new(
$level,
format!($($arg)*),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
))
} else {
false
}
};
}
#[macro_export]
macro_rules! info_kv {
($msg:expr; $( $key:expr => $val:expr ),+ ) => {{
let mut record = $crate::Record::new(
$crate::LogLevel::Info,
$msg.to_string(),
Some(module_path!().to_string()),
Some(file!().to_string()),
Some(line!()),
);
$( record = record.with_metadata($key, $val); )+
$crate::log(&record)
}};
}