async_log/
macros.rs

1#[doc(hidden)]
2#[macro_export]
3macro_rules! span_inner {
4    ($args:expr, $block:expr) => {{
5        let span = async_log::Span::new($args);
6        let res = $block;
7        drop(span);
8        res
9    }};
10}
11
12/// Create a tracing span.
13///
14/// Spans are pairs of `trace!` logs. Every `span` wraps a block, and logs a message at the start,
15/// of the block and a message after the block has finished. This works in asynchronous contexts
16/// too.
17///
18/// Each span takes a `name`, a block, and optionally a list of key-value pairs in between those.
19/// Once structured logging becomes part of `log` (currently feature gated as `kv_unstable`), we'll
20/// move to support arbitrary key-value pairs.
21///
22/// Because of the way this macro is constructed, we currently support up to 9 key-value pairs.
23/// Which makes a total of 12 arguments.
24///
25/// ## Examples
26/// ```
27/// use async_log::span;
28/// use log::info;
29///
30/// span!("main", {
31///     let x = "foo";
32///     info!("this {}", x);
33///
34///     span!("inner, x={}", x, {
35///         info!("we must go deeper {}", x);
36///     });
37/// })
38/// ```
39#[macro_export]
40macro_rules! span {
41    ($args:expr, $block:expr) => {{
42        async_log::span_inner!($args, $block)
43    }};
44    ($args:expr, $a:expr, $block:expr) => {{
45        let args = format!($args, $a);
46        async_log::span_inner!(args, $block)
47    }};
48    ($args:expr, $a:expr, $b:expr, $block:expr) => {{
49        let args = format!($args, $a, $b);
50        async_log::span_inner!(args, $block)
51    }};
52    ($args:expr, $a:expr, $b:expr, $c:expr, $block:expr) => {{
53        let args = format!($args, $a, $b, $c);
54        async_log::span_inner!(args, $block)
55    }};
56    ($args:expr, $a:expr, $b:expr, $c:expr, $d:expr, $block:expr) => {{
57        let args = format!($args, $a, $b, $c, $d);
58        async_log::span_inner!(args, $block)
59    }};
60    ($args:expr, $a:expr, $b:expr, $c:expr, $d:expr, $e:expr, $block:expr) => {{
61        let args = format!($args, $a, $b, $c, $d, $e);
62        async_log::span_inner!(args, $block)
63    }};
64    ($args:expr, $a:expr, $b:expr, $c:expr, $d:expr, $e:expr, $f:expr, $block:expr) => {{
65        let args = format!($args, $a, $b, $c, $d, $e, $f);
66        async_log::span_inner!(args, $block)
67    }};
68    ($args:expr, $a:expr, $b:expr, $c:expr, $d:expr, $e:expr, $f:expr, $g:expr, $block:expr) => {{
69        let args = format!($args, $a, $b, $c, $d, $e, $f, $g);
70        async_log::span_inner!(args, $block)
71    }};
72}