tracing/
macros.rs

1/// Constructs a new span.
2///
3/// See [the top-level documentation][lib] for details on the syntax accepted by
4/// this macro.
5///
6/// [lib]: crate#using-the-macros
7///
8/// # Examples
9///
10/// Creating a new span:
11/// ```
12/// # use tracing::{span, Level};
13/// # fn main() {
14/// let span = span!(Level::TRACE, "my span");
15/// let _enter = span.enter();
16/// // do work inside the span...
17/// # }
18/// ```
19#[macro_export]
20macro_rules! span {
21    (target: $target:expr, parent: $parent:expr, $lvl:expr, $name:expr) => {
22        $crate::span!(target: $target, parent: $parent, $lvl, $name,)
23    };
24    (target: $target:expr, parent: $parent:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
25        {
26            use $crate::__macro_support::Callsite as _;
27            static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
28                name: $name,
29                kind: $crate::metadata::Kind::SPAN,
30                target: $target,
31                level: $lvl,
32                fields: $($fields)*
33            };
34            let mut interest = $crate::subscriber::Interest::never();
35            if $crate::level_enabled!($lvl)
36                && { interest = __CALLSITE.interest(); !interest.is_never() }
37                && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
38            {
39                let meta = __CALLSITE.metadata();
40                // span with explicit parent
41                $crate::Span::child_of(
42                    $parent,
43                    meta,
44                    &$crate::valueset!(meta.fields(), $($fields)*),
45                )
46            } else {
47                let span = $crate::__macro_support::__disabled_span(__CALLSITE.metadata());
48                $crate::if_log_enabled! { $lvl, {
49                    span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
50                }};
51                span
52            }
53        }
54    };
55    (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
56        {
57            use $crate::__macro_support::Callsite as _;
58            static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
59                name: $name,
60                kind: $crate::metadata::Kind::SPAN,
61                target: $target,
62                level: $lvl,
63                fields: $($fields)*
64            };
65            let mut interest = $crate::subscriber::Interest::never();
66            if $crate::level_enabled!($lvl)
67                && { interest = __CALLSITE.interest(); !interest.is_never() }
68                && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
69            {
70                let meta = __CALLSITE.metadata();
71                // span with contextual parent
72                $crate::Span::new(
73                    meta,
74                    &$crate::valueset!(meta.fields(), $($fields)*),
75                )
76            } else {
77                let span = $crate::__macro_support::__disabled_span(__CALLSITE.metadata());
78                $crate::if_log_enabled! { $lvl, {
79                    span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
80                }};
81                span
82            }
83        }
84    };
85    (target: $target:expr, parent: $parent:expr, $lvl:expr, $name:expr) => {
86        $crate::span!(target: $target, parent: $parent, $lvl, $name,)
87    };
88    (parent: $parent:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
89        $crate::span!(
90            target: module_path!(),
91            parent: $parent,
92            $lvl,
93            $name,
94            $($fields)*
95        )
96    };
97    (parent: $parent:expr, $lvl:expr, $name:expr) => {
98        $crate::span!(
99            target: module_path!(),
100            parent: $parent,
101            $lvl,
102            $name,
103        )
104    };
105    (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
106        $crate::span!(
107            target: $target,
108            $lvl,
109            $name,
110            $($fields)*
111        )
112    };
113    (target: $target:expr, $lvl:expr, $name:expr) => {
114        $crate::span!(target: $target, $lvl, $name,)
115    };
116    ($lvl:expr, $name:expr, $($fields:tt)*) => {
117        $crate::span!(
118            target: module_path!(),
119            $lvl,
120            $name,
121            $($fields)*
122        )
123    };
124    ($lvl:expr, $name:expr) => {
125        $crate::span!(
126            target: module_path!(),
127            $lvl,
128            $name,
129        )
130    };
131}
132
133/// Records multiple values on a span in a single call. As with recording
134/// individual values, all fields must be declared when the span is created.
135///
136/// This macro supports two optional sigils:
137/// - `%` uses the Display implementation.
138/// - `?` uses the Debug implementation.
139///
140/// For more details, see the [top-level documentation][lib].
141///
142/// [lib]: tracing/#recording-fields
143///
144/// # Examples
145///
146/// ```
147/// # use tracing::{field, info_span, record_all};
148/// let span = info_span!("my span", field1 = field::Empty, field2 = field::Empty, field3 = field::Empty).entered();
149/// record_all!(span, field1 = ?"1", field2 = %"2", field3 = 3);
150/// ```
151#[macro_export]
152macro_rules! record_all {
153    ($span:expr, $($fields:tt)*) => {
154        if let Some(meta) = $span.metadata() {
155            $span.record_all(&$crate::valueset!(
156                meta.fields(),
157                $($fields)*
158            ));
159        }
160    };
161}
162
163/// Constructs a span at the trace level.
164///
165/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
166/// macro.
167///
168/// See [the top-level documentation][lib] for details on the syntax accepted by
169/// this macro.
170///
171/// [lib]: crate#using-the-macros
172/// [attributes]: crate#configuring-attributes
173/// [Fields]: crate#recording-fields
174/// [`span!`]: crate::span!
175///
176/// # Examples
177///
178/// ```rust
179/// # use tracing::{trace_span, span, Level};
180/// # fn main() {
181/// trace_span!("my_span");
182/// // is equivalent to:
183/// span!(Level::TRACE, "my_span");
184/// # }
185/// ```
186///
187/// ```rust
188/// # use tracing::{trace_span, span, Level};
189/// # fn main() {
190/// let span = trace_span!("my span");
191/// span.in_scope(|| {
192///     // do work inside the span...
193/// });
194/// # }
195/// ```
196#[macro_export]
197macro_rules! trace_span {
198    (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
199        $crate::span!(
200            target: $target,
201            parent: $parent,
202            $crate::Level::TRACE,
203            $name,
204            $($field)*
205        )
206    };
207    (target: $target:expr, parent: $parent:expr, $name:expr) => {
208        $crate::trace_span!(target: $target, parent: $parent, $name,)
209    };
210    (parent: $parent:expr, $name:expr, $($field:tt)*) => {
211        $crate::span!(
212            target: module_path!(),
213            parent: $parent,
214            $crate::Level::TRACE,
215            $name,
216            $($field)*
217        )
218    };
219    (parent: $parent:expr, $name:expr) => {
220        $crate::trace_span!(parent: $parent, $name,)
221    };
222    (target: $target:expr, $name:expr, $($field:tt)*) => {
223        $crate::span!(
224            target: $target,
225            $crate::Level::TRACE,
226            $name,
227            $($field)*
228        )
229    };
230    (target: $target:expr, $name:expr) => {
231        $crate::trace_span!(target: $target, $name,)
232    };
233    ($name:expr, $($field:tt)*) => {
234        $crate::span!(
235            target: module_path!(),
236            $crate::Level::TRACE,
237            $name,
238            $($field)*
239        )
240    };
241    ($name:expr) => { $crate::trace_span!($name,) };
242}
243
244/// Constructs a span at the debug level.
245///
246/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
247/// macro.
248///
249/// See [the top-level documentation][lib] for details on the syntax accepted by
250/// this macro.
251///
252/// [lib]: crate#using-the-macros
253/// [attributes]: crate#configuring-attributes
254/// [Fields]: crate#recording-fields
255/// [`span!`]: crate::span!
256///
257/// # Examples
258///
259/// ```rust
260/// # use tracing::{debug_span, span, Level};
261/// # fn main() {
262/// debug_span!("my_span");
263/// // is equivalent to:
264/// span!(Level::DEBUG, "my_span");
265/// # }
266/// ```
267///
268/// ```rust
269/// # use tracing::debug_span;
270/// # fn main() {
271/// let span = debug_span!("my span");
272/// span.in_scope(|| {
273///     // do work inside the span...
274/// });
275/// # }
276/// ```
277#[macro_export]
278macro_rules! debug_span {
279    (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
280        $crate::span!(
281            target: $target,
282            parent: $parent,
283            $crate::Level::DEBUG,
284            $name,
285            $($field)*
286        )
287    };
288    (target: $target:expr, parent: $parent:expr, $name:expr) => {
289        $crate::debug_span!(target: $target, parent: $parent, $name,)
290    };
291    (parent: $parent:expr, $name:expr, $($field:tt)*) => {
292        $crate::span!(
293            target: module_path!(),
294            parent: $parent,
295            $crate::Level::DEBUG,
296            $name,
297            $($field)*
298        )
299    };
300    (parent: $parent:expr, $name:expr) => {
301        $crate::debug_span!(parent: $parent, $name,)
302    };
303    (target: $target:expr, $name:expr, $($field:tt)*) => {
304        $crate::span!(
305            target: $target,
306            $crate::Level::DEBUG,
307            $name,
308            $($field)*
309        )
310    };
311    (target: $target:expr, $name:expr) => {
312        $crate::debug_span!(target: $target, $name,)
313    };
314    ($name:expr, $($field:tt)*) => {
315        $crate::span!(
316            target: module_path!(),
317            $crate::Level::DEBUG,
318            $name,
319            $($field)*
320        )
321    };
322    ($name:expr) => {$crate::debug_span!($name,)};
323}
324
325/// Constructs a span at the info level.
326///
327/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
328/// macro.
329///
330/// See [the top-level documentation][lib] for details on the syntax accepted by
331/// this macro.
332///
333/// [lib]: crate#using-the-macros
334/// [attributes]: crate#configuring-attributes
335/// [Fields]: crate#recording-fields
336/// [`span!`]: crate::span!
337///
338/// # Examples
339///
340/// ```rust
341/// # use tracing::{span, info_span, Level};
342/// # fn main() {
343/// info_span!("my_span");
344/// // is equivalent to:
345/// span!(Level::INFO, "my_span");
346/// # }
347/// ```
348///
349/// ```rust
350/// # use tracing::info_span;
351/// # fn main() {
352/// let span = info_span!("my span");
353/// span.in_scope(|| {
354///     // do work inside the span...
355/// });
356/// # }
357/// ```
358#[macro_export]
359macro_rules! info_span {
360    (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
361        $crate::span!(
362            target: $target,
363            parent: $parent,
364            $crate::Level::INFO,
365            $name,
366            $($field)*
367        )
368    };
369    (target: $target:expr, parent: $parent:expr, $name:expr) => {
370        $crate::info_span!(target: $target, parent: $parent, $name,)
371    };
372    (parent: $parent:expr, $name:expr, $($field:tt)*) => {
373        $crate::span!(
374            target: module_path!(),
375            parent: $parent,
376            $crate::Level::INFO,
377            $name,
378            $($field)*
379        )
380    };
381    (parent: $parent:expr, $name:expr) => {
382        $crate::info_span!(parent: $parent, $name,)
383    };
384    (target: $target:expr, $name:expr, $($field:tt)*) => {
385        $crate::span!(
386            target: $target,
387            $crate::Level::INFO,
388            $name,
389            $($field)*
390        )
391    };
392    (target: $target:expr, $name:expr) => {
393        $crate::info_span!(target: $target, $name,)
394    };
395    ($name:expr, $($field:tt)*) => {
396        $crate::span!(
397            target: module_path!(),
398            $crate::Level::INFO,
399            $name,
400            $($field)*
401        )
402    };
403    ($name:expr) => {$crate::info_span!($name,)};
404}
405
406/// Constructs a span at the warn level.
407///
408/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
409/// macro.
410///
411/// See [the top-level documentation][lib] for details on the syntax accepted by
412/// this macro.
413///
414/// [lib]: crate#using-the-macros
415/// [attributes]: crate#configuring-attributes
416/// [Fields]: crate#recording-fields
417/// [`span!`]: crate::span!
418///
419/// # Examples
420///
421/// ```rust
422/// # use tracing::{warn_span, span, Level};
423/// # fn main() {
424/// warn_span!("my_span");
425/// // is equivalent to:
426/// span!(Level::WARN, "my_span");
427/// # }
428/// ```
429///
430/// ```rust
431/// use tracing::warn_span;
432/// # fn main() {
433/// let span = warn_span!("my span");
434/// span.in_scope(|| {
435///     // do work inside the span...
436/// });
437/// # }
438/// ```
439#[macro_export]
440macro_rules! warn_span {
441    (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
442        $crate::span!(
443            target: $target,
444            parent: $parent,
445            $crate::Level::WARN,
446            $name,
447            $($field)*
448        )
449    };
450    (target: $target:expr, parent: $parent:expr, $name:expr) => {
451        $crate::warn_span!(target: $target, parent: $parent, $name,)
452    };
453    (parent: $parent:expr, $name:expr, $($field:tt)*) => {
454        $crate::span!(
455            target: module_path!(),
456            parent: $parent,
457            $crate::Level::WARN,
458            $name,
459            $($field)*
460        )
461    };
462    (parent: $parent:expr, $name:expr) => {
463        $crate::warn_span!(parent: $parent, $name,)
464    };
465    (target: $target:expr, $name:expr, $($field:tt)*) => {
466        $crate::span!(
467            target: $target,
468            $crate::Level::WARN,
469            $name,
470            $($field)*
471        )
472    };
473    (target: $target:expr, $name:expr) => {
474        $crate::warn_span!(target: $target, $name,)
475    };
476    ($name:expr, $($field:tt)*) => {
477        $crate::span!(
478            target: module_path!(),
479            $crate::Level::WARN,
480            $name,
481            $($field)*
482        )
483    };
484    ($name:expr) => {$crate::warn_span!($name,)};
485}
486/// Constructs a span at the error level.
487///
488/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
489/// macro.
490///
491/// See [the top-level documentation][lib] for details on the syntax accepted by
492/// this macro.
493///
494/// [lib]: crate#using-the-macros
495/// [attributes]: crate#configuring-attributes
496/// [Fields]: crate#recording-fields
497/// [`span!`]: crate::span!
498///
499/// # Examples
500///
501/// ```rust
502/// # use tracing::{span, error_span, Level};
503/// # fn main() {
504/// error_span!("my_span");
505/// // is equivalent to:
506/// span!(Level::ERROR, "my_span");
507/// # }
508/// ```
509///
510/// ```rust
511/// # use tracing::error_span;
512/// # fn main() {
513/// let span = error_span!("my span");
514/// span.in_scope(|| {
515///     // do work inside the span...
516/// });
517/// # }
518/// ```
519#[macro_export]
520macro_rules! error_span {
521    (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
522        $crate::span!(
523            target: $target,
524            parent: $parent,
525            $crate::Level::ERROR,
526            $name,
527            $($field)*
528        )
529    };
530    (target: $target:expr, parent: $parent:expr, $name:expr) => {
531        $crate::error_span!(target: $target, parent: $parent, $name,)
532    };
533    (parent: $parent:expr, $name:expr, $($field:tt)*) => {
534        $crate::span!(
535            target: module_path!(),
536            parent: $parent,
537            $crate::Level::ERROR,
538            $name,
539            $($field)*
540        )
541    };
542    (parent: $parent:expr, $name:expr) => {
543        $crate::error_span!(parent: $parent, $name,)
544    };
545    (target: $target:expr, $name:expr, $($field:tt)*) => {
546        $crate::span!(
547            target: $target,
548            $crate::Level::ERROR,
549            $name,
550            $($field)*
551        )
552    };
553    (target: $target:expr, $name:expr) => {
554        $crate::error_span!(target: $target, $name,)
555    };
556    ($name:expr, $($field:tt)*) => {
557        $crate::span!(
558            target: module_path!(),
559            $crate::Level::ERROR,
560            $name,
561            $($field)*
562        )
563    };
564    ($name:expr) => {$crate::error_span!($name,)};
565}
566
567/// Constructs a new `Event`.
568///
569/// The event macro is invoked with a `Level` and up to 32 key-value fields.
570/// Optionally, a format string and arguments may follow the fields; this will
571/// be used to construct an implicit field named "message".
572///
573/// See [the top-level documentation][lib] for details on the syntax accepted by
574/// this macro.
575///
576/// [lib]: crate#using-the-macros
577///
578/// # Examples
579///
580/// ```rust
581/// use tracing::{event, Level};
582///
583/// # fn main() {
584/// let data = (42, "forty-two");
585/// let private_data = "private";
586/// let error = "a bad error";
587///
588/// event!(Level::ERROR, %error, "Received error");
589/// event!(
590///     target: "app_events",
591///     Level::WARN,
592///     private_data,
593///     ?data,
594///     "App warning: {}",
595///     error
596/// );
597/// event!(name: "answer", Level::INFO, the_answer = data.0);
598/// event!(Level::INFO, the_answer = data.0);
599/// # }
600/// ```
601///
602// /// Note that *unlike `span!`*, `event!` requires a value for all fields. As
603// /// events are recorded immediately when the macro is invoked, there is no
604// /// opportunity for fields to be recorded later. A trailing comma on the final
605// /// field is valid.
606// ///
607// /// For example, the following does not compile:
608// /// ```rust,compile_fail
609// /// # use tracing::{Level, event};
610// /// # fn main() {
611// /// event!(Level::INFO, foo = 5, bad_field, bar = "hello")
612// /// #}
613// /// ```
614#[macro_export]
615macro_rules! event {
616    // Name / target / parent.
617    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({
618        use $crate::__macro_support::Callsite as _;
619        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
620            name: $name,
621            kind: $crate::metadata::Kind::EVENT,
622            target: $target,
623            level: $lvl,
624            fields: $($fields)*
625        };
626
627        let enabled = $crate::level_enabled!($lvl) && {
628            let interest = __CALLSITE.interest();
629            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
630        };
631        if enabled {
632            (|value_set: $crate::field::ValueSet| {
633                $crate::__tracing_log!(
634                    $lvl,
635                    __CALLSITE,
636                    &value_set
637                );
638                let meta = __CALLSITE.metadata();
639                // event with explicit parent
640                $crate::Event::child_of(
641                    $parent,
642                    meta,
643                    &value_set
644                );
645            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
646        } else {
647            $crate::__tracing_log!(
648                $lvl,
649                __CALLSITE,
650                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
651            );
652        }
653    });
654    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
655        $crate::event!(
656            name: $name,
657            target: $target,
658            parent: $parent,
659            $lvl,
660            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
661        )
662    );
663    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
664        $crate::event!(name: $name, target: $target, parent: $parent, $lvl, { $($k).+ = $($fields)* })
665    );
666    (name: $name:expr, target: $target:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => (
667        $crate::event!(name: $name, target: $target, parent: $parent, $lvl, { $($arg)+ })
668    );
669
670    // Name / target.
671    (name: $name:expr, target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
672        use $crate::__macro_support::Callsite as _;
673        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
674            name: $name,
675            kind: $crate::metadata::Kind::EVENT,
676            target: $target,
677            level: $lvl,
678            fields: $($fields)*
679        };
680        let enabled = $crate::level_enabled!($lvl) && {
681            let interest = __CALLSITE.interest();
682            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
683        };
684        if enabled {
685            (|value_set: $crate::field::ValueSet| {
686                let meta = __CALLSITE.metadata();
687                // event with contextual parent
688                $crate::Event::dispatch(
689                    meta,
690                    &value_set
691                );
692                $crate::__tracing_log!(
693                    $lvl,
694                    __CALLSITE,
695                    &value_set
696                );
697            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
698        } else {
699            $crate::__tracing_log!(
700                $lvl,
701                __CALLSITE,
702                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
703            );
704        }
705    });
706    (name: $name:expr, target: $target:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
707        $crate::event!(
708            name: $name,
709            target: $target,
710            $lvl,
711            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
712        )
713    );
714    (name: $name:expr, target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
715        $crate::event!(name: $name, target: $target, $lvl, { $($k).+ = $($fields)* })
716    );
717    (name: $name:expr, target: $target:expr, $lvl:expr, $($arg:tt)+) => (
718        $crate::event!(name: $name, target: $target, $lvl, { $($arg)+ })
719    );
720
721    // Target / parent.
722    (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({
723        use $crate::__macro_support::Callsite as _;
724        static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
725            name: $crate::__macro_support::concat!(
726                "event ",
727                $crate::__macro_support::file!(),
728                ":",
729                $crate::__macro_support::line!()
730            ),
731            kind: $crate::metadata::Kind::EVENT,
732            target: $target,
733            level: $lvl,
734            fields: $($fields)*
735        };
736
737        let enabled = $crate::level_enabled!($lvl) && {
738            let interest = __CALLSITE.interest();
739            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
740        };
741        if enabled {
742            (|value_set: $crate::field::ValueSet| {
743                $crate::__tracing_log!(
744                    $lvl,
745                    __CALLSITE,
746                    &value_set
747                );
748                let meta = __CALLSITE.metadata();
749                // event with explicit parent
750                $crate::Event::child_of(
751                    $parent,
752                    meta,
753                    &value_set
754                );
755            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
756        } else {
757            $crate::__tracing_log!(
758                $lvl,
759                __CALLSITE,
760                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
761            );
762        }
763    });
764    (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
765        $crate::event!(
766            target: $target,
767            parent: $parent,
768            $lvl,
769            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
770        )
771    );
772    (target: $target:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
773        $crate::event!(target: $target, parent: $parent, $lvl, { $($k).+ = $($fields)* })
774    );
775    (target: $target:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => (
776        $crate::event!(target: $target, parent: $parent, $lvl, { $($arg)+ })
777    );
778
779    // Name / parent.
780    (name: $name:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({
781        use $crate::__macro_support::Callsite as _;
782        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
783            name: $name,
784            kind: $crate::metadata::Kind::EVENT,
785            target: module_path!(),
786            level: $lvl,
787            fields: $($fields)*
788        };
789
790        let enabled = $crate::level_enabled!($lvl) && {
791            let interest = __CALLSITE.interest();
792            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
793        };
794        if enabled {
795            (|value_set: $crate::field::ValueSet| {
796                $crate::__tracing_log!(
797                    $lvl,
798                    __CALLSITE,
799                    &value_set
800                );
801                let meta = __CALLSITE.metadata();
802                // event with explicit parent
803                $crate::Event::child_of(
804                    $parent,
805                    meta,
806                    &value_set
807                );
808            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
809        } else {
810            $crate::__tracing_log!(
811                $lvl,
812                __CALLSITE,
813                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
814            );
815        }
816    });
817    (name: $name:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
818        $crate::event!(
819            name: $name,
820            parent: $parent,
821            $lvl,
822            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
823        )
824    );
825    (name: $name:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
826        $crate::event!(name: $name, parent: $parent, $lvl, { $($k).+ = $($fields)* })
827    );
828    (name: $name:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => (
829        $crate::event!(name: $name, parent: $parent, $lvl, { $($arg)+ })
830    );
831
832    // Name.
833    (name: $name:expr, $lvl:expr, { $($fields:tt)* } )=> ({
834        use $crate::__macro_support::Callsite as _;
835        static __CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
836            name: $name,
837            kind: $crate::metadata::Kind::EVENT,
838            target: module_path!(),
839            level: $lvl,
840            fields: $($fields)*
841        };
842        let enabled = $crate::level_enabled!($lvl) && {
843            let interest = __CALLSITE.interest();
844            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
845        };
846        if enabled {
847            (|value_set: $crate::field::ValueSet| {
848                let meta = __CALLSITE.metadata();
849                // event with contextual parent
850                $crate::Event::dispatch(
851                    meta,
852                    &value_set
853                );
854                $crate::__tracing_log!(
855                    $lvl,
856                    __CALLSITE,
857                    &value_set
858                );
859            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
860        } else {
861            $crate::__tracing_log!(
862                $lvl,
863                __CALLSITE,
864                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
865            );
866        }
867    });
868    (name: $name:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
869        $crate::event!(
870            name: $name,
871            $lvl,
872            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
873        )
874    );
875    (name: $name:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
876        $crate::event!(name: $name, $lvl, { $($k).+ = $($fields)* })
877    );
878    (name: $name:expr, $lvl:expr, $($arg:tt)+ ) => (
879        $crate::event!(name: $name, $lvl, { $($arg)+ })
880    );
881
882    // Target.
883    (target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
884        use $crate::__macro_support::Callsite as _;
885        static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
886            name: $crate::__macro_support::concat!(
887                "event ",
888                $crate::__macro_support::file!(),
889                ":",
890                $crate::__macro_support::line!()
891            ),
892            kind: $crate::metadata::Kind::EVENT,
893            target: $target,
894            level: $lvl,
895            fields: $($fields)*
896        };
897        let enabled = $crate::level_enabled!($lvl) && {
898            let interest = __CALLSITE.interest();
899            !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest)
900        };
901        if enabled {
902            (|value_set: $crate::field::ValueSet| {
903                let meta = __CALLSITE.metadata();
904                // event with contextual parent
905                $crate::Event::dispatch(
906                    meta,
907                    &value_set
908                );
909                $crate::__tracing_log!(
910                    $lvl,
911                    __CALLSITE,
912                    &value_set
913                );
914            })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*));
915        } else {
916            $crate::__tracing_log!(
917                $lvl,
918                __CALLSITE,
919                &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)
920            );
921        }
922    });
923    (target: $target:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
924        $crate::event!(
925            target: $target,
926            $lvl,
927            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
928        )
929    );
930    (target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
931        $crate::event!(target: $target, $lvl, { $($k).+ = $($fields)* })
932    );
933    (target: $target:expr, $lvl:expr, $($arg:tt)+ ) => (
934        $crate::event!(target: $target, $lvl, { $($arg)+ })
935    );
936
937    // Parent.
938    (parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
939        $crate::event!(
940            target: module_path!(),
941            parent: $parent,
942            $lvl,
943            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
944        )
945    );
946    (parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($field:tt)*) => (
947        $crate::event!(
948            target: module_path!(),
949            parent: $parent,
950            $lvl,
951            { $($k).+ = $($field)*}
952        )
953    );
954    (parent: $parent:expr, $lvl:expr, ?$($k:ident).+ = $($field:tt)*) => (
955        $crate::event!(
956            target: module_path!(),
957            parent: $parent,
958            $lvl,
959            { ?$($k).+ = $($field)*}
960        )
961    );
962    (parent: $parent:expr, $lvl:expr, %$($k:ident).+ = $($field:tt)*) => (
963        $crate::event!(
964            target: module_path!(),
965            parent: $parent,
966            $lvl,
967            { %$($k).+ = $($field)*}
968        )
969    );
970    (parent: $parent:expr, $lvl:expr, $($k:ident).+, $($field:tt)*) => (
971        $crate::event!(
972            target: module_path!(),
973            parent: $parent,
974            $lvl,
975            { $($k).+, $($field)*}
976        )
977    );
978    (parent: $parent:expr, $lvl:expr, %$($k:ident).+, $($field:tt)*) => (
979        $crate::event!(
980            target: module_path!(),
981            parent: $parent,
982            $lvl,
983            { %$($k).+, $($field)*}
984        )
985    );
986    (parent: $parent:expr, $lvl:expr, ?$($k:ident).+, $($field:tt)*) => (
987        $crate::event!(
988            target: module_path!(),
989            parent: $parent,
990            $lvl,
991            { ?$($k).+, $($field)*}
992        )
993    );
994    (parent: $parent:expr, $lvl:expr, $($arg:tt)+ ) => (
995        $crate::event!(target: module_path!(), parent: $parent, $lvl, { $($arg)+ })
996    );
997
998    // ...
999    ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
1000        $crate::event!(
1001            target: module_path!(),
1002            $lvl,
1003            { message = $crate::__macro_support::format_args!($($arg)+), $($fields)* }
1004        )
1005    );
1006    ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
1007        $crate::event!(
1008            target: module_path!(),
1009            $lvl,
1010            { message = format_args!($($arg)+), $($fields)* }
1011        )
1012    );
1013    ($lvl:expr, $($k:ident).+ = $($field:tt)*) => (
1014        $crate::event!(
1015            target: module_path!(),
1016            $lvl,
1017            { $($k).+ = $($field)*}
1018        )
1019    );
1020    ($lvl:expr, $($k:ident).+, $($field:tt)*) => (
1021        $crate::event!(
1022            target: module_path!(),
1023            $lvl,
1024            { $($k).+, $($field)*}
1025        )
1026    );
1027    ($lvl:expr, ?$($k:ident).+, $($field:tt)*) => (
1028        $crate::event!(
1029            target: module_path!(),
1030            $lvl,
1031            { ?$($k).+, $($field)*}
1032        )
1033    );
1034    ($lvl:expr, %$($k:ident).+, $($field:tt)*) => (
1035        $crate::event!(
1036            target: module_path!(),
1037            $lvl,
1038            { %$($k).+, $($field)*}
1039        )
1040    );
1041    ($lvl:expr, ?$($k:ident).+) => (
1042        $crate::event!($lvl, ?$($k).+,)
1043    );
1044    ($lvl:expr, %$($k:ident).+) => (
1045        $crate::event!($lvl, %$($k).+,)
1046    );
1047    ($lvl:expr, $($k:ident).+) => (
1048        $crate::event!($lvl, $($k).+,)
1049    );
1050    ( $lvl:expr, $($arg:tt)+ ) => (
1051        $crate::event!(target: module_path!(), $lvl, { $($arg)+ })
1052    );
1053}
1054
1055/// Tests whether an event with the specified level and target would be enabled.
1056///
1057/// This is similar to [`enabled!`], but queries the current subscriber specifically for
1058/// an event, whereas [`enabled!`] queries for an event _or_ span.
1059///
1060/// See the documentation for [`enabled!]` for more details on using this macro.
1061/// See also [`span_enabled!`].
1062///
1063/// # Examples
1064///
1065/// ```rust
1066/// # use tracing::{event_enabled, Level};
1067/// if event_enabled!(target: "my_crate", Level::DEBUG) {
1068///     // some expensive work...
1069/// }
1070/// // simpler
1071/// if event_enabled!(Level::DEBUG) {
1072///     // some expensive work...
1073/// }
1074/// // with fields
1075/// if event_enabled!(Level::DEBUG, foo_field) {
1076///     // some expensive work...
1077/// }
1078/// ```
1079///
1080/// [`enabled!`]: crate::enabled
1081/// [`span_enabled!`]: crate::span_enabled
1082#[macro_export]
1083macro_rules! event_enabled {
1084    ($($rest:tt)*)=> (
1085        $crate::enabled!(kind: $crate::metadata::Kind::EVENT, $($rest)*)
1086    )
1087}
1088
1089/// Tests whether a span with the specified level and target would be enabled.
1090///
1091/// This is similar to [`enabled!`], but queries the current subscriber specifically for
1092/// an event, whereas [`enabled!`] queries for an event _or_ span.
1093///
1094/// See the documentation for [`enabled!]` for more details on using this macro.
1095/// See also [`span_enabled!`].
1096///
1097/// # Examples
1098///
1099/// ```rust
1100/// # use tracing::{span_enabled, Level};
1101/// if span_enabled!(target: "my_crate", Level::DEBUG) {
1102///     // some expensive work...
1103/// }
1104/// // simpler
1105/// if span_enabled!(Level::DEBUG) {
1106///     // some expensive work...
1107/// }
1108/// // with fields
1109/// if span_enabled!(Level::DEBUG, foo_field) {
1110///     // some expensive work...
1111/// }
1112/// ```
1113///
1114/// [`enabled!`]: crate::enabled
1115/// [`span_enabled!`]: crate::span_enabled
1116#[macro_export]
1117macro_rules! span_enabled {
1118    ($($rest:tt)*)=> (
1119        $crate::enabled!(kind: $crate::metadata::Kind::SPAN, $($rest)*)
1120    )
1121}
1122
1123/// Checks whether a span or event is [enabled] based on the provided [metadata].
1124///
1125/// [enabled]: crate::Subscriber::enabled
1126/// [metadata]: crate::Metadata
1127///
1128/// This macro is a specialized tool: it is intended to be used prior
1129/// to an expensive computation required *just* for that event, but
1130/// *cannot* be done as part of an argument to that event, such as
1131/// when multiple events are emitted (e.g., iterating over a collection
1132/// and emitting an event for each item).
1133///
1134/// # Usage
1135///
1136/// [Subscribers] can make filtering decisions based all the data included in a
1137/// span or event's [`Metadata`]. This means that it is possible for `enabled!`
1138/// to return a _false positive_ (indicating that something would be enabled
1139/// when it actually would not be) or a _false negative_ (indicating that
1140/// something would be disabled when it would actually be enabled).
1141///
1142/// [Subscribers]: crate::subscriber::Subscriber
1143/// [`Metadata`]: crate::metadata::Metadata
1144///
1145/// This occurs when a subscriber is using a _more specific_ filter than the
1146/// metadata provided to the `enabled!` macro. Some situations that can result
1147/// in false positives or false negatives include:
1148///
1149/// - If a subscriber is using a filter which may enable a span or event based
1150///   on field names, but `enabled!` is invoked without listing field names,
1151///   `enabled!` may return a false negative if a specific field name would
1152///   cause the subscriber to enable something that would otherwise be disabled.
1153/// - If a subscriber is using a filter which enables or disables specific events by
1154///   file path and line number,  a particular event may be enabled/disabled
1155///   even if an `enabled!` invocation with the same level, target, and fields
1156///   indicated otherwise.
1157/// - The subscriber can choose to enable _only_ spans or _only_ events, which `enabled`
1158///   will not reflect.
1159///
1160/// `enabled!()` requires a [level](crate::Level) argument, an optional `target:`
1161/// argument, and an optional set of field names. If the fields are not provided,
1162/// they are considered to be unknown. `enabled!` attempts to match the
1163/// syntax of `event!()` as closely as possible, which can be seen in the
1164/// examples below.
1165///
1166/// # Examples
1167///
1168/// If the current subscriber is interested in recording `DEBUG`-level spans and
1169/// events in the current file and module path, this will evaluate to true:
1170/// ```rust
1171/// use tracing::{enabled, Level};
1172///
1173/// if enabled!(Level::DEBUG) {
1174///     // some expensive work...
1175/// }
1176/// ```
1177///
1178/// If the current subscriber is interested in recording spans and events
1179/// in the current file and module path, with the target "my_crate", and at the
1180/// level  `DEBUG`, this will evaluate to true:
1181/// ```rust
1182/// # use tracing::{enabled, Level};
1183/// if enabled!(target: "my_crate", Level::DEBUG) {
1184///     // some expensive work...
1185/// }
1186/// ```
1187///
1188/// If the current subscriber is interested in recording spans and events
1189/// in the current file and module path, with the target "my_crate", at
1190/// the level `DEBUG`, and with a field named "hello", this will evaluate
1191/// to true:
1192///
1193/// ```rust
1194/// # use tracing::{enabled, Level};
1195/// if enabled!(target: "my_crate", Level::DEBUG, hello) {
1196///     // some expensive work...
1197/// }
1198/// ```
1199///
1200/// # Alternatives
1201///
1202/// `enabled!` queries subscribers with [`Metadata`] where
1203/// [`is_event`] and [`is_span`] both return `false`. Alternatively,
1204/// use [`event_enabled!`] or [`span_enabled!`] to ensure one of these
1205/// returns true.
1206///
1207///
1208/// [`Metadata`]: crate::Metadata
1209/// [`is_event`]: crate::Metadata::is_event
1210/// [`is_span`]: crate::Metadata::is_span
1211/// [`enabled!`]: crate::enabled
1212/// [`span_enabled!`]: crate::span_enabled
1213#[macro_export]
1214macro_rules! enabled {
1215    (kind: $kind:expr, target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
1216        if $crate::level_enabled!($lvl) {
1217            use $crate::__macro_support::Callsite as _;
1218            static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! {
1219                name: $crate::__macro_support::concat!(
1220                    "enabled ",
1221                    $crate::__macro_support::file!(),
1222                    ":",
1223                    $crate::__macro_support::line!()
1224                ),
1225                kind: $kind.hint(),
1226                target: $target,
1227                level: $lvl,
1228                fields: $($fields)*
1229            };
1230            let interest = __CALLSITE.interest();
1231            if !interest.is_never() && $crate::__macro_support::__is_enabled(__CALLSITE.metadata(), interest) {
1232                let meta = __CALLSITE.metadata();
1233                $crate::dispatcher::get_default(|current| current.enabled(meta))
1234            } else {
1235                false
1236            }
1237        } else {
1238            false
1239        }
1240    });
1241    // Just target and level
1242    (kind: $kind:expr, target: $target:expr, $lvl:expr ) => (
1243        $crate::enabled!(kind: $kind, target: $target, $lvl, { })
1244    );
1245    (target: $target:expr, $lvl:expr ) => (
1246        $crate::enabled!(kind: $crate::metadata::Kind::HINT, target: $target, $lvl, { })
1247    );
1248
1249    // These four cases handle fields with no values
1250    (kind: $kind:expr, target: $target:expr, $lvl:expr, $($field:tt)*) => (
1251        $crate::enabled!(
1252            kind: $kind,
1253            target: $target,
1254            $lvl,
1255            { $($field)*}
1256        )
1257    );
1258    (target: $target:expr, $lvl:expr, $($field:tt)*) => (
1259        $crate::enabled!(
1260            kind: $crate::metadata::Kind::HINT,
1261            target: $target,
1262            $lvl,
1263            { $($field)*}
1264        )
1265    );
1266
1267    // Level and field case
1268    (kind: $kind:expr, $lvl:expr, $($field:tt)*) => (
1269        $crate::enabled!(
1270            kind: $kind,
1271            target: module_path!(),
1272            $lvl,
1273            { $($field)*}
1274        )
1275    );
1276
1277    // Simplest `enabled!` case
1278    (kind: $kind:expr, $lvl:expr) => (
1279        $crate::enabled!(kind: $kind, target: module_path!(), $lvl, { })
1280    );
1281    ($lvl:expr) => (
1282        $crate::enabled!(kind: $crate::metadata::Kind::HINT, target: module_path!(), $lvl, { })
1283    );
1284
1285    // Fallthrough from above
1286    ($lvl:expr, $($field:tt)*) => (
1287        $crate::enabled!(
1288            kind: $crate::metadata::Kind::HINT,
1289            target: module_path!(),
1290            $lvl,
1291            { $($field)*}
1292        )
1293    );
1294}
1295
1296/// Constructs an event at the trace level.
1297///
1298/// This functions similarly to the [`event!`] macro. See [the top-level
1299/// documentation][lib] for details on the syntax accepted by
1300/// this macro.
1301///
1302/// [`event!`]: crate::event!
1303/// [lib]: crate#using-the-macros
1304///
1305/// # Examples
1306///
1307/// ```rust
1308/// use tracing::trace;
1309/// # #[derive(Debug, Copy, Clone)] struct Position { x: f32, y: f32 }
1310/// # impl Position {
1311/// # const ORIGIN: Self = Self { x: 0.0, y: 0.0 };
1312/// # fn dist(&self, other: Position) -> f32 {
1313/// #    let x = (other.x - self.x).exp2(); let y = (self.y - other.y).exp2();
1314/// #    (x + y).sqrt()
1315/// # }
1316/// # }
1317/// # fn main() {
1318/// let pos = Position { x: 3.234, y: -1.223 };
1319/// let origin_dist = pos.dist(Position::ORIGIN);
1320///
1321/// trace!(position = ?pos, ?origin_dist);
1322/// trace!(
1323///     target: "app_events",
1324///     position = ?pos,
1325///     "x is {} and y is {}",
1326///     if pos.x >= 0.0 { "positive" } else { "negative" },
1327///     if pos.y >= 0.0 { "positive" } else { "negative" }
1328/// );
1329/// trace!(name: "completed", position = ?pos);
1330/// # }
1331/// ```
1332#[macro_export]
1333macro_rules! trace {
1334    // Name / target / parent.
1335    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1336        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*)
1337    );
1338    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1339        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)* })
1340    );
1341    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1342        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { ?$($k).+ $($field)* })
1343    );
1344    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1345        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, { %$($k).+ $($field)* })
1346    );
1347    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1348        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+)
1349    );
1350
1351    // Name / target.
1352    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1353        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*)
1354    );
1355    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1356        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { $($k).+ $($field)* })
1357    );
1358    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1359        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { ?$($k).+ $($field)* })
1360    );
1361    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1362        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* })
1363    );
1364    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
1365        $crate::event!(name: $name, target: $target, $crate::Level::TRACE, {}, $($arg)+)
1366    );
1367
1368    // Target / parent.
1369    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1370        $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*)
1371    );
1372    (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1373        $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)* })
1374    );
1375    (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1376        $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { ?$($k).+ $($field)* })
1377    );
1378    (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1379        $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { %$($k).+ $($field)* })
1380    );
1381    (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1382        $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+)
1383    );
1384
1385    // Name / parent.
1386    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1387        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*)
1388    );
1389    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1390        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)* })
1391    );
1392    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1393        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { ?$($k).+ $($field)* })
1394    );
1395    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1396        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, { %$($k).+ $($field)* })
1397    );
1398    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1399        $crate::event!(name: $name, parent: $parent, $crate::Level::TRACE, {}, $($arg)+)
1400    );
1401
1402    // Name.
1403    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1404        $crate::event!(name: $name, $crate::Level::TRACE, { $($field)* }, $($arg)*)
1405    );
1406    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
1407        $crate::event!(name: $name, $crate::Level::TRACE, { $($k).+ $($field)* })
1408    );
1409    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
1410        $crate::event!(name: $name, $crate::Level::TRACE, { ?$($k).+ $($field)* })
1411    );
1412    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
1413        $crate::event!(name: $name, $crate::Level::TRACE, { %$($k).+ $($field)* })
1414    );
1415    (name: $name:expr, $($arg:tt)+ ) => (
1416        $crate::event!(name: $name, $crate::Level::TRACE, {}, $($arg)+)
1417    );
1418
1419    // Target.
1420    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1421        $crate::event!(target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*)
1422    );
1423    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1424        $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)* })
1425    );
1426    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1427        $crate::event!(target: $target, $crate::Level::TRACE, { ?$($k).+ $($field)* })
1428    );
1429    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1430        $crate::event!(target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* })
1431    );
1432    (target: $target:expr, $($arg:tt)+ ) => (
1433        $crate::event!(target: $target, $crate::Level::TRACE, {}, $($arg)+)
1434    );
1435
1436    // Parent.
1437    (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
1438        $crate::event!(
1439            target: module_path!(),
1440            parent: $parent,
1441            $crate::Level::TRACE,
1442            { $($field)+ },
1443            $($arg)+
1444        )
1445    );
1446    (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
1447        $crate::event!(
1448            target: module_path!(),
1449            parent: $parent,
1450            $crate::Level::TRACE,
1451            { $($k).+ = $($field)*}
1452        )
1453    );
1454    (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
1455        $crate::event!(
1456            target: module_path!(),
1457            parent: $parent,
1458            $crate::Level::TRACE,
1459            { ?$($k).+ = $($field)*}
1460        )
1461    );
1462    (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
1463        $crate::event!(
1464            target: module_path!(),
1465            parent: $parent,
1466            $crate::Level::TRACE,
1467            { %$($k).+ = $($field)*}
1468        )
1469    );
1470    (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
1471        $crate::event!(
1472            target: module_path!(),
1473            parent: $parent,
1474            $crate::Level::TRACE,
1475            { $($k).+, $($field)*}
1476        )
1477    );
1478    (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
1479        $crate::event!(
1480            target: module_path!(),
1481            parent: $parent,
1482            $crate::Level::TRACE,
1483            { ?$($k).+, $($field)*}
1484        )
1485    );
1486    (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
1487        $crate::event!(
1488            target: module_path!(),
1489            parent: $parent,
1490            $crate::Level::TRACE,
1491            { %$($k).+, $($field)*}
1492        )
1493    );
1494    (parent: $parent:expr, $($arg:tt)+) => (
1495        $crate::event!(
1496            target: module_path!(),
1497            parent: $parent,
1498            $crate::Level::TRACE,
1499            {},
1500            $($arg)+
1501        )
1502    );
1503
1504    // ...
1505    ({ $($field:tt)+ }, $($arg:tt)+ ) => (
1506        $crate::event!(
1507            target: module_path!(),
1508            $crate::Level::TRACE,
1509            { $($field)+ },
1510            $($arg)+
1511        )
1512    );
1513    ($($k:ident).+ = $($field:tt)*) => (
1514        $crate::event!(
1515            target: module_path!(),
1516            $crate::Level::TRACE,
1517            { $($k).+ = $($field)*}
1518        )
1519    );
1520    (?$($k:ident).+ = $($field:tt)*) => (
1521        $crate::event!(
1522            target: module_path!(),
1523            $crate::Level::TRACE,
1524            { ?$($k).+ = $($field)*}
1525        )
1526    );
1527    (%$($k:ident).+ = $($field:tt)*) => (
1528        $crate::event!(
1529            target: module_path!(),
1530            $crate::Level::TRACE,
1531            { %$($k).+ = $($field)*}
1532        )
1533    );
1534    ($($k:ident).+, $($field:tt)*) => (
1535        $crate::event!(
1536            target: module_path!(),
1537            $crate::Level::TRACE,
1538            { $($k).+, $($field)*}
1539        )
1540    );
1541    (?$($k:ident).+, $($field:tt)*) => (
1542        $crate::event!(
1543            target: module_path!(),
1544            $crate::Level::TRACE,
1545            { ?$($k).+, $($field)*}
1546        )
1547    );
1548    (%$($k:ident).+, $($field:tt)*) => (
1549        $crate::event!(
1550            target: module_path!(),
1551            $crate::Level::TRACE,
1552            { %$($k).+, $($field)*}
1553        )
1554    );
1555    (?$($k:ident).+) => (
1556        $crate::event!(
1557            target: module_path!(),
1558            $crate::Level::TRACE,
1559            { ?$($k).+ }
1560        )
1561    );
1562    (%$($k:ident).+) => (
1563        $crate::event!(
1564            target: module_path!(),
1565            $crate::Level::TRACE,
1566            { %$($k).+ }
1567        )
1568    );
1569    ($($k:ident).+) => (
1570        $crate::event!(
1571            target: module_path!(),
1572            $crate::Level::TRACE,
1573            { $($k).+ }
1574        )
1575    );
1576    ($($arg:tt)+) => (
1577        $crate::event!(
1578            target: module_path!(),
1579            $crate::Level::TRACE,
1580            $($arg)+
1581        )
1582    );
1583}
1584
1585/// Constructs an event at the debug level.
1586///
1587/// This functions similarly to the [`event!`] macro. See [the top-level
1588/// documentation][lib] for details on the syntax accepted by
1589/// this macro.
1590///
1591/// [`event!`]: crate::event!
1592/// [lib]: crate#using-the-macros
1593///
1594/// # Examples
1595///
1596/// ```rust
1597/// use tracing::debug;
1598/// # fn main() {
1599/// # #[derive(Debug)] struct Position { x: f32, y: f32 }
1600///
1601/// let pos = Position { x: 3.234, y: -1.223 };
1602///
1603/// debug!(?pos.x, ?pos.y);
1604/// debug!(target: "app_events", position = ?pos, "New position");
1605/// debug!(name: "completed", position = ?pos);
1606/// # }
1607/// ```
1608#[macro_export]
1609macro_rules! debug {
1610    // Name / target / parent.
1611    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1612        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1613    );
1614    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1615        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)* })
1616    );
1617    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1618        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
1619    );
1620    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1621        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, { %$($k).+ $($field)* })
1622    );
1623    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1624        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+)
1625    );
1626
1627    // Name / target.
1628    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1629        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1630    );
1631    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1632        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { $($k).+ $($field)* })
1633    );
1634    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1635        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
1636    );
1637    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1638        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* })
1639    );
1640    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
1641        $crate::event!(name: $name, target: $target, $crate::Level::DEBUG, {}, $($arg)+)
1642    );
1643
1644    // Target / parent.
1645    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1646        $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1647    );
1648    (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1649        $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)* })
1650    );
1651    (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1652        $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
1653    );
1654    (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1655        $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { %$($k).+ $($field)* })
1656    );
1657    (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1658        $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+)
1659    );
1660
1661    // Name / parent.
1662    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1663        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1664    );
1665    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1666        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)* })
1667    );
1668    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1669        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
1670    );
1671    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1672        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, { %$($k).+ $($field)* })
1673    );
1674    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1675        $crate::event!(name: $name, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+)
1676    );
1677
1678    // Name.
1679    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1680        $crate::event!(name: $name, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1681    );
1682    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
1683        $crate::event!(name: $name, $crate::Level::DEBUG, { $($k).+ $($field)* })
1684    );
1685    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
1686        $crate::event!(name: $name, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
1687    );
1688    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
1689        $crate::event!(name: $name, $crate::Level::DEBUG, { %$($k).+ $($field)* })
1690    );
1691    (name: $name:expr, $($arg:tt)+ ) => (
1692        $crate::event!(name: $name, $crate::Level::DEBUG, {}, $($arg)+)
1693    );
1694
1695    // Target.
1696    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1697        $crate::event!(target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1698    );
1699    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1700        $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)* })
1701    );
1702    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1703        $crate::event!(target: $target, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
1704    );
1705    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1706        $crate::event!(target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* })
1707    );
1708    (target: $target:expr, $($arg:tt)+ ) => (
1709        $crate::event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+)
1710    );
1711
1712    // Parent.
1713    (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
1714        $crate::event!(
1715            target: module_path!(),
1716            parent: $parent,
1717            $crate::Level::DEBUG,
1718            { $($field)+ },
1719            $($arg)+
1720        )
1721    );
1722    (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
1723        $crate::event!(
1724            target: module_path!(),
1725            parent: $parent,
1726            $crate::Level::DEBUG,
1727            { $($k).+ = $($field)*}
1728        )
1729    );
1730    (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
1731        $crate::event!(
1732            target: module_path!(),
1733            parent: $parent,
1734            $crate::Level::DEBUG,
1735            { ?$($k).+ = $($field)*}
1736        )
1737    );
1738    (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
1739        $crate::event!(
1740            target: module_path!(),
1741            parent: $parent,
1742            $crate::Level::DEBUG,
1743            { %$($k).+ = $($field)*}
1744        )
1745    );
1746    (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
1747        $crate::event!(
1748            target: module_path!(),
1749            parent: $parent,
1750            $crate::Level::DEBUG,
1751            { $($k).+, $($field)*}
1752        )
1753    );
1754    (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
1755        $crate::event!(
1756            target: module_path!(),
1757            parent: $parent,
1758            $crate::Level::DEBUG,
1759            { ?$($k).+, $($field)*}
1760        )
1761    );
1762    (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
1763        $crate::event!(
1764            target: module_path!(),
1765            parent: $parent,
1766            $crate::Level::DEBUG,
1767            { %$($k).+, $($field)*}
1768        )
1769    );
1770    (parent: $parent:expr, $($arg:tt)+) => (
1771        $crate::event!(
1772            target: module_path!(),
1773            parent: $parent,
1774            $crate::Level::DEBUG,
1775            {},
1776            $($arg)+
1777        )
1778    );
1779
1780    // ...
1781    ({ $($field:tt)+ }, $($arg:tt)+ ) => (
1782        $crate::event!(
1783            target: module_path!(),
1784            $crate::Level::DEBUG,
1785            { $($field)+ },
1786            $($arg)+
1787        )
1788    );
1789    ($($k:ident).+ = $($field:tt)*) => (
1790        $crate::event!(
1791            target: module_path!(),
1792            $crate::Level::DEBUG,
1793            { $($k).+ = $($field)*}
1794        )
1795    );
1796    (?$($k:ident).+ = $($field:tt)*) => (
1797        $crate::event!(
1798            target: module_path!(),
1799            $crate::Level::DEBUG,
1800            { ?$($k).+ = $($field)*}
1801        )
1802    );
1803    (%$($k:ident).+ = $($field:tt)*) => (
1804        $crate::event!(
1805            target: module_path!(),
1806            $crate::Level::DEBUG,
1807            { %$($k).+ = $($field)*}
1808        )
1809    );
1810    ($($k:ident).+, $($field:tt)*) => (
1811        $crate::event!(
1812            target: module_path!(),
1813            $crate::Level::DEBUG,
1814            { $($k).+, $($field)*}
1815        )
1816    );
1817    (?$($k:ident).+, $($field:tt)*) => (
1818        $crate::event!(
1819            target: module_path!(),
1820            $crate::Level::DEBUG,
1821            { ?$($k).+, $($field)*}
1822        )
1823    );
1824    (%$($k:ident).+, $($field:tt)*) => (
1825        $crate::event!(
1826            target: module_path!(),
1827            $crate::Level::DEBUG,
1828            { %$($k).+, $($field)*}
1829        )
1830    );
1831    (?$($k:ident).+) => (
1832        $crate::event!(
1833            target: module_path!(),
1834            $crate::Level::DEBUG,
1835            { ?$($k).+ }
1836        )
1837    );
1838    (%$($k:ident).+) => (
1839        $crate::event!(
1840            target: module_path!(),
1841            $crate::Level::DEBUG,
1842            { %$($k).+ }
1843        )
1844    );
1845    ($($k:ident).+) => (
1846        $crate::event!(
1847            target: module_path!(),
1848            $crate::Level::DEBUG,
1849            { $($k).+ }
1850        )
1851    );
1852    ($($arg:tt)+) => (
1853        $crate::event!(
1854            target: module_path!(),
1855            $crate::Level::DEBUG,
1856            $($arg)+
1857        )
1858    );
1859}
1860
1861/// Constructs an event at the info level.
1862///
1863/// This functions similarly to the [`event!`] macro. See [the top-level
1864/// documentation][lib] for details on the syntax accepted by
1865/// this macro.
1866///
1867/// [`event!`]: crate::event!
1868/// [lib]: crate#using-the-macros
1869///
1870/// # Examples
1871///
1872/// ```rust
1873/// use tracing::info;
1874/// # // this is so the test will still work in no-std mode
1875/// # #[derive(Debug)]
1876/// # pub struct Ipv4Addr;
1877/// # impl Ipv4Addr { fn new(o1: u8, o2: u8, o3: u8, o4: u8) -> Self { Self } }
1878/// # fn main() {
1879/// # struct Connection { port: u32, speed: f32 }
1880/// use tracing::field;
1881///
1882/// let addr = Ipv4Addr::new(127, 0, 0, 1);
1883/// let conn = Connection { port: 40, speed: 3.20 };
1884///
1885/// info!(conn.port, "connected to {:?}", addr);
1886/// info!(
1887///     target: "connection_events",
1888///     ip = ?addr,
1889///     conn.port,
1890///     ?conn.speed,
1891/// );
1892/// info!(name: "completed", "completed connection to {:?}", addr);
1893/// # }
1894/// ```
1895#[macro_export]
1896macro_rules! info {
1897    // Name / target / parent.
1898    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1899        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*)
1900    );
1901    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1902        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)* })
1903    );
1904    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1905        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { ?$($k).+ $($field)* })
1906    );
1907    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1908        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, { %$($k).+ $($field)* })
1909    );
1910    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1911        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+)
1912    );
1913
1914    // Name / target.
1915    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1916        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*)
1917    );
1918    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1919        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { $($k).+ $($field)* })
1920    );
1921    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1922        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { ?$($k).+ $($field)* })
1923    );
1924    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1925        $crate::event!(name: $name, target: $target, $crate::Level::INFO, { %$($k).+ $($field)* })
1926    );
1927    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
1928        $crate::event!(name: $name, target: $target, $crate::Level::INFO, {}, $($arg)+)
1929    );
1930
1931    // Target / parent.
1932    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1933        $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*)
1934    );
1935    (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1936        $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)* })
1937    );
1938    (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1939        $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { ?$($k).+ $($field)* })
1940    );
1941    (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1942        $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { %$($k).+ $($field)* })
1943    );
1944    (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1945        $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+)
1946    );
1947
1948    // Name / parent.
1949    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1950        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*)
1951    );
1952    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
1953        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)* })
1954    );
1955    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
1956        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { ?$($k).+ $($field)* })
1957    );
1958    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
1959        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, { %$($k).+ $($field)* })
1960    );
1961    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1962        $crate::event!(name: $name, parent: $parent, $crate::Level::INFO, {}, $($arg)+)
1963    );
1964
1965    // Name.
1966    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1967        $crate::event!(name: $name, $crate::Level::INFO, { $($field)* }, $($arg)*)
1968    );
1969    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
1970        $crate::event!(name: $name, $crate::Level::INFO, { $($k).+ $($field)* })
1971    );
1972    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
1973        $crate::event!(name: $name, $crate::Level::INFO, { ?$($k).+ $($field)* })
1974    );
1975    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
1976        $crate::event!(name: $name, $crate::Level::INFO, { %$($k).+ $($field)* })
1977    );
1978    (name: $name:expr, $($arg:tt)+ ) => (
1979        $crate::event!(name: $name, $crate::Level::INFO, {}, $($arg)+)
1980    );
1981
1982    // Target.
1983    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1984        $crate::event!(target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*)
1985    );
1986    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1987        $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* })
1988    );
1989    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1990        $crate::event!(target: $target, $crate::Level::INFO, { ?$($k).+ $($field)* })
1991    );
1992    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1993        $crate::event!(target: $target, $crate::Level::INFO, { %$($k).+ $($field)* })
1994    );
1995    (target: $target:expr, $($arg:tt)+ ) => (
1996        $crate::event!(target: $target, $crate::Level::INFO, {}, $($arg)+)
1997    );
1998
1999    // Parent.
2000    (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
2001        $crate::event!(
2002            target: module_path!(),
2003            parent: $parent,
2004            $crate::Level::INFO,
2005            { $($field)+ },
2006            $($arg)+
2007        )
2008    );
2009    (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
2010        $crate::event!(
2011            target: module_path!(),
2012            parent: $parent,
2013            $crate::Level::INFO,
2014            { $($k).+ = $($field)*}
2015        )
2016    );
2017    (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
2018        $crate::event!(
2019            target: module_path!(),
2020            parent: $parent,
2021            $crate::Level::INFO,
2022            { ?$($k).+ = $($field)*}
2023        )
2024    );
2025    (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
2026        $crate::event!(
2027            target: module_path!(),
2028            parent: $parent,
2029            $crate::Level::INFO,
2030            { %$($k).+ = $($field)*}
2031        )
2032    );
2033    (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
2034        $crate::event!(
2035            target: module_path!(),
2036            parent: $parent,
2037            $crate::Level::INFO,
2038            { $($k).+, $($field)*}
2039        )
2040    );
2041    (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
2042        $crate::event!(
2043            target: module_path!(),
2044            parent: $parent,
2045            $crate::Level::INFO,
2046            { ?$($k).+, $($field)*}
2047        )
2048    );
2049    (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
2050        $crate::event!(
2051            target: module_path!(),
2052            parent: $parent,
2053            $crate::Level::INFO,
2054            { %$($k).+, $($field)*}
2055        )
2056    );
2057    (parent: $parent:expr, $($arg:tt)+) => (
2058        $crate::event!(
2059            target: module_path!(),
2060            parent: $parent,
2061            $crate::Level::INFO,
2062            {},
2063            $($arg)+
2064        )
2065    );
2066
2067    // ...
2068    ({ $($field:tt)+ }, $($arg:tt)+ ) => (
2069        $crate::event!(
2070            target: module_path!(),
2071            $crate::Level::INFO,
2072            { $($field)+ },
2073            $($arg)+
2074        )
2075    );
2076    ($($k:ident).+ = $($field:tt)*) => (
2077        $crate::event!(
2078            target: module_path!(),
2079            $crate::Level::INFO,
2080            { $($k).+ = $($field)*}
2081        )
2082    );
2083    (?$($k:ident).+ = $($field:tt)*) => (
2084        $crate::event!(
2085            target: module_path!(),
2086            $crate::Level::INFO,
2087            { ?$($k).+ = $($field)*}
2088        )
2089    );
2090    (%$($k:ident).+ = $($field:tt)*) => (
2091        $crate::event!(
2092            target: module_path!(),
2093            $crate::Level::INFO,
2094            { %$($k).+ = $($field)*}
2095        )
2096    );
2097    ($($k:ident).+, $($field:tt)*) => (
2098        $crate::event!(
2099            target: module_path!(),
2100            $crate::Level::INFO,
2101            { $($k).+, $($field)*}
2102        )
2103    );
2104    (?$($k:ident).+, $($field:tt)*) => (
2105        $crate::event!(
2106            target: module_path!(),
2107            $crate::Level::INFO,
2108            { ?$($k).+, $($field)*}
2109        )
2110    );
2111    (%$($k:ident).+, $($field:tt)*) => (
2112        $crate::event!(
2113            target: module_path!(),
2114            $crate::Level::INFO,
2115            { %$($k).+, $($field)*}
2116        )
2117    );
2118    (?$($k:ident).+) => (
2119        $crate::event!(
2120            target: module_path!(),
2121            $crate::Level::INFO,
2122            { ?$($k).+ }
2123        )
2124    );
2125    (%$($k:ident).+) => (
2126        $crate::event!(
2127            target: module_path!(),
2128            $crate::Level::INFO,
2129            { %$($k).+ }
2130        )
2131    );
2132    ($($k:ident).+) => (
2133        $crate::event!(
2134            target: module_path!(),
2135            $crate::Level::INFO,
2136            { $($k).+ }
2137        )
2138    );
2139    ($($arg:tt)+) => (
2140        $crate::event!(
2141            target: module_path!(),
2142            $crate::Level::INFO,
2143            $($arg)+
2144        )
2145    );
2146}
2147
2148/// Constructs an event at the warn level.
2149///
2150/// This functions similarly to the [`event!`] macro. See [the top-level
2151/// documentation][lib] for details on the syntax accepted by
2152/// this macro.
2153///
2154/// [`event!`]: crate::event!
2155/// [lib]: crate#using-the-macros
2156///
2157/// # Examples
2158///
2159/// ```rust
2160/// use tracing::warn;
2161/// # fn main() {
2162///
2163/// let warn_description = "Invalid Input";
2164/// let input = &[0x27, 0x45];
2165///
2166/// warn!(?input, warning = warn_description);
2167/// warn!(
2168///     target: "input_events",
2169///     warning = warn_description,
2170///     "Received warning for input: {:?}", input,
2171/// );
2172/// warn!(name: "invalid", ?input);
2173/// # }
2174/// ```
2175#[macro_export]
2176macro_rules! warn {
2177    // Name / target / parent.
2178    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2179        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*)
2180    );
2181    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
2182        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)* })
2183    );
2184    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
2185        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { ?$($k).+ $($field)* })
2186    );
2187    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
2188        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, { %$($k).+ $($field)* })
2189    );
2190    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
2191        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+)
2192    );
2193
2194    // Name / target.
2195    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2196        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*)
2197    );
2198    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
2199        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { $($k).+ $($field)* })
2200    );
2201    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
2202        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { ?$($k).+ $($field)* })
2203    );
2204    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
2205        $crate::event!(name: $name, target: $target, $crate::Level::WARN, { %$($k).+ $($field)* })
2206    );
2207    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
2208        $crate::event!(name: $name, target: $target, $crate::Level::WARN, {}, $($arg)+)
2209    );
2210
2211    // Target / parent.
2212    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2213        $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*)
2214    );
2215    (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
2216        $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)* })
2217    );
2218    (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
2219        $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { ?$($k).+ $($field)* })
2220    );
2221    (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
2222        $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { %$($k).+ $($field)* })
2223    );
2224    (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
2225        $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+)
2226    );
2227
2228    // Name / parent.
2229    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2230        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*)
2231    );
2232    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
2233        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)* })
2234    );
2235    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
2236        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { ?$($k).+ $($field)* })
2237    );
2238    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
2239        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, { %$($k).+ $($field)* })
2240    );
2241    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
2242        $crate::event!(name: $name, parent: $parent, $crate::Level::WARN, {}, $($arg)+)
2243    );
2244
2245    // Name.
2246    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2247        $crate::event!(name: $name, $crate::Level::WARN, { $($field)* }, $($arg)*)
2248    );
2249    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
2250        $crate::event!(name: $name, $crate::Level::WARN, { $($k).+ $($field)* })
2251    );
2252    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
2253        $crate::event!(name: $name, $crate::Level::WARN, { ?$($k).+ $($field)* })
2254    );
2255    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
2256        $crate::event!(name: $name, $crate::Level::WARN, { %$($k).+ $($field)* })
2257    );
2258    (name: $name:expr, $($arg:tt)+ ) => (
2259        $crate::event!(name: $name, $crate::Level::WARN, {}, $($arg)+)
2260    );
2261
2262    // Target.
2263    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2264        $crate::event!(target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*)
2265    );
2266    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
2267        $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)* })
2268    );
2269    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
2270        $crate::event!(target: $target, $crate::Level::WARN, { ?$($k).+ $($field)* })
2271    );
2272    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
2273        $crate::event!(target: $target, $crate::Level::WARN, { %$($k).+ $($field)* })
2274    );
2275    (target: $target:expr, $($arg:tt)+ ) => (
2276        $crate::event!(target: $target, $crate::Level::WARN, {}, $($arg)+)
2277    );
2278
2279    // Parent.
2280    (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
2281        $crate::event!(
2282            target: module_path!(),
2283            parent: $parent,
2284            $crate::Level::WARN,
2285            { $($field)+ },
2286            $($arg)+
2287        )
2288    );
2289    (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
2290        $crate::event!(
2291            target: module_path!(),
2292            parent: $parent,
2293            $crate::Level::WARN,
2294            { $($k).+ = $($field)*}
2295        )
2296    );
2297    (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
2298        $crate::event!(
2299            target: module_path!(),
2300            parent: $parent,
2301            $crate::Level::WARN,
2302            { ?$($k).+ = $($field)*}
2303        )
2304    );
2305    (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
2306        $crate::event!(
2307            target: module_path!(),
2308            parent: $parent,
2309            $crate::Level::WARN,
2310            { %$($k).+ = $($field)*}
2311        )
2312    );
2313    (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
2314        $crate::event!(
2315            target: module_path!(),
2316            parent: $parent,
2317            $crate::Level::WARN,
2318            { $($k).+, $($field)*}
2319        )
2320    );
2321    (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
2322        $crate::event!(
2323            target: module_path!(),
2324            parent: $parent,
2325            $crate::Level::WARN,
2326            { ?$($k).+, $($field)*}
2327        )
2328    );
2329    (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
2330        $crate::event!(
2331            target: module_path!(),
2332            parent: $parent,
2333            $crate::Level::WARN,
2334            { %$($k).+, $($field)*}
2335        )
2336    );
2337    (parent: $parent:expr, $($arg:tt)+) => (
2338        $crate::event!(
2339            target: module_path!(),
2340            parent: $parent,
2341            $crate::Level::WARN,
2342            {},
2343            $($arg)+
2344        )
2345    );
2346
2347    // ...
2348    ({ $($field:tt)+ }, $($arg:tt)+ ) => (
2349        $crate::event!(
2350            target: module_path!(),
2351            $crate::Level::WARN,
2352            { $($field)+ },
2353            $($arg)+
2354        )
2355    );
2356    ($($k:ident).+ = $($field:tt)*) => (
2357        $crate::event!(
2358            target: module_path!(),
2359            $crate::Level::WARN,
2360            { $($k).+ = $($field)*}
2361        )
2362    );
2363    (?$($k:ident).+ = $($field:tt)*) => (
2364        $crate::event!(
2365            target: module_path!(),
2366            $crate::Level::WARN,
2367            { ?$($k).+ = $($field)*}
2368        )
2369    );
2370    (%$($k:ident).+ = $($field:tt)*) => (
2371        $crate::event!(
2372            target: module_path!(),
2373            $crate::Level::WARN,
2374            { %$($k).+ = $($field)*}
2375        )
2376    );
2377    ($($k:ident).+, $($field:tt)*) => (
2378        $crate::event!(
2379            target: module_path!(),
2380            $crate::Level::WARN,
2381            { $($k).+, $($field)*}
2382        )
2383    );
2384    (?$($k:ident).+, $($field:tt)*) => (
2385        $crate::event!(
2386            target: module_path!(),
2387            $crate::Level::WARN,
2388            { ?$($k).+, $($field)*}
2389        )
2390    );
2391    (%$($k:ident).+, $($field:tt)*) => (
2392        $crate::event!(
2393            target: module_path!(),
2394            $crate::Level::WARN,
2395            { %$($k).+, $($field)*}
2396        )
2397    );
2398    (?$($k:ident).+) => (
2399        $crate::event!(
2400            target: module_path!(),
2401            $crate::Level::WARN,
2402            { ?$($k).+ }
2403        )
2404    );
2405    (%$($k:ident).+) => (
2406        $crate::event!(
2407            target: module_path!(),
2408            $crate::Level::WARN,
2409            { %$($k).+ }
2410        )
2411    );
2412    ($($k:ident).+) => (
2413        $crate::event!(
2414            target: module_path!(),
2415            $crate::Level::WARN,
2416            { $($k).+ }
2417        )
2418    );
2419    ($($arg:tt)+) => (
2420        $crate::event!(
2421            target: module_path!(),
2422            $crate::Level::WARN,
2423            $($arg)+
2424        )
2425    );
2426}
2427
2428/// Constructs an event at the error level.
2429///
2430/// This functions similarly to the [`event!`] macro. See [the top-level
2431/// documentation][lib] for details on the syntax accepted by
2432/// this macro.
2433///
2434/// [`event!`]: crate::event!
2435/// [lib]: crate#using-the-macros
2436///
2437/// # Examples
2438///
2439/// ```rust
2440/// use tracing::error;
2441/// # fn main() {
2442///
2443/// let (err_info, port) = ("No connection", 22);
2444///
2445/// error!(port, error = %err_info);
2446/// error!(target: "app_events", "App Error: {}", err_info);
2447/// error!({ info = err_info }, "error on port: {}", port);
2448/// error!(name: "invalid_input", "Invalid input: {}", err_info);
2449/// # }
2450/// ```
2451#[macro_export]
2452macro_rules! error {
2453    // Name / target / parent.
2454    (name: $name:expr, target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2455        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*)
2456    );
2457    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
2458        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)* })
2459    );
2460    (name: $name:expr, target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
2461        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { ?$($k).+ $($field)* })
2462    );
2463    (name: $name:expr, target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
2464        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, { %$($k).+ $($field)* })
2465    );
2466    (name: $name:expr, target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
2467        $crate::event!(name: $name, target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+)
2468    );
2469
2470    // Name / target.
2471    (name: $name:expr, target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2472        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*)
2473    );
2474    (name: $name:expr, target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
2475        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { $($k).+ $($field)* })
2476    );
2477    (name: $name:expr, target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
2478        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { ?$($k).+ $($field)* })
2479    );
2480    (name: $name:expr, target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
2481        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* })
2482    );
2483    (name: $name:expr, target: $target:expr, $($arg:tt)+ ) => (
2484        $crate::event!(name: $name, target: $target, $crate::Level::ERROR, {}, $($arg)+)
2485    );
2486
2487    // Target / parent.
2488    (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2489        $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*)
2490    );
2491    (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
2492        $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)* })
2493    );
2494    (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
2495        $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { ?$($k).+ $($field)* })
2496    );
2497    (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
2498        $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { %$($k).+ $($field)* })
2499    );
2500    (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
2501        $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+)
2502    );
2503
2504    // Name / parent.
2505    (name: $name:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2506        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*)
2507    );
2508    (name: $name:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)* ) => (
2509        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)* })
2510    );
2511    (name: $name:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)* ) => (
2512        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { ?$($k).+ $($field)* })
2513    );
2514    (name: $name:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)* ) => (
2515        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, { %$($k).+ $($field)* })
2516    );
2517    (name: $name:expr, parent: $parent:expr, $($arg:tt)+ ) => (
2518        $crate::event!(name: $name, parent: $parent, $crate::Level::ERROR, {}, $($arg)+)
2519    );
2520
2521    // Name.
2522    (name: $name:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2523        $crate::event!(name: $name, $crate::Level::ERROR, { $($field)* }, $($arg)*)
2524    );
2525    (name: $name:expr, $($k:ident).+ $($field:tt)* ) => (
2526        $crate::event!(name: $name, $crate::Level::ERROR, { $($k).+ $($field)* })
2527    );
2528    (name: $name:expr, ?$($k:ident).+ $($field:tt)* ) => (
2529        $crate::event!(name: $name, $crate::Level::ERROR, { ?$($k).+ $($field)* })
2530    );
2531    (name: $name:expr, %$($k:ident).+ $($field:tt)* ) => (
2532        $crate::event!(name: $name, $crate::Level::ERROR, { %$($k).+ $($field)* })
2533    );
2534    (name: $name:expr, $($arg:tt)+ ) => (
2535        $crate::event!(name: $name, $crate::Level::ERROR, {}, $($arg)+)
2536    );
2537
2538    // Target.
2539    (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
2540        $crate::event!(target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*)
2541    );
2542    (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
2543        $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)* })
2544    );
2545    (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
2546        $crate::event!(target: $target, $crate::Level::ERROR, { ?$($k).+ $($field)* })
2547    );
2548    (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
2549        $crate::event!(target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* })
2550    );
2551    (target: $target:expr, $($arg:tt)+ ) => (
2552        $crate::event!(target: $target, $crate::Level::ERROR, {}, $($arg)+)
2553    );
2554
2555    // Parent.
2556    (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
2557        $crate::event!(
2558            target: module_path!(),
2559            parent: $parent,
2560            $crate::Level::ERROR,
2561            { $($field)+ },
2562            $($arg)+
2563        )
2564    );
2565    (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
2566        $crate::event!(
2567            target: module_path!(),
2568            parent: $parent,
2569            $crate::Level::ERROR,
2570            { $($k).+ = $($field)*}
2571        )
2572    );
2573    (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
2574        $crate::event!(
2575            target: module_path!(),
2576            parent: $parent,
2577            $crate::Level::ERROR,
2578            { ?$($k).+ = $($field)*}
2579        )
2580    );
2581    (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
2582        $crate::event!(
2583            target: module_path!(),
2584            parent: $parent,
2585            $crate::Level::ERROR,
2586            { %$($k).+ = $($field)*}
2587        )
2588    );
2589    (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
2590        $crate::event!(
2591            target: module_path!(),
2592            parent: $parent,
2593            $crate::Level::ERROR,
2594            { $($k).+, $($field)*}
2595        )
2596    );
2597    (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
2598        $crate::event!(
2599            target: module_path!(),
2600            parent: $parent,
2601            $crate::Level::ERROR,
2602            { ?$($k).+, $($field)*}
2603        )
2604    );
2605    (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
2606        $crate::event!(
2607            target: module_path!(),
2608            parent: $parent,
2609            $crate::Level::ERROR,
2610            { %$($k).+, $($field)*}
2611        )
2612    );
2613    (parent: $parent:expr, $($arg:tt)+) => (
2614        $crate::event!(
2615            target: module_path!(),
2616            parent: $parent,
2617            $crate::Level::ERROR,
2618            {},
2619            $($arg)+
2620        )
2621    );
2622
2623    // ...
2624    ({ $($field:tt)+ }, $($arg:tt)+ ) => (
2625        $crate::event!(
2626            target: module_path!(),
2627            $crate::Level::ERROR,
2628            { $($field)+ },
2629            $($arg)+
2630        )
2631    );
2632    ($($k:ident).+ = $($field:tt)*) => (
2633        $crate::event!(
2634            target: module_path!(),
2635            $crate::Level::ERROR,
2636            { $($k).+ = $($field)*}
2637        )
2638    );
2639    (?$($k:ident).+ = $($field:tt)*) => (
2640        $crate::event!(
2641            target: module_path!(),
2642            $crate::Level::ERROR,
2643            { ?$($k).+ = $($field)*}
2644        )
2645    );
2646    (%$($k:ident).+ = $($field:tt)*) => (
2647        $crate::event!(
2648            target: module_path!(),
2649            $crate::Level::ERROR,
2650            { %$($k).+ = $($field)*}
2651        )
2652    );
2653    ($($k:ident).+, $($field:tt)*) => (
2654        $crate::event!(
2655            target: module_path!(),
2656            $crate::Level::ERROR,
2657            { $($k).+, $($field)*}
2658        )
2659    );
2660    (?$($k:ident).+, $($field:tt)*) => (
2661        $crate::event!(
2662            target: module_path!(),
2663            $crate::Level::ERROR,
2664            { ?$($k).+, $($field)*}
2665        )
2666    );
2667    (%$($k:ident).+, $($field:tt)*) => (
2668        $crate::event!(
2669            target: module_path!(),
2670            $crate::Level::ERROR,
2671            { %$($k).+, $($field)*}
2672        )
2673    );
2674    (?$($k:ident).+) => (
2675        $crate::event!(
2676            target: module_path!(),
2677            $crate::Level::ERROR,
2678            { ?$($k).+ }
2679        )
2680    );
2681    (%$($k:ident).+) => (
2682        $crate::event!(
2683            target: module_path!(),
2684            $crate::Level::ERROR,
2685            { %$($k).+ }
2686        )
2687    );
2688    ($($k:ident).+) => (
2689        $crate::event!(
2690            target: module_path!(),
2691            $crate::Level::ERROR,
2692            { $($k).+ }
2693        )
2694    );
2695    ($($arg:tt)+) => (
2696        $crate::event!(
2697            target: module_path!(),
2698            $crate::Level::ERROR,
2699            $($arg)+
2700        )
2701    );
2702}
2703
2704/// Constructs a new static callsite for a span or event.
2705#[doc(hidden)]
2706#[macro_export]
2707macro_rules! callsite {
2708    (name: $name:expr, kind: $kind:expr, fields: $($fields:tt)*) => {{
2709        $crate::callsite! {
2710            name: $name,
2711            kind: $kind,
2712            target: module_path!(),
2713            level: $crate::Level::TRACE,
2714            fields: $($fields)*
2715        }
2716    }};
2717    (
2718        name: $name:expr,
2719        kind: $kind:expr,
2720        level: $lvl:expr,
2721        fields: $($fields:tt)*
2722    ) => {{
2723        $crate::callsite! {
2724            name: $name,
2725            kind: $kind,
2726            target: module_path!(),
2727            level: $lvl,
2728            fields: $($fields)*
2729        }
2730    }};
2731    (
2732        name: $name:expr,
2733        kind: $kind:expr,
2734        target: $target:expr,
2735        level: $lvl:expr,
2736        fields: $($fields:tt)*
2737    ) => {{
2738        static META: $crate::Metadata<'static> = {
2739            $crate::metadata! {
2740                name: $name,
2741                target: $target,
2742                level: $lvl,
2743                fields: $crate::fieldset!( $($fields)* ),
2744                callsite: &__CALLSITE,
2745                kind: $kind,
2746            }
2747        };
2748        static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite::DefaultCallsite::new(&META);
2749        __CALLSITE.register();
2750        &__CALLSITE
2751    }};
2752}
2753
2754/// Constructs a new static callsite for a span or event.
2755#[doc(hidden)]
2756#[macro_export]
2757macro_rules! callsite2 {
2758    (name: $name:expr, kind: $kind:expr, fields: $($fields:tt)*) => {{
2759        $crate::callsite2! {
2760            name: $name,
2761            kind: $kind,
2762            target: module_path!(),
2763            level: $crate::Level::TRACE,
2764            fields: $($fields)*
2765        }
2766    }};
2767    (
2768        name: $name:expr,
2769        kind: $kind:expr,
2770        level: $lvl:expr,
2771        fields: $($fields:tt)*
2772    ) => {{
2773        $crate::callsite2! {
2774            name: $name,
2775            kind: $kind,
2776            target: module_path!(),
2777            level: $lvl,
2778            fields: $($fields)*
2779        }
2780    }};
2781    (
2782        name: $name:expr,
2783        kind: $kind:expr,
2784        target: $target:expr,
2785        level: $lvl:expr,
2786        fields: $($fields:tt)*
2787    ) => {{
2788        static META: $crate::Metadata<'static> = {
2789            $crate::metadata! {
2790                name: $name,
2791                target: $target,
2792                level: $lvl,
2793                fields: $crate::fieldset!( $($fields)* ),
2794                callsite: &__CALLSITE,
2795                kind: $kind,
2796            }
2797        };
2798        $crate::callsite::DefaultCallsite::new(&META)
2799    }};
2800}
2801
2802#[macro_export]
2803// TODO: determine if this ought to be public API?`
2804#[doc(hidden)]
2805macro_rules! level_enabled {
2806    ($lvl:expr) => {
2807        $lvl <= $crate::level_filters::STATIC_MAX_LEVEL
2808            && $lvl <= $crate::level_filters::LevelFilter::current()
2809    };
2810}
2811
2812#[doc(hidden)]
2813#[macro_export]
2814macro_rules! valueset {
2815
2816    // === base case ===
2817    (@ { $(,)* $($val:expr),* $(,)* }, $next:expr $(,)*) => {
2818        &[ $($val),* ]
2819    };
2820
2821    // === recursive case (more tts) ===
2822
2823    // TODO(#1138): determine a new syntax for uninitialized span fields, and
2824    // re-enable this.
2825    // (@{ $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = _, $($rest:tt)*) => {
2826    //     $crate::valueset!(@ { $($out),*, (&$next, None) }, $next, $($rest)*)
2827    // };
2828    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => {
2829        $crate::valueset!(
2830            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) },
2831            $next,
2832            $($rest)*
2833        )
2834    };
2835    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => {
2836        $crate::valueset!(
2837            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) },
2838            $next,
2839            $($rest)*
2840        )
2841    };
2842    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => {
2843        $crate::valueset!(
2844            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) },
2845            $next,
2846            $($rest)*
2847        )
2848    };
2849    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+, $($rest:tt)*) => {
2850        $crate::valueset!(
2851            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn Value)) },
2852            $next,
2853            $($rest)*
2854        )
2855    };
2856    (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+, $($rest:tt)*) => {
2857        $crate::valueset!(
2858            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$($k).+) as &dyn Value)) },
2859            $next,
2860            $($rest)*
2861        )
2862    };
2863    (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+, $($rest:tt)*) => {
2864        $crate::valueset!(
2865            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$($k).+) as &dyn Value)) },
2866            $next,
2867            $($rest)*
2868        )
2869    };
2870    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => {
2871        $crate::valueset!(
2872            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) },
2873            $next,
2874        )
2875    };
2876    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr) => {
2877        $crate::valueset!(
2878            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) },
2879            $next,
2880        )
2881    };
2882    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => {
2883        $crate::valueset!(
2884            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) },
2885            $next,
2886        )
2887    };
2888    (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+) => {
2889        $crate::valueset!(
2890            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn Value)) },
2891            $next,
2892        )
2893    };
2894    (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+) => {
2895        $crate::valueset!(
2896            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$($k).+) as &dyn Value)) },
2897            $next,
2898        )
2899    };
2900    (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+) => {
2901        $crate::valueset!(
2902            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$($k).+) as &dyn Value)) },
2903            $next,
2904        )
2905    };
2906
2907    // Handle literal names
2908    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => {
2909        $crate::valueset!(
2910            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) },
2911            $next,
2912            $($rest)*
2913        )
2914    };
2915    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => {
2916        $crate::valueset!(
2917            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) },
2918            $next,
2919            $($rest)*
2920        )
2921    };
2922    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => {
2923        $crate::valueset!(
2924            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) },
2925            $next,
2926            $($rest)*
2927        )
2928    };
2929    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => {
2930        $crate::valueset!(
2931            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&debug(&$val) as &dyn Value)) },
2932            $next,
2933        )
2934    };
2935    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => {
2936        $crate::valueset!(
2937            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&display(&$val) as &dyn Value)) },
2938            $next,
2939        )
2940    };
2941    (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => {
2942        $crate::valueset!(
2943            @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn Value)) },
2944            $next,
2945        )
2946    };
2947
2948    // Handle constant names
2949    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr, $($rest:tt)*) => {
2950        $crate::valueset!(
2951            @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) },
2952            $next,
2953            $($rest)*
2954        )
2955    };
2956    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr, $($rest:tt)*) => {
2957        $crate::valueset!(
2958            @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) },
2959            $next,
2960            $($rest)*
2961        )
2962    };
2963    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr, $($rest:tt)*) => {
2964        $crate::valueset!(
2965            @ { $($out),*, (&$next, Some(&$val as &dyn Value)) },
2966            $next,
2967            $($rest)*
2968        )
2969    };
2970    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr) => {
2971        $crate::valueset!(
2972            @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) },
2973            $next,
2974        )
2975    };
2976    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr) => {
2977        $crate::valueset!(
2978            @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) },
2979            $next,
2980        )
2981    };
2982    (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr) => {
2983        $crate::valueset!(
2984            @ { $($out),*, (&$next, Some(&$val as &dyn Value)) },
2985            $next,
2986        )
2987    };
2988
2989    // Remainder is unparsable, but exists --- must be format args!
2990    (@ { $(,)* $($out:expr),* }, $next:expr, $($rest:tt)+) => {
2991        $crate::valueset!(@ { (&$next, $crate::__macro_support::Option::Some(&$crate::__macro_support::format_args!($($rest)+) as &dyn Value)), $($out),* }, $next, )
2992    };
2993
2994    // === entry ===
2995    ($fields:expr, $($kvs:tt)+) => {
2996        {
2997            #[allow(unused_imports)]
2998            use $crate::field::{debug, display, Value};
2999            let mut iter = $fields.iter();
3000            $fields.value_set($crate::valueset!(
3001                @ { },
3002                $crate::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
3003                $($kvs)+
3004            ))
3005        }
3006    };
3007    ($fields:expr,) => {
3008        {
3009            $fields.value_set(&[])
3010        }
3011    };
3012}
3013
3014#[doc(hidden)]
3015#[macro_export]
3016macro_rules! fieldset {
3017    // == base case ==
3018    (@ { $(,)* $($out:expr),* $(,)* } $(,)*) => {
3019        &[ $($out),* ]
3020    };
3021
3022    // == recursive cases (more tts) ==
3023    (@ { $(,)* $($out:expr),* } $($k:ident).+ = ?$val:expr, $($rest:tt)*) => {
3024        $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
3025    };
3026    (@ { $(,)* $($out:expr),* } $($k:ident).+ = %$val:expr, $($rest:tt)*) => {
3027        $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
3028    };
3029    (@ { $(,)* $($out:expr),* } $($k:ident).+ = $val:expr, $($rest:tt)*) => {
3030        $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
3031    };
3032    // TODO(#1138): determine a new syntax for uninitialized span fields, and
3033    // re-enable this.
3034    // (@ { $($out:expr),* } $($k:ident).+ = _, $($rest:tt)*) => {
3035    //     $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
3036    // };
3037    (@ { $(,)* $($out:expr),* } ?$($k:ident).+, $($rest:tt)*) => {
3038        $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
3039    };
3040    (@ { $(,)* $($out:expr),* } %$($k:ident).+, $($rest:tt)*) => {
3041        $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
3042    };
3043    (@ { $(,)* $($out:expr),* } $($k:ident).+, $($rest:tt)*) => {
3044        $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
3045    };
3046
3047    // Handle literal names
3048    (@ { $(,)* $($out:expr),* } $k:literal = ?$val:expr, $($rest:tt)*) => {
3049        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
3050    };
3051    (@ { $(,)* $($out:expr),* } $k:literal = %$val:expr, $($rest:tt)*) => {
3052        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
3053    };
3054    (@ { $(,)* $($out:expr),* } $k:literal = $val:expr, $($rest:tt)*) => {
3055        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
3056    };
3057
3058    // Handle constant names
3059    (@ { $(,)* $($out:expr),* } { $k:expr } = ?$val:expr, $($rest:tt)*) => {
3060        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
3061    };
3062    (@ { $(,)* $($out:expr),* } { $k:expr } = %$val:expr, $($rest:tt)*) => {
3063        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
3064    };
3065    (@ { $(,)* $($out:expr),* } { $k:expr } = $val:expr, $($rest:tt)*) => {
3066        $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
3067    };
3068
3069    // Remainder is unparsable, but exists --- must be format args!
3070    (@ { $(,)* $($out:expr),* } $($rest:tt)+) => {
3071        $crate::fieldset!(@ { "message", $($out),*, })
3072    };
3073
3074    // == entry ==
3075    ($($args:tt)*) => {
3076        $crate::fieldset!(@ { } $($args)*,)
3077    };
3078
3079}
3080
3081#[cfg(feature = "log")]
3082#[doc(hidden)]
3083#[macro_export]
3084macro_rules! level_to_log {
3085    ($level:expr) => {
3086        match $level {
3087            $crate::Level::ERROR => $crate::log::Level::Error,
3088            $crate::Level::WARN => $crate::log::Level::Warn,
3089            $crate::Level::INFO => $crate::log::Level::Info,
3090            $crate::Level::DEBUG => $crate::log::Level::Debug,
3091            _ => $crate::log::Level::Trace,
3092        }
3093    };
3094}
3095
3096#[doc(hidden)]
3097#[macro_export]
3098macro_rules! __tracing_stringify {
3099    ($($k:ident).+) => {{
3100        const NAME: $crate::__macro_support::FieldName<{
3101            $crate::__macro_support::FieldName::len($crate::__macro_support::stringify!($($k).+))
3102        }> = $crate::__macro_support::FieldName::new($crate::__macro_support::stringify!($($k).+));
3103        NAME.as_str()
3104    }};
3105}
3106
3107#[cfg(not(feature = "log"))]
3108#[doc(hidden)]
3109#[macro_export]
3110macro_rules! __tracing_log {
3111    ($level:expr, $callsite:expr, $value_set:expr) => {};
3112}
3113
3114#[cfg(feature = "log")]
3115#[doc(hidden)]
3116#[macro_export]
3117macro_rules! __tracing_log {
3118    ($level:expr, $callsite:expr, $value_set:expr) => {
3119        $crate::if_log_enabled! { $level, {
3120            use $crate::log;
3121            let level = $crate::level_to_log!($level);
3122            if level <= log::max_level() {
3123                let meta = $callsite.metadata();
3124                let log_meta = log::Metadata::builder()
3125                    .level(level)
3126                    .target(meta.target())
3127                    .build();
3128                let logger = log::logger();
3129                if logger.enabled(&log_meta) {
3130                    $crate::__macro_support::__tracing_log(meta, logger, log_meta, $value_set)
3131                }
3132            }
3133        }}
3134    };
3135}
3136
3137#[cfg(not(feature = "log"))]
3138#[doc(hidden)]
3139#[macro_export]
3140macro_rules! if_log_enabled {
3141    ($lvl:expr, $e:expr;) => {
3142        $crate::if_log_enabled! { $lvl, $e }
3143    };
3144    ($lvl:expr, $if_log:block) => {
3145        $crate::if_log_enabled! { $lvl, $if_log else {} }
3146    };
3147    ($lvl:expr, $if_log:block else $else_block:block) => {
3148        $else_block
3149    };
3150}
3151
3152#[cfg(all(feature = "log", not(feature = "log-always")))]
3153#[doc(hidden)]
3154#[macro_export]
3155macro_rules! if_log_enabled {
3156    ($lvl:expr, $e:expr;) => {
3157        $crate::if_log_enabled! { $lvl, $e }
3158    };
3159    ($lvl:expr, $if_log:block) => {
3160        $crate::if_log_enabled! { $lvl, $if_log else {} }
3161    };
3162    ($lvl:expr, $if_log:block else $else_block:block) => {
3163        if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL {
3164            if !$crate::dispatcher::has_been_set() {
3165                $if_log
3166            } else {
3167                $else_block
3168            }
3169        } else {
3170            $else_block
3171        }
3172    };
3173}
3174
3175#[cfg(all(feature = "log", feature = "log-always"))]
3176#[doc(hidden)]
3177#[macro_export]
3178macro_rules! if_log_enabled {
3179    ($lvl:expr, $e:expr;) => {
3180        $crate::if_log_enabled! { $lvl, $e }
3181    };
3182    ($lvl:expr, $if_log:block) => {
3183        $crate::if_log_enabled! { $lvl, $if_log else {} }
3184    };
3185    ($lvl:expr, $if_log:block else $else_block:block) => {
3186        if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL {
3187            #[allow(unused_braces)]
3188            $if_log
3189        } else {
3190            $else_block
3191        }
3192    };
3193}