#[doc(hidden)]
pub use log as _log;
#[doc(hidden)]
pub use serde_json;
pub use _log::log_enabled;
pub use _log::Level;
#[doc(hidden)]
#[macro_export]
macro_rules! msg_and_kvs {
($fmt:literal, $($tail:tt)+) => {
xlog::msg_and_kvs!(@fmt $fmt @args [] $($tail)+)
};
($fmt:literal $(,)*) => {
(std::borrow::Cow::Borrowed($fmt), Option::<xlog::serde_json::Map::<String, xlog::serde_json::Value>>::None)
};
(@fmt $fmt:literal @args [$($args:expr,)*] $key:ident = $value:expr, $($tail:tt)+) => {
xlog::msg_and_kvs!(@fmt $fmt @args [$($args,)*] @kvs [$key = $value,] $($tail)+)
};
(@fmt $fmt:literal @args [$($args:expr,)*] @kvs [$($pkey:ident = $pvalue:expr,)*] $key:ident = $value:expr, $($tail:tt)+) => {
xlog::msg_and_kvs!(@fmt $fmt @args [$($args,)*] @kvs [$($pkey = $pvalue,)* $key = $value,] $($tail)+)
};
(@fmt $fmt:literal @args [$($args:expr,)*] $key:ident = $value:expr $(,)*) => {
xlog::msg_and_kvs!(@finish @fmt $fmt @args [$($args,)*] @kvs [$key = $value,])
};
(@fmt $fmt:literal @args [$($args:expr,)*] @kvs [$($pkey:ident = $pvalue:expr,)*] $key:ident = $value:expr $(,)*) => {
xlog::msg_and_kvs!(@finish @fmt $fmt @args [$($args,)*] @kvs [$($pkey = $pvalue,)* $key = $value,])
};
(@fmt $fmt:literal @args [$($args:expr,)*] $value:expr, $($tail:tt)+) => {
xlog::msg_and_kvs!(@fmt $fmt @args [$($args,)* $value,] $($tail)+)
};
(@fmt $fmt:literal @args [$($args:expr,)*] $value:expr $(,)*) => {
xlog::msg_and_kvs!(@finish @fmt $fmt @args [$($args,)* $value,] @kvs [])
};
(@finish @fmt $fmt:literal @args [$($args:expr,)*] @kvs [$($key:ident = $value:expr,)*]) => {
{
#[allow(unused_mut)]
let mut kvs = xlog::serde_json::Map::<String, xlog::serde_json::Value>::new();
$(
xlog::msg_and_kvs!(@insert kvs, $key, $value);
)*
let msg = format!($fmt, $($args,)*);
(std::borrow::Cow::Owned::<'static, String>(msg), if kvs.is_empty() { None } else { Some(kvs) })
}
};
(@insert $kvs:expr, error, $value:expr) => {
$kvs.insert(stringify!($key).to_string(), xlog::serde_json::to_value($value.to_string()).unwrap());
};
(@insert $kvs:expr, $key:ident, $value:expr) => {
$kvs.insert(stringify!($key).to_string(), xlog::serde_json::to_value(&$value).unwrap());
};
}
#[macro_export]
macro_rules! log {
(target: $target:expr, $level:expr, $($args:tt)*) => {
{
let (message, kvs) = xlog::msg_and_kvs!($($args)*);
let s = if let Some(kvs) = kvs {
if let Ok(kv_json) = xlog::serde_json::to_string(&kvs) {
std::borrow::Cow::Owned(format!("{} {}", message, kv_json))
} else {
std::borrow::Cow::Owned(format!("{} InvalidJson", message))
}
} else {
message
};
xlog::_log::log!(target: $target, $level, "{}", s)
}
};
(target = $target:expr, $level:expr, $($args:tt)*) => {
xlog::log!(target: $target, $level, $($args)+)
};
($level:expr, $($args:tt)*) => {
xlog::log!(target: module_path!(), $level, $($args)+)
};
}
#[macro_export]
macro_rules! trace {
(target: $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Trace, $($args)+)
};
(target = $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Trace, $($args)+)
};
($($args:tt)*) => {
xlog::log!(xlog::Level::Trace, $($args)+)
};
}
#[macro_export]
macro_rules! debug {
(target: $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Debug, $($args)+)
};
(target = $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Debug, $($args)+)
};
($($args:tt)*) => {
xlog::log!(xlog::Level::Debug, $($args)+)
};
}
#[macro_export]
macro_rules! info {
(target: $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Info, $($args)+)
};
(target = $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Info, $($args)+)
};
($($args:tt)*) => {
xlog::log!(xlog::Level::Info, $($args)+)
};
}
#[macro_export]
macro_rules! warn {
(target: $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Warn, $($args)+)
};
(target = $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Warn, $($args)+)
};
($($args:tt)*) => {
xlog::log!(xlog::Level::Warn, $($args)+)
};
}
#[macro_export]
macro_rules! error {
(target: $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Error, $($args)+)
};
(target = $target:expr, $($args:tt)*) => {
xlog::log!(target: $target, xlog::Level::Error, $($args)+)
};
($($args:tt)*) => {
xlog::log!(xlog::Level::Error, $($args)+)
};
}