#[macro_export]
macro_rules! kvset {
($( $($attr_key_part:ident).+ = $attr_value:expr ),+ $(,)?) => {{
use $crate::KeyValue;
[
$( KeyValue::new(stringify!($($attr_key_part).+), $attr_value) ),*
]
}};
($( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
use $crate::KeyValue;
[
$( KeyValue::new(stringify!($attr_key), $attr_value) ),*
]
}};
($( $attr:ident ),+ $(,)?) => {{
use $crate::KeyValue;
[
$( KeyValue::new(stringify!($attr), $attr) ),*
]
}};
}
#[macro_export]
macro_rules! anykvset {
($( $($attr_key_part:ident).+ = $attr_value:expr ),+ $(,)?) => {{
use $crate::{Key, logs::AnyValue};
[
$( (Key::new(stringify!($($attr_key_part).+)), AnyValue::from($attr_value)) ),*
]
}};
($( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
use $crate::{Key, logs::AnyValue};
[
$( (Key::new(stringify!($attr_key)), AnyValue::from($attr_value)) ),*
]
}};
($( $attr:ident ),+ $(,)?) => {{
use $crate::{Key, logs::AnyValue};
[
$( (Key::new(stringify!($attr)), AnyValue::from($attr)) ),*
]
}};
}
#[macro_export]
macro_rules! log {
($name:expr, $severity:expr, $body:expr) => {{
$crate::create_log_record($severity, module_path!(), $name, Some($body.into()), &[])
}};
($name:expr, $severity:expr, $body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
let attrs = $crate::anykvset!($( $attr_key = $attr_value ),*);
$crate::create_log_record($severity, module_path!(), $name, Some($body.into()), &attrs)
}};
($name:expr, $severity:expr, $body:expr, $( $attr:ident ),+ $(,)?) => {{
let attrs = $crate::anykvset!($( $attr ),*);
$crate::create_log_record($severity, module_path!(), $name, Some($body.into()), &attrs)
}};
}
#[macro_export]
macro_rules! error_log {
($body:expr) => {{
$crate::log!(None, $crate::logs::Severity::Error, $body);
}};
($body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Error, $body, $( $attr_key = $attr_value ),*);
}};
($body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Error, $body, $( $attr ),*);
}};
($name:expr, $body:expr) => {{
$crate::log!(Some($name), $crate::logs::Severity::Error, $body);
}};
($name:expr, $body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Error, $body, $( $attr_key = $attr_value ),*);
}};
($name:expr, $body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Error, $body, $( $attr ),*);
}};
}
#[macro_export]
macro_rules! warn_log {
($body:expr) => {{
$crate::log!(None, $crate::logs::Severity::Warn, $body);
}};
($body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Warn, $body, $( $attr_key = $attr_value ),*);
}};
($body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Warn, $body, $( $attr ),*);
}};
($name:expr, $body:expr) => {{
$crate::log!(Some($name), $crate::logs::Severity::Warn, $body);
}};
($name:expr, $body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Warn, $body, $( $attr_key = $attr_value ),*);
}};
($name:expr, $body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Warn, $body, $( $attr ),*);
}};
}
#[macro_export]
macro_rules! info_log {
($body:expr) => {{
$crate::log!(None, $crate::logs::Severity::Info, $body);
}};
($body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Info, $body, $( $attr_key = $attr_value ),*);
}};
($body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Info, $body, $( $attr ),*);
}};
($name:expr, $body:expr) => {{
$crate::log!(Some($name), $crate::logs::Severity::Info, $body);
}};
($name:expr, $body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Info, $body, $( $attr_key = $attr_value ),*);
}};
($name:expr, $body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Info, $body, $( $attr ),*);
}};
}
#[macro_export]
macro_rules! debug_log {
($body:expr) => {{
$crate::log!(None, $crate::logs::Severity::Debug, $body);
}};
($body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Debug, $body, $( $attr_key = $attr_value ),*);
}};
($body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Debug, $body, $( $attr ),*);
}};
($name:expr, $body:expr) => {{
$crate::log!(Some($name), $crate::logs::Severity::Debug, $body);
}};
($name:expr, $body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Debug, $body, $( $attr_key = $attr_value ),*);
}};
($name:expr, $body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Debug, $body, $( $attr ),*);
}};
}
#[macro_export]
macro_rules! trace_log {
($body:expr) => {{
$crate::log!(None, $crate::logs::Severity::Trace, $body);
}};
($body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Trace, $body, $( $attr_key = $attr_value ),*);
}};
($body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(None, $crate::logs::Severity::Trace, $body, $( $attr ),*);
}};
($name:expr, $body:expr) => {{
$crate::log!(Some($name), $crate::logs::Severity::Trace, $body);
}};
($name:expr, $body:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Trace, $body, $( $attr_key = $attr_value ),*);
}};
($name:expr, $body:expr, $( $attr:ident ),+ $(,)?) => {{
$crate::log!(Some($name), $crate::logs::Severity::Trace, $body, $( $attr ),*);
}};
}
#[macro_export]
macro_rules! event {
($name:expr) => {{
$crate::new_event($name, &[])
}};
($name:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr_key = $attr_value ),*);
$crate::new_event($name, &attrs)
}};
($name:expr, $( $attr:ident ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr ),*);
$crate::new_event($name, &attrs)
}};
}
#[macro_export]
macro_rules! error_event {
($name:expr, $desc:expr) => {{
$crate::new_error_event($name, $desc &[])
}};
($name:expr, $desc:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr_key = $attr_value ),*);
$crate::new_error_event($name, &attrs)
}};
($name:expr, $desc:expr, $( $attr:ident ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr ),*);
$crate::new_error_event($name, &attrs)
}};
}
#[macro_export]
macro_rules! context {
($name:expr) => {{
$crate::new_span($name, $crate::trace::SpanKind::Internal, &[])
}};
($name:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr_key = $attr_value ),*);
$crate::new_span($name, $crate::trace::SpanKind::Internal, &attrs)
}};
($name:expr, $( $attr:ident ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr ),*);
$crate::new_span($name, $crate::trace::SpanKind::Internal, &attrs)
}};
($name:expr, $kind:expr) => {{
$crate::new_span($name, $kind, &[])
}};
($name:expr, $kind:expr, $( $attr_key:tt = $attr_value:expr ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr_key = $attr_value ),*);
$crate::new_span($name, $kind, &attrs)
}};
($name:expr, $kind:expr, $( $attr:tt ),+ $(,)?) => {{
let attrs = $crate::kvset!($( $attr ),*);
$crate::new_span($name, $kind, &attrs)
}};
}
#[cfg(test)]
mod tests {
#[test]
fn test_kvset_macro_syntax() {
let _test1 = || {
kvset!(component = "auth", version = "1.0");
};
let _test2 = || {
kvset!(user_id = 123, session_id = "abc", active = true);
};
let _test3 = || {
let component = "logging";
let version = "2.0";
kvset!(component, version);
};
let _test4a = || {
kvset!(service = "api", region = "us-east-1");
};
let _test4b = || {
let count = 42;
let enabled = false;
kvset!(count, enabled);
};
let _test5 = || {
kvset!(name = "test", id = 1,);
};
let _test6 = || {
kvset!(work_order.request_id = "12345", user.profile.name = "John");
};
let _test7 = || {
kvset!(service.api.version = "v2", database.connection.timeout = 30);
};
let _test8 = || {
kvset!(app.config.debug = true, metrics.counter.requests = 100,);
};
}
#[test]
fn test_anykvset_macro_syntax() {
let _test1 = || {
anykvset!(level = "error", code = 500);
};
let _test2 = || {
anykvset!(message = "test", timestamp = 1234567890, success = false);
};
let _test3 = || {
let level = "info";
let code = 200;
anykvset!(level, code);
};
let _test4a = || {
anykvset!(operation = "query", cached = true);
};
let _test4b = || {
let duration = 1.5;
let retries = 3;
anykvset!(duration, retries);
};
let _test5 = || {
anykvset!(key = "value", num = 42,);
};
let _test6 = || {
anykvset!(work_order.request_id = "67890", event.source.system = "billing");
};
let _test7 = || {
anykvset!(trace.span.id = "abc123", log.level.severity = "warn");
};
let _test8 = || {
anykvset!(http.request.method = "POST", response.status.code = 201,);
};
}
#[test]
fn test_base_log_macro_syntax() {
let _test1 = || {
log!(Some("test_log"), crate::logs::Severity::Info, "message");
};
let _test2 = || {
log!(None, crate::logs::Severity::Error, "error occurred");
};
let _test3 = || {
log!(Some("user_action"), crate::logs::Severity::Info, "action performed", user_id = 123, action = "login");
};
let _test4 = || {
let user_id = 456;
let session_id = "session123";
log!(Some("session_log"), crate::logs::Severity::Debug, "session info", user_id, session_id);
};
let _test5 = || {
log!(None, crate::logs::Severity::Trace, "trace message", component = "auth");
};
let _test6 = || {
log!(Some("warning"), crate::logs::Severity::Warn, "warning message", level = "high");
};
}
#[test]
fn test_error_log_macro_syntax() {
let _test1 = || {
error_log!("error message");
};
let _test2 = || {
error_log!("database error", error_code = 500, table = "users");
};
let _test3 = || {
let error_code = 404;
let resource = "user";
error_log!("resource not found", error_code, resource);
};
let _test4 = || {
error_log!("database_error", "connection failed");
};
let _test5 = || {
error_log!("auth_error", "invalid credentials", user_id = 123, attempt = 3);
};
let _test6 = || {
let user_id = 789;
let ip_address = "192.168.1.1";
error_log!("login_failure", "login attempt failed", user_id, ip_address);
};
let _test7 = || {
error_log!("validation_error", "field validation failed", field = "email", required = true, length = 0);
};
let _test8 = || {
let duration = 30.5;
let timeout = true;
error_log!("timeout_error", "operation timed out", duration, timeout);
};
}
#[test]
fn test_warn_log_macro_syntax() {
let _test1 = || {
warn_log!("warning message");
};
let _test2 = || {
warn_log!("high memory usage", usage_percent = 85, threshold = 80);
};
let _test3 = || {
let usage_percent = 90;
let service = "api";
warn_log!("resource warning", usage_percent, service);
};
let _test4 = || {
warn_log!("memory_warning", "memory usage high");
};
let _test5 = || {
warn_log!("rate_limit_warning", "approaching rate limit", requests = 950, limit = 1000);
};
let _test6 = || {
let requests = 980;
let window = "1h";
warn_log!("rate_limit", "rate limit warning", requests, window);
};
}
#[test]
fn test_info_log_macro_syntax() {
let _test1 = || {
info_log!("info message");
};
let _test2 = || {
info_log!("user logged in", user_id = 123, session_duration = 3600);
};
let _test3 = || {
let user_id = 456;
let action = "logout";
info_log!("user action", user_id, action);
};
let _test4 = || {
info_log!("user_session", "session started");
};
let _test5 = || {
info_log!("api_request", "request processed", endpoint = "/users", method = "GET", status = 200);
};
let _test6 = || {
let endpoint = "/orders";
let response_time = 150;
info_log!("api_response", "request completed", endpoint, response_time);
};
}
#[test]
fn test_debug_log_macro_syntax() {
let _test1 = || {
debug_log!("debug message");
};
let _test2 = || {
debug_log!("cache miss", key = "user:123", ttl = 300);
};
let _test3 = || {
let key = "session:abc";
let hit = false;
debug_log!("cache lookup", key, hit);
};
let _test4 = || {
debug_log!("cache_operation", "cache accessed");
};
let _test5 = || {
debug_log!("db_query", "executing query", table = "users", where_clause = "id = ?", params = 1);
};
let _test6 = || {
let table = "orders";
let execution_time = 25;
debug_log!("query_performance", "query executed", table, execution_time);
};
}
#[test]
fn test_trace_log_macro_syntax() {
let _test1 = || {
trace_log!("trace message");
};
let _test2 = || {
trace_log!("function entry", function = "process_order", args_count = 3);
};
let _test3 = || {
let function = "validate_user";
let line = 42;
trace_log!("execution trace", function, line);
};
let _test4 = || {
trace_log!("function_trace", "entering function");
};
let _test5 = || {
trace_log!("execution_flow", "processing step", step = 1, total_steps = 5, progress = 20.0);
};
let _test6 = || {
let step = 3;
let state = "processing";
trace_log!("workflow_trace", "workflow step", step, state);
};
}
#[test]
fn test_event_macro_syntax() {
let _test1 = || {
event!("user_login");
};
let _test2 = || {
event!("order_created");
};
let _test3 = || {
event!("user_action", action = "click", element = "button", page = "checkout");
};
let _test4 = || {
event!("api_call", endpoint = "/users", method = "POST", duration = 150);
};
let _test5 = || {
let action = "scroll";
let position = 500;
event!("user_interaction", action, position);
};
let _test6 = || {
let operation = "delete";
let resource_id = 123;
let success = true;
event!("resource_operation", operation, resource_id, success);
};
let _test7a = || {
event!("mixed_event", event_type = "navigation", timestamp = 1234567890);
};
let _test7b = || {
let user_id = 789;
let session_active = true;
event!("mixed_event", user_id, session_active);
};
let _test8 = || {
event!("test_event", attr1 = "value1", attr2 = 42,);
};
}
#[test]
fn test_span_macro_syntax() {
let _test1 = || {
context!("http_request");
};
let _test2 = || {
context!("database_query");
};
let _test3 = || {
context!("api_request", method = "GET", endpoint = "/users", version = "v1");
};
let _test4 = || {
context!("db_transaction", table = "orders", operation = "INSERT", isolation = "READ_COMMITTED");
};
let _test5 = || {
let method = "POST";
let status_code = 201;
context!("http_response", method, status_code);
};
let _test6 = || {
let service = "payment";
let provider = "stripe";
let amount = 99.99;
context!("payment_processing", service, provider, amount);
};
let _test7a = || {
context!("user_operation", operation_type = "update", timestamp = 1234567890);
};
let _test7b = || {
let user_id = 456;
let authenticated = true;
context!("user_operation", user_id, authenticated);
};
let _test8 = || {
context!("test_span", attr1 = "value1", attr2 = 42,);
};
}
#[test]
fn test_complex_macro_combinations() {
let _test1 = || {
let user = StructWithId { id: 123, name: "test".to_string() };
info_log!("user_info", "user data", user_id = user.id, user_name = "test_user");
};
let _test2 = || {
error_log!("calculation_error", "division by zero", result = calculate_result(), timestamp = "2024-01-01");
};
let _test3 = || {
let success = true;
debug_log!("operation_result", "operation completed", status = if success { "ok" } else { "failed" }, code = if success { 200 } else { 500 });
};
let _test4 = || {
let tags = vec!["important", "urgent"];
warn_log!("tagged_warning", "system warning", tag_count = tags.len() as i64, first_tag = *tags.get(0).unwrap_or(&"none"));
};
let _test5 = || {
let attrs = kvset!(nested = "value", count = 1);
let _combined = attrs;
};
}
#[allow(dead_code)]
struct StructWithId {
id: u32,
name: String,
}
#[allow(dead_code)]
fn calculate_result() -> i32 {
42
}
}