]> git.proxmox.com Git - rustc.git/blame - vendor/tracing/src/macros.rs
New upstream version 1.61.0+dfsg1
[rustc.git] / vendor / tracing / src / macros.rs
CommitLineData
f035d41b
XL
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]: index.html#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)*) => {
5869c6ff
XL
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 && CALLSITE.is_enabled(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 = CALLSITE.disabled_span();
6a06907d 48 $crate::if_log_enabled! { $lvl, {
5869c6ff
XL
49 span.record_all(&$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
50 }};
51 span
52 }
53 }
f035d41b
XL
54 };
55 (target: $target:expr, $lvl:expr, $name:expr, $($fields:tt)*) => {
5869c6ff
XL
56 {
57 use $crate::__macro_support::Callsite as _;
58 static CALLSITE: $crate::__macro_support::MacroCallsite = $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 && CALLSITE.is_enabled(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 = CALLSITE.disabled_span();
6a06907d 78 $crate::if_log_enabled! { $lvl, {
5869c6ff
XL
79 span.record_all(&$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
80 }};
81 span
82 }
83 }
f035d41b
XL
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/// Constructs a span at the trace level.
134///
135/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
136/// macro.
137///
138/// See [the top-level documentation][lib] for details on the syntax accepted by
139/// this macro.
140///
141/// [lib]: index.html#using-the-macros
142/// [attributes]: index.html#configuring-attributes
143/// [Fields]: index.html#recording-fields
144/// [`span!`]: macro.span.html
145///
146/// # Examples
147///
148/// ```rust
149/// # use tracing::{trace_span, span, Level};
150/// # fn main() {
151/// trace_span!("my_span");
152/// // is equivalent to:
153/// span!(Level::TRACE, "my_span");
154/// # }
155/// ```
156///
157/// ```rust
158/// # use tracing::{trace_span, span, Level};
159/// # fn main() {
160/// let span = trace_span!("my span");
161/// span.in_scope(|| {
162/// // do work inside the span...
163/// });
164/// # }
165/// ```
166#[macro_export]
167macro_rules! trace_span {
168 (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
169 $crate::span!(
170 target: $target,
171 parent: $parent,
172 $crate::Level::TRACE,
173 $name,
174 $($field)*
175 )
176 };
177 (target: $target:expr, parent: $parent:expr, $name:expr) => {
178 $crate::trace_span!(target: $target, parent: $parent, $name,)
179 };
180 (parent: $parent:expr, $name:expr, $($field:tt)*) => {
181 $crate::span!(
182 target: module_path!(),
183 parent: $parent,
184 $crate::Level::TRACE,
185 $name,
186 $($field)*
187 )
188 };
189 (parent: $parent:expr, $name:expr) => {
190 $crate::trace_span!(parent: $parent, $name,)
191 };
192 (target: $target:expr, $name:expr, $($field:tt)*) => {
193 $crate::span!(
194 target: $target,
195 $crate::Level::TRACE,
196 $name,
197 $($field)*
198 )
199 };
200 (target: $target:expr, $name:expr) => {
201 $crate::trace_span!(target: $target, $name,)
202 };
203 ($name:expr, $($field:tt)*) => {
204 $crate::span!(
205 target: module_path!(),
206 $crate::Level::TRACE,
207 $name,
208 $($field)*
209 )
210 };
211 ($name:expr) => { $crate::trace_span!($name,) };
212}
213
214/// Constructs a span at the debug level.
215///
216/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
217/// macro.
218///
219/// See [the top-level documentation][lib] for details on the syntax accepted by
220/// this macro.
221///
222/// [lib]: index.html#using-the-macros
223/// [attributes]: index.html#configuring-attributes
224/// [Fields]: index.html#recording-fields
225/// [`span!`]: macro.span.html
226///
227/// # Examples
228///
229/// ```rust
230/// # use tracing::{debug_span, span, Level};
231/// # fn main() {
232/// debug_span!("my_span");
233/// // is equivalent to:
234/// span!(Level::DEBUG, "my_span");
235/// # }
236/// ```
237///
238/// ```rust
239/// # use tracing::debug_span;
240/// # fn main() {
241/// let span = debug_span!("my span");
242/// span.in_scope(|| {
243/// // do work inside the span...
244/// });
245/// # }
246/// ```
247#[macro_export]
248macro_rules! debug_span {
249 (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
250 $crate::span!(
251 target: $target,
252 parent: $parent,
253 $crate::Level::DEBUG,
254 $name,
255 $($field)*
256 )
257 };
258 (target: $target:expr, parent: $parent:expr, $name:expr) => {
259 $crate::debug_span!(target: $target, parent: $parent, $name,)
260 };
261 (parent: $parent:expr, $name:expr, $($field:tt)*) => {
262 $crate::span!(
263 target: module_path!(),
264 parent: $parent,
265 $crate::Level::DEBUG,
266 $name,
267 $($field)*
268 )
269 };
270 (parent: $parent:expr, $name:expr) => {
271 $crate::debug_span!(parent: $parent, $name,)
272 };
273 (target: $target:expr, $name:expr, $($field:tt)*) => {
274 $crate::span!(
275 target: $target,
276 $crate::Level::DEBUG,
277 $name,
278 $($field)*
279 )
280 };
281 (target: $target:expr, $name:expr) => {
282 $crate::debug_span!(target: $target, $name,)
283 };
284 ($name:expr, $($field:tt)*) => {
285 $crate::span!(
286 target: module_path!(),
287 $crate::Level::DEBUG,
288 $name,
289 $($field)*
290 )
291 };
292 ($name:expr) => {$crate::debug_span!($name,)};
293}
294
295/// Constructs a span at the info level.
296///
297/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
298/// macro.
299///
300/// See [the top-level documentation][lib] for details on the syntax accepted by
301/// this macro.
302///
303/// [lib]: index.html#using-the-macros
304/// [attributes]: index.html#configuring-attributes
305/// [Fields]: index.html#recording-fields
306/// [`span!`]: macro.span.html
307///
308/// # Examples
309///
310/// ```rust
311/// # use tracing::{span, info_span, Level};
312/// # fn main() {
313/// info_span!("my_span");
314/// // is equivalent to:
315/// span!(Level::INFO, "my_span");
316/// # }
317/// ```
318///
319/// ```rust
320/// # use tracing::info_span;
321/// # fn main() {
322/// let span = info_span!("my span");
323/// span.in_scope(|| {
324/// // do work inside the span...
325/// });
326/// # }
327/// ```
328#[macro_export]
329macro_rules! info_span {
330 (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
331 $crate::span!(
332 target: $target,
333 parent: $parent,
334 $crate::Level::INFO,
335 $name,
336 $($field)*
337 )
338 };
339 (target: $target:expr, parent: $parent:expr, $name:expr) => {
340 $crate::info_span!(target: $target, parent: $parent, $name,)
341 };
342 (parent: $parent:expr, $name:expr, $($field:tt)*) => {
343 $crate::span!(
344 target: module_path!(),
345 parent: $parent,
346 $crate::Level::INFO,
347 $name,
348 $($field)*
349 )
350 };
351 (parent: $parent:expr, $name:expr) => {
352 $crate::info_span!(parent: $parent, $name,)
353 };
354 (target: $target:expr, $name:expr, $($field:tt)*) => {
355 $crate::span!(
356 target: $target,
357 $crate::Level::INFO,
358 $name,
359 $($field)*
360 )
361 };
362 (target: $target:expr, $name:expr) => {
363 $crate::info_span!(target: $target, $name,)
364 };
365 ($name:expr, $($field:tt)*) => {
366 $crate::span!(
367 target: module_path!(),
368 $crate::Level::INFO,
369 $name,
370 $($field)*
371 )
372 };
373 ($name:expr) => {$crate::info_span!($name,)};
374}
375
376/// Constructs a span at the warn level.
377///
378/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
379/// macro.
380///
381/// See [the top-level documentation][lib] for details on the syntax accepted by
382/// this macro.
383///
384/// [lib]: index.html#using-the-macros
385/// [attributes]: index.html#configuring-attributes
386/// [Fields]: index.html#recording-fields
387/// [`span!`]: macro.span.html
388///
389/// # Examples
390///
391/// ```rust
392/// # use tracing::{warn_span, span, Level};
393/// # fn main() {
394/// warn_span!("my_span");
395/// // is equivalent to:
396/// span!(Level::WARN, "my_span");
397/// # }
398/// ```
399///
400/// ```rust
401/// use tracing::warn_span;
402/// # fn main() {
403/// let span = warn_span!("my span");
404/// span.in_scope(|| {
405/// // do work inside the span...
406/// });
407/// # }
408/// ```
409#[macro_export]
410macro_rules! warn_span {
411 (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
412 $crate::span!(
413 target: $target,
414 parent: $parent,
415 $crate::Level::WARN,
416 $name,
417 $($field)*
418 )
419 };
420 (target: $target:expr, parent: $parent:expr, $name:expr) => {
421 $crate::warn_span!(target: $target, parent: $parent, $name,)
422 };
423 (parent: $parent:expr, $name:expr, $($field:tt)*) => {
424 $crate::span!(
425 target: module_path!(),
426 parent: $parent,
427 $crate::Level::WARN,
428 $name,
429 $($field)*
430 )
431 };
432 (parent: $parent:expr, $name:expr) => {
433 $crate::warn_span!(parent: $parent, $name,)
434 };
435 (target: $target:expr, $name:expr, $($field:tt)*) => {
436 $crate::span!(
437 target: $target,
438 $crate::Level::WARN,
439 $name,
440 $($field)*
441 )
442 };
443 (target: $target:expr, $name:expr) => {
444 $crate::warn_span!(target: $target, $name,)
445 };
446 ($name:expr, $($field:tt)*) => {
447 $crate::span!(
448 target: module_path!(),
449 $crate::Level::WARN,
450 $name,
451 $($field)*
452 )
453 };
454 ($name:expr) => {$crate::warn_span!($name,)};
455}
456/// Constructs a span at the error level.
457///
458/// [Fields] and [attributes] are set using the same syntax as the [`span!`]
459/// macro.
460///
461/// See [the top-level documentation][lib] for details on the syntax accepted by
462/// this macro.
463///
464/// [lib]: index.html#using-the-macros
465/// [attributes]: index.html#configuring-attributes
466/// [Fields]: index.html#recording-fields
467/// [`span!`]: macro.span.html
468///
469/// # Examples
470///
471/// ```rust
472/// # use tracing::{span, error_span, Level};
473/// # fn main() {
474/// error_span!("my_span");
475/// // is equivalent to:
476/// span!(Level::ERROR, "my_span");
477/// # }
478/// ```
479///
480/// ```rust
481/// # use tracing::error_span;
482/// # fn main() {
483/// let span = error_span!("my span");
484/// span.in_scope(|| {
485/// // do work inside the span...
486/// });
487/// # }
488/// ```
489#[macro_export]
490macro_rules! error_span {
491 (target: $target:expr, parent: $parent:expr, $name:expr, $($field:tt)*) => {
492 $crate::span!(
493 target: $target,
494 parent: $parent,
495 $crate::Level::ERROR,
496 $name,
497 $($field)*
498 )
499 };
500 (target: $target:expr, parent: $parent:expr, $name:expr) => {
501 $crate::error_span!(target: $target, parent: $parent, $name,)
502 };
503 (parent: $parent:expr, $name:expr, $($field:tt)*) => {
504 $crate::span!(
505 target: module_path!(),
506 parent: $parent,
507 $crate::Level::ERROR,
508 $name,
509 $($field)*
510 )
511 };
512 (parent: $parent:expr, $name:expr) => {
513 $crate::error_span!(parent: $parent, $name,)
514 };
515 (target: $target:expr, $name:expr, $($field:tt)*) => {
516 $crate::span!(
517 target: $target,
518 $crate::Level::ERROR,
519 $name,
520 $($field)*
521 )
522 };
523 (target: $target:expr, $name:expr) => {
524 $crate::error_span!(target: $target, $name,)
525 };
526 ($name:expr, $($field:tt)*) => {
527 $crate::span!(
528 target: module_path!(),
529 $crate::Level::ERROR,
530 $name,
531 $($field)*
532 )
533 };
534 ($name:expr) => {$crate::error_span!($name,)};
535}
536
537/// Constructs a new `Event`.
538///
539/// The event macro is invoked with a `Level` and up to 32 key-value fields.
540/// Optionally, a format string and arguments may follow the fields; this will
541/// be used to construct an implicit field named "message".
542///
543/// See [the top-level documentation][lib] for details on the syntax accepted by
544/// this macro.
545///
546/// [lib]: index.html#using-the-macros
547///
548/// # Examples
549///
550/// ```rust
551/// use tracing::{event, Level};
552///
553/// # fn main() {
554/// let data = (42, "forty-two");
555/// let private_data = "private";
556/// let error = "a bad error";
557///
558/// event!(Level::ERROR, %error, "Received error");
559/// event!(
560/// target: "app_events",
561/// Level::WARN,
562/// private_data,
563/// ?data,
564/// "App warning: {}",
565/// error
566/// );
567/// event!(Level::INFO, the_answer = data.0);
568/// # }
569/// ```
570///
571// /// Note that *unlike `span!`*, `event!` requires a value for all fields. As
572// /// events are recorded immediately when the macro is invoked, there is no
573// /// opportunity for fields to be recorded later. A trailing comma on the final
574// /// field is valid.
575// ///
576// /// For example, the following does not compile:
577// /// ```rust,compile_fail
5099ac24 578// /// # use tracing::{Level, event};
f035d41b
XL
579// /// # fn main() {
580// /// event!(Level::INFO, foo = 5, bad_field, bar = "hello")
581// /// #}
582// /// ```
583#[macro_export]
584macro_rules! event {
5099ac24
FG
585 (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({
586 use $crate::__macro_support::Callsite as _;
587 static CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
ee023bcb 588 name: $crate::__macro_support::concat!(
5099ac24
FG
589 "event ",
590 file!(),
591 ":",
592 line!()
593 ),
594 kind: $crate::metadata::Kind::EVENT,
3dfed10e 595 target: $target,
5099ac24
FG
596 level: $lvl,
597 fields: $($fields)*
598 };
f035d41b 599
5099ac24 600 let enabled = $crate::level_enabled!($lvl) && {
5869c6ff 601 let interest = CALLSITE.interest();
5099ac24
FG
602 !interest.is_never() && CALLSITE.is_enabled(interest)
603 };
604 if enabled {
605 (|value_set: $crate::field::ValueSet| {
606 $crate::__tracing_log!(
607 target: $target,
608 $lvl,
609 &value_set
610 );
5869c6ff
XL
611 let meta = CALLSITE.metadata();
612 // event with explicit parent
613 $crate::Event::child_of(
614 $parent,
615 meta,
5099ac24 616 &value_set
5869c6ff 617 );
5099ac24
FG
618 })($crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
619 } else {
620 $crate::__tracing_log!(
621 target: $target,
622 $lvl,
623 &$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)
624 );
f035d41b 625 }
5099ac24 626 });
f035d41b 627
3dfed10e 628 (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
f035d41b
XL
629 $crate::event!(
630 target: $target,
631 parent: $parent,
632 $lvl,
633 { message = format_args!($($arg)+), $($fields)* }
634 )
3dfed10e 635 );
f035d41b
XL
636 (target: $target:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
637 $crate::event!(target: $target, parent: $parent, $lvl, { $($k).+ = $($fields)* })
638 );
639 (target: $target:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => (
640 $crate::event!(target: $target, parent: $parent, $lvl, { $($arg)+ })
641 );
642 (target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
5099ac24
FG
643 use $crate::__macro_support::Callsite as _;
644 static CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
ee023bcb 645 name: $crate::__macro_support::concat!(
5099ac24
FG
646 "event ",
647 file!(),
648 ":",
649 line!()
650 ),
651 kind: $crate::metadata::Kind::EVENT,
3dfed10e 652 target: $target,
5099ac24
FG
653 level: $lvl,
654 fields: $($fields)*
655 };
656 let enabled = $crate::level_enabled!($lvl) && {
5869c6ff 657 let interest = CALLSITE.interest();
5099ac24
FG
658 !interest.is_never() && CALLSITE.is_enabled(interest)
659 };
660 if enabled {
661 (|value_set: $crate::field::ValueSet| {
5869c6ff
XL
662 let meta = CALLSITE.metadata();
663 // event with contextual parent
664 $crate::Event::dispatch(
665 meta,
5099ac24 666 &value_set
5869c6ff 667 );
5099ac24
FG
668 $crate::__tracing_log!(
669 target: $target,
670 $lvl,
671 &value_set
672 );
673 })($crate::valueset!(CALLSITE.metadata().fields(), $($fields)*));
674 } else {
675 $crate::__tracing_log!(
676 target: $target,
677 $lvl,
678 &$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)
679 );
f035d41b
XL
680 }
681 });
3dfed10e 682 (target: $target:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
f035d41b
XL
683 $crate::event!(
684 target: $target,
685 $lvl,
686 { message = format_args!($($arg)+), $($fields)* }
687 )
3dfed10e 688 );
f035d41b
XL
689 (target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => (
690 $crate::event!(target: $target, $lvl, { $($k).+ = $($fields)* })
691 );
692 (target: $target:expr, $lvl:expr, $($arg:tt)+ ) => (
693 $crate::event!(target: $target, $lvl, { $($arg)+ })
694 );
695 (parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
696 $crate::event!(
697 target: module_path!(),
698 parent: $parent,
699 $lvl,
700 { message = format_args!($($arg)+), $($fields)* }
701 )
702 );
f035d41b
XL
703 (parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($field:tt)*) => (
704 $crate::event!(
705 target: module_path!(),
706 parent: $parent,
707 $lvl,
708 { $($k).+ = $($field)*}
709 )
710 );
711 (parent: $parent:expr, $lvl:expr, ?$($k:ident).+ = $($field:tt)*) => (
712 $crate::event!(
713 target: module_path!(),
714 parent: $parent,
715 $lvl,
716 { ?$($k).+ = $($field)*}
717 )
718 );
719 (parent: $parent:expr, $lvl:expr, %$($k:ident).+ = $($field:tt)*) => (
720 $crate::event!(
721 target: module_path!(),
722 parent: $parent,
723 $lvl,
724 { %$($k).+ = $($field)*}
725 )
726 );
727 (parent: $parent:expr, $lvl:expr, $($k:ident).+, $($field:tt)*) => (
728 $crate::event!(
729 target: module_path!(),
730 parent: $parent,
731 $lvl,
732 { $($k).+, $($field)*}
733 )
734 );
735 (parent: $parent:expr, $lvl:expr, %$($k:ident).+, $($field:tt)*) => (
736 $crate::event!(
737 target: module_path!(),
738 parent: $parent,
739 $lvl,
740 { %$($k).+, $($field)*}
741 )
742 );
743 (parent: $parent:expr, $lvl:expr, ?$($k:ident).+, $($field:tt)*) => (
744 $crate::event!(
745 target: module_path!(),
746 parent: $parent,
747 $lvl,
748 { ?$($k).+, $($field)*}
749 )
750 );
751 (parent: $parent:expr, $lvl:expr, $($arg:tt)+ ) => (
752 $crate::event!(target: module_path!(), parent: $parent, $lvl, { $($arg)+ })
753 );
754 ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
755 $crate::event!(
756 target: module_path!(),
757 $lvl,
758 { message = format_args!($($arg)+), $($fields)* }
759 )
760 );
761 ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => (
762 $crate::event!(
763 target: module_path!(),
764 $lvl,
765 { message = format_args!($($arg)+), $($fields)* }
766 )
767 );
768 ($lvl:expr, $($k:ident).+ = $($field:tt)*) => (
769 $crate::event!(
770 target: module_path!(),
771 $lvl,
772 { $($k).+ = $($field)*}
773 )
774 );
775 ($lvl:expr, $($k:ident).+, $($field:tt)*) => (
776 $crate::event!(
777 target: module_path!(),
778 $lvl,
779 { $($k).+, $($field)*}
780 )
781 );
782 ($lvl:expr, ?$($k:ident).+, $($field:tt)*) => (
783 $crate::event!(
784 target: module_path!(),
785 $lvl,
786 { ?$($k).+, $($field)*}
787 )
788 );
789 ($lvl:expr, %$($k:ident).+, $($field:tt)*) => (
790 $crate::event!(
791 target: module_path!(),
792 $lvl,
793 { %$($k).+, $($field)*}
794 )
795 );
796 ($lvl:expr, ?$($k:ident).+) => (
797 $crate::event!($lvl, ?$($k).+,)
798 );
799 ($lvl:expr, %$($k:ident).+) => (
800 $crate::event!($lvl, %$($k).+,)
801 );
802 ($lvl:expr, $($k:ident).+) => (
803 $crate::event!($lvl, $($k).+,)
804 );
805 ( $lvl:expr, $($arg:tt)+ ) => (
806 $crate::event!(target: module_path!(), $lvl, { $($arg)+ })
807 );
808}
809
5099ac24
FG
810/// Checks whether a span or event is [enabled] based on the provided [metadata].
811///
812/// [enabled]: crate::Subscriber::enabled
813/// [metadata]: crate::Metadata
814///
815/// This macro is a specialized tool: it is intended to be used prior
816/// to an expensive computation required *just* for that event, but
817/// *cannot* be done as part of an argument to that event, such as
818/// when multiple events are emitted (e.g., iterating over a collection
819/// and emitting an event for each item).
820///
821/// # Usage
822///
823/// [Subscribers] can make filtering decisions based all the data included in a
824/// span or event's [`Metadata`]. This means that it is possible for `enabled!`
825/// to return a _false positive_ (indicating that something would be enabled
826/// when it actually would not be) or a _false negative_ (indicating that
827/// something would be disabled when it would actually be enabled).
828///
829/// [Subscribers]: crate::subscriber::Subscriber
830/// [`Metadata`]: crate::metadata::Metadata
831///
832/// This occurs when a subscriber is using a _more specific_ filter than the
833/// metadata provided to the `enabled!` macro. Some situations that can result
834/// in false positives or false negatives include:
835///
836/// - If a subscriber is using a filter which may enable a span or event based
837/// on field names, but `enabled!` is invoked without listing field names,
838/// `enabled!` may return a false negative if a specific field name would
839/// cause the subscriber to enable something that would otherwise be disabled.
840/// - If a subscriber is using a filter which enables or disables specific events by
841/// file path and line number, a particular event may be enabled/disabled
842/// even if an `enabled!` invocation with the same level, target, and fields
843/// indicated otherwise.
844/// - The subscriber can choose to enable _only_ spans or _only_ events, which `enabled`
845/// will not reflect.
846///
847/// `enabled!()` requires a [level](crate::Level) argument, an optional `target:`
848/// argument, and an optional set of field names. If the fields are not provided,
849/// they are considered to be unknown. `enabled!` attempts to match the
850/// syntax of `event!()` as closely as possible, which can be seen in the
851/// examples below.
852///
853/// # Examples
854///
855/// If the current subscriber is interested in recording `DEBUG`-level spans and
856/// events in the current file and module path, this will evaluate to true:
857/// ```rust
858/// use tracing::{enabled, Level};
859///
860/// if enabled!(Level::DEBUG) {
861/// // some expensive work...
862/// }
863/// ```
864///
865/// If the current subscriber is interested in recording spans and events
866/// in the current file and module path, with the target "my_crate", and at the
867/// level `DEBUG`, this will evaluate to true:
868/// ```rust
869/// # use tracing::{enabled, Level};
870/// if enabled!(target: "my_crate", Level::DEBUG) {
871/// // some expensive work...
872/// }
873/// ```
874///
875/// If the current subscriber is interested in recording spans and events
876/// in the current file and module path, with the target "my_crate", at
877/// the level `DEBUG`, and with a field named "hello", this will evaluate
878/// to true:
879///
880/// ```rust
881/// # use tracing::{enabled, Level};
882/// if enabled!(target: "my_crate", Level::DEBUG, hello) {
883/// // some expensive work...
884/// }
885/// ```
886///
887#[macro_export]
888macro_rules! enabled {
889 (target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({
890 if $crate::level_enabled!($lvl) {
891 use $crate::__macro_support::Callsite as _;
892 static CALLSITE: $crate::__macro_support::MacroCallsite = $crate::callsite2! {
ee023bcb 893 name: $crate::__macro_support::concat!(
5099ac24
FG
894 "enabled ",
895 file!(),
896 ":",
897 line!()
898 ),
899 kind: $crate::metadata::Kind::HINT,
900 target: $target,
901 level: $lvl,
902 fields: $($fields)*
903 };
904 let interest = CALLSITE.interest();
905 if !interest.is_never() && CALLSITE.is_enabled(interest) {
906 let meta = CALLSITE.metadata();
907 $crate::dispatcher::get_default(|current| current.enabled(meta))
908 } else {
909 false
910 }
911 } else {
912 false
913 }
914 });
915 // Just target and level
916 (target: $target:expr, $lvl:expr ) => (
917 $crate::enabled!(target: $target, $lvl, { })
918 );
919
920 // These two cases handle fields with no values
921 (target: $target:expr, $lvl:expr, $($field:tt)*) => (
922 $crate::enabled!(
923 target: $target,
924 $lvl,
925 { $($field)*}
926 )
927 );
928 ($lvl:expr, $($field:tt)*) => (
929 $crate::enabled!(
930 target: module_path!(),
931 $lvl,
932 { $($field)*}
933 )
934 );
935
936 // Simplest `enabled!` case
937 ( $lvl:expr ) => (
938 $crate::enabled!(target: module_path!(), $lvl, { })
939 );
940}
941
f035d41b
XL
942/// Constructs an event at the trace level.
943///
944/// This functions similarly to the [`event!`] macro. See [the top-level
945/// documentation][lib] for details on the syntax accepted by
946/// this macro.
947///
948/// [`event!`]: macro.event.html
949/// [lib]: index.html#using-the-macros
950///
951/// # Examples
952///
953/// ```rust
954/// use tracing::trace;
955/// # #[derive(Debug, Copy, Clone)] struct Position { x: f32, y: f32 }
956/// # impl Position {
957/// # const ORIGIN: Self = Self { x: 0.0, y: 0.0 };
958/// # fn dist(&self, other: Position) -> f32 {
959/// # let x = (other.x - self.x).exp2(); let y = (self.y - other.y).exp2();
960/// # (x + y).sqrt()
961/// # }
962/// # }
963/// # fn main() {
964/// let pos = Position { x: 3.234, y: -1.223 };
965/// let origin_dist = pos.dist(Position::ORIGIN);
966///
967/// trace!(position = ?pos, ?origin_dist);
968/// trace!(
969/// target: "app_events",
970/// position = ?pos,
971/// "x is {} and y is {}",
972/// if pos.x >= 0.0 { "positive" } else { "negative" },
973/// if pos.y >= 0.0 { "positive" } else { "negative" }
974/// );
975/// # }
976/// ```
977#[macro_export]
978macro_rules! trace {
979 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
980 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*)
981 );
982 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
983 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
984 );
985 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
986 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
987 );
988 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
989 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ })
990 );
991 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
992 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+)
993 );
994 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
995 $crate::event!(
996 target: module_path!(),
997 parent: $parent,
998 $crate::Level::TRACE,
999 { $($field)+ },
1000 $($arg)+
1001 )
1002 );
1003 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
1004 $crate::event!(
1005 target: module_path!(),
1006 parent: $parent,
1007 $crate::Level::TRACE,
1008 { $($k).+ = $($field)*}
1009 )
1010 );
1011 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
1012 $crate::event!(
1013 target: module_path!(),
1014 parent: $parent,
1015 $crate::Level::TRACE,
1016 { ?$($k).+ = $($field)*}
1017 )
1018 );
1019 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
1020 $crate::event!(
1021 target: module_path!(),
1022 parent: $parent,
1023 $crate::Level::TRACE,
1024 { %$($k).+ = $($field)*}
1025 )
1026 );
1027 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
1028 $crate::event!(
1029 target: module_path!(),
1030 parent: $parent,
1031 $crate::Level::TRACE,
1032 { $($k).+, $($field)*}
1033 )
1034 );
1035 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
1036 $crate::event!(
1037 target: module_path!(),
1038 parent: $parent,
1039 $crate::Level::TRACE,
1040 { ?$($k).+, $($field)*}
1041 )
1042 );
1043 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
1044 $crate::event!(
1045 target: module_path!(),
1046 parent: $parent,
1047 $crate::Level::TRACE,
1048 { %$($k).+, $($field)*}
1049 )
1050 );
1051 (parent: $parent:expr, $($arg:tt)+) => (
1052 $crate::event!(
1053 target: module_path!(),
1054 parent: $parent,
1055 $crate::Level::TRACE,
1056 {},
1057 $($arg)+
1058 )
1059 );
1060 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1061 $crate::event!(target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*)
1062 );
6a06907d
XL
1063 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1064 $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)* })
f035d41b 1065 );
6a06907d
XL
1066 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1067 $crate::event!(target: $target, $crate::Level::TRACE, { ?$($k).+ $($field)* })
f035d41b 1068 );
6a06907d
XL
1069 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1070 $crate::event!(target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* })
f035d41b
XL
1071 );
1072 (target: $target:expr, $($arg:tt)+ ) => (
1073 $crate::event!(target: $target, $crate::Level::TRACE, {}, $($arg)+)
1074 );
1075 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
1076 $crate::event!(
1077 target: module_path!(),
1078 $crate::Level::TRACE,
1079 { $($field)+ },
1080 $($arg)+
1081 )
1082 );
1083 ($($k:ident).+ = $($field:tt)*) => (
1084 $crate::event!(
1085 target: module_path!(),
1086 $crate::Level::TRACE,
1087 { $($k).+ = $($field)*}
1088 )
1089 );
1090 ($($k:ident).+, $($field:tt)*) => (
1091 $crate::event!(
1092 target: module_path!(),
1093 $crate::Level::TRACE,
1094 { $($k).+, $($field)*}
1095 )
1096 );
1097 (?$($k:ident).+, $($field:tt)*) => (
1098 $crate::event!(
1099 target: module_path!(),
1100 $crate::Level::TRACE,
1101 { ?$($k).+, $($field)*}
1102 )
1103 );
1104 (%$($k:ident).+, $($field:tt)*) => (
1105 $crate::event!(
1106 target: module_path!(),
1107 $crate::Level::TRACE,
1108 { %$($k).+, $($field)*}
1109 )
1110 );
1111 (?$($k:ident).+) => (
1112 $crate::event!(
1113 target: module_path!(),
1114 $crate::Level::TRACE,
1115 { ?$($k).+ }
1116 )
1117 );
1118 (%$($k:ident).+) => (
1119 $crate::event!(
1120 target: module_path!(),
1121 $crate::Level::TRACE,
1122 { %$($k).+ }
1123 )
1124 );
1125 ($($k:ident).+) => (
1126 $crate::event!(
1127 target: module_path!(),
1128 $crate::Level::TRACE,
1129 { $($k).+ }
1130 )
1131 );
1132 ($($arg:tt)+) => (
1133 $crate::event!(
1134 target: module_path!(),
1135 $crate::Level::TRACE,
1136 {},
1137 $($arg)+
1138 )
1139 );
1140}
1141
1142/// Constructs an event at the debug level.
1143///
1144/// This functions similarly to the [`event!`] macro. See [the top-level
1145/// documentation][lib] for details on the syntax accepted by
1146/// this macro.
1147///
1148/// [`event!`]: macro.event.html
1149/// [lib]: index.html#using-the-macros
1150///
1151/// # Examples
1152///
1153/// ```rust
1154/// use tracing::debug;
1155/// # fn main() {
1156/// # #[derive(Debug)] struct Position { x: f32, y: f32 }
1157///
1158/// let pos = Position { x: 3.234, y: -1.223 };
1159///
1160/// debug!(?pos.x, ?pos.y);
1161/// debug!(target: "app_events", position = ?pos, "New position");
1162/// # }
1163/// ```
1164#[macro_export]
1165macro_rules! debug {
1166 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1167 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1168 );
1169 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
1170 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
1171 );
1172 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
1173 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
1174 );
1175 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
1176 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ })
1177 );
1178 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1179 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+)
1180 );
1181 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
1182 $crate::event!(
1183 target: module_path!(),
1184 parent: $parent,
1185 $crate::Level::DEBUG,
1186 { $($field)+ },
1187 $($arg)+
1188 )
1189 );
1190 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
1191 $crate::event!(
1192 target: module_path!(),
1193 parent: $parent,
1194 $crate::Level::DEBUG,
1195 { $($k).+ = $($field)*}
1196 )
1197 );
1198 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
1199 $crate::event!(
1200 target: module_path!(),
1201 parent: $parent,
1202 $crate::Level::DEBUG,
1203 { ?$($k).+ = $($field)*}
1204 )
1205 );
1206 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
1207 $crate::event!(
1208 target: module_path!(),
1209 parent: $parent,
1210 $crate::Level::DEBUG,
1211 { %$($k).+ = $($field)*}
1212 )
1213 );
1214 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
1215 $crate::event!(
1216 target: module_path!(),
1217 parent: $parent,
1218 $crate::Level::DEBUG,
1219 { $($k).+, $($field)*}
1220 )
1221 );
1222 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
1223 $crate::event!(
1224 target: module_path!(),
1225 parent: $parent,
1226 $crate::Level::DEBUG,
1227 { ?$($k).+, $($field)*}
1228 )
1229 );
1230 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
1231 $crate::event!(
1232 target: module_path!(),
1233 parent: $parent,
1234 $crate::Level::DEBUG,
1235 { %$($k).+, $($field)*}
1236 )
1237 );
1238 (parent: $parent:expr, $($arg:tt)+) => (
1239 $crate::event!(
1240 target: module_path!(),
1241 parent: $parent,
1242 $crate::Level::DEBUG,
1243 {},
1244 $($arg)+
1245 )
1246 );
1247 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1248 $crate::event!(target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*)
1249 );
6a06907d
XL
1250 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1251 $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)* })
f035d41b 1252 );
6a06907d
XL
1253 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1254 $crate::event!(target: $target, $crate::Level::DEBUG, { ?$($k).+ $($field)* })
f035d41b 1255 );
6a06907d
XL
1256 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1257 $crate::event!(target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* })
f035d41b
XL
1258 );
1259 (target: $target:expr, $($arg:tt)+ ) => (
1260 $crate::event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+)
1261 );
1262 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
1263 $crate::event!(
1264 target: module_path!(),
1265 $crate::Level::DEBUG,
1266 { $($field)+ },
1267 $($arg)+
1268 )
1269 );
1270 ($($k:ident).+ = $($field:tt)*) => (
1271 $crate::event!(
1272 target: module_path!(),
1273 $crate::Level::DEBUG,
1274 { $($k).+ = $($field)*}
1275 )
1276 );
1277 (?$($k:ident).+ = $($field:tt)*) => (
1278 $crate::event!(
1279 target: module_path!(),
1280 $crate::Level::DEBUG,
1281 { ?$($k).+ = $($field)*}
1282 )
1283 );
1284 (%$($k:ident).+ = $($field:tt)*) => (
1285 $crate::event!(
1286 target: module_path!(),
1287 $crate::Level::DEBUG,
1288 { %$($k).+ = $($field)*}
1289 )
1290 );
1291 ($($k:ident).+, $($field:tt)*) => (
1292 $crate::event!(
1293 target: module_path!(),
1294 $crate::Level::DEBUG,
1295 { $($k).+, $($field)*}
1296 )
1297 );
1298 (?$($k:ident).+, $($field:tt)*) => (
1299 $crate::event!(
1300 target: module_path!(),
1301 $crate::Level::DEBUG,
1302 { ?$($k).+, $($field)*}
1303 )
1304 );
1305 (%$($k:ident).+, $($field:tt)*) => (
1306 $crate::event!(
1307 target: module_path!(),
1308 $crate::Level::DEBUG,
1309 { %$($k).+, $($field)*}
1310 )
1311 );
1312 (?$($k:ident).+) => (
1313 $crate::event!(
1314 target: module_path!(),
1315 $crate::Level::DEBUG,
1316 { ?$($k).+ }
1317 )
1318 );
1319 (%$($k:ident).+) => (
1320 $crate::event!(
1321 target: module_path!(),
1322 $crate::Level::DEBUG,
1323 { %$($k).+ }
1324 )
1325 );
1326 ($($k:ident).+) => (
1327 $crate::event!(
1328 target: module_path!(),
1329 $crate::Level::DEBUG,
1330 { $($k).+ }
1331 )
1332 );
1333 ($($arg:tt)+) => (
1334 $crate::event!(
1335 target: module_path!(),
1336 $crate::Level::DEBUG,
1337 {},
1338 $($arg)+
1339 )
1340 );
1341}
1342
1343/// Constructs an event at the info level.
1344///
1345/// This functions similarly to the [`event!`] macro. See [the top-level
1346/// documentation][lib] for details on the syntax accepted by
1347/// this macro.
1348///
1349/// [`event!`]: macro.event.html
1350/// [lib]: index.html#using-the-macros
1351///
1352/// # Examples
1353///
1354/// ```rust
1355/// use tracing::info;
1356/// # // this is so the test will still work in no-std mode
1357/// # #[derive(Debug)]
1358/// # pub struct Ipv4Addr;
1359/// # impl Ipv4Addr { fn new(o1: u8, o2: u8, o3: u8, o4: u8) -> Self { Self } }
1360/// # fn main() {
1361/// # struct Connection { port: u32, speed: f32 }
1362/// use tracing::field;
1363///
1364/// let addr = Ipv4Addr::new(127, 0, 0, 1);
1365/// let conn = Connection { port: 40, speed: 3.20 };
1366///
1367/// info!(conn.port, "connected to {:?}", addr);
1368/// info!(
1369/// target: "connection_events",
1370/// ip = ?addr,
1371/// conn.port,
1372/// ?conn.speed,
1373/// );
1374/// # }
1375/// ```
1376#[macro_export]
1377macro_rules! info {
1378 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1379 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*)
1380 );
1381 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
1382 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
1383 );
1384 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
1385 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
1386 );
1387 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
1388 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ })
1389 );
1390 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1391 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+)
1392 );
1393 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
1394 $crate::event!(
1395 target: module_path!(),
1396 parent: $parent,
1397 $crate::Level::INFO,
1398 { $($field)+ },
1399 $($arg)+
1400 )
1401 );
1402 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
1403 $crate::event!(
1404 target: module_path!(),
1405 parent: $parent,
1406 $crate::Level::INFO,
1407 { $($k).+ = $($field)*}
1408 )
1409 );
1410 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
1411 $crate::event!(
1412 target: module_path!(),
1413 parent: $parent,
1414 $crate::Level::INFO,
1415 { ?$($k).+ = $($field)*}
1416 )
1417 );
1418 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
1419 $crate::event!(
1420 target: module_path!(),
1421 parent: $parent,
1422 $crate::Level::INFO,
1423 { %$($k).+ = $($field)*}
1424 )
1425 );
1426 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
1427 $crate::event!(
1428 target: module_path!(),
1429 parent: $parent,
1430 $crate::Level::INFO,
1431 { $($k).+, $($field)*}
1432 )
1433 );
1434 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
1435 $crate::event!(
1436 target: module_path!(),
1437 parent: $parent,
1438 $crate::Level::INFO,
1439 { ?$($k).+, $($field)*}
1440 )
1441 );
1442 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
1443 $crate::event!(
1444 target: module_path!(),
1445 parent: $parent,
1446 $crate::Level::INFO,
1447 { %$($k).+, $($field)*}
1448 )
1449 );
1450 (parent: $parent:expr, $($arg:tt)+) => (
1451 $crate::event!(
1452 target: module_path!(),
1453 parent: $parent,
1454 $crate::Level::INFO,
1455 {},
1456 $($arg)+
1457 )
1458 );
1459 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1460 $crate::event!(target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*)
1461 );
6a06907d
XL
1462 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1463 $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* })
f035d41b 1464 );
6a06907d
XL
1465 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1466 $crate::event!(target: $target, $crate::Level::INFO, { ?$($k).+ $($field)* })
f035d41b 1467 );
6a06907d
XL
1468 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1469 $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* })
f035d41b
XL
1470 );
1471 (target: $target:expr, $($arg:tt)+ ) => (
1472 $crate::event!(target: $target, $crate::Level::INFO, {}, $($arg)+)
1473 );
1474 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
1475 $crate::event!(
1476 target: module_path!(),
1477 $crate::Level::INFO,
1478 { $($field)+ },
1479 $($arg)+
1480 )
1481 );
1482 ($($k:ident).+ = $($field:tt)*) => (
1483 $crate::event!(
1484 target: module_path!(),
1485 $crate::Level::INFO,
1486 { $($k).+ = $($field)*}
1487 )
1488 );
1489 (?$($k:ident).+ = $($field:tt)*) => (
1490 $crate::event!(
1491 target: module_path!(),
1492 $crate::Level::INFO,
1493 { ?$($k).+ = $($field)*}
1494 )
1495 );
1496 (%$($k:ident).+ = $($field:tt)*) => (
1497 $crate::event!(
1498 target: module_path!(),
6a06907d 1499 $crate::Level::INFO,
f035d41b
XL
1500 { %$($k).+ = $($field)*}
1501 )
1502 );
1503 ($($k:ident).+, $($field:tt)*) => (
1504 $crate::event!(
1505 target: module_path!(),
1506 $crate::Level::INFO,
1507 { $($k).+, $($field)*}
1508 )
1509 );
1510 (?$($k:ident).+, $($field:tt)*) => (
1511 $crate::event!(
1512 target: module_path!(),
1513 $crate::Level::INFO,
1514 { ?$($k).+, $($field)*}
1515 )
1516 );
1517 (%$($k:ident).+, $($field:tt)*) => (
1518 $crate::event!(
1519 target: module_path!(),
1520 $crate::Level::INFO,
1521 { %$($k).+, $($field)*}
1522 )
1523 );
1524 (?$($k:ident).+) => (
1525 $crate::event!(
1526 target: module_path!(),
1527 $crate::Level::INFO,
1528 { ?$($k).+ }
1529 )
1530 );
1531 (%$($k:ident).+) => (
1532 $crate::event!(
1533 target: module_path!(),
1534 $crate::Level::INFO,
1535 { %$($k).+ }
1536 )
1537 );
1538 ($($k:ident).+) => (
1539 $crate::event!(
1540 target: module_path!(),
1541 $crate::Level::INFO,
1542 { $($k).+ }
1543 )
1544 );
1545 ($($arg:tt)+) => (
1546 $crate::event!(
1547 target: module_path!(),
1548 $crate::Level::INFO,
1549 {},
1550 $($arg)+
1551 )
1552 );
1553}
1554
1555/// Constructs an event at the warn level.
1556///
1557/// This functions similarly to the [`event!`] macro. See [the top-level
1558/// documentation][lib] for details on the syntax accepted by
1559/// this macro.
1560///
1561/// [`event!`]: macro.event.html
1562/// [lib]: index.html#using-the-macros
1563///
1564/// # Examples
1565///
1566/// ```rust
1567/// use tracing::warn;
1568/// # fn main() {
1569///
1570/// let warn_description = "Invalid Input";
1571/// let input = &[0x27, 0x45];
1572///
1573/// warn!(?input, warning = warn_description);
1574/// warn!(
1575/// target: "input_events",
1576/// warning = warn_description,
1577/// "Received warning for input: {:?}", input,
1578/// );
1579/// # }
1580/// ```
1581#[macro_export]
1582macro_rules! warn {
1583 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1584 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*)
1585 );
1586 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
1587 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
1588 );
1589 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
1590 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
1591 );
1592 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
1593 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ })
1594 );
1595 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1596 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+)
1597 );
1598 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
1599 $crate::event!(
1600 target: module_path!(),
1601 parent: $parent,
1602 $crate::Level::WARN,
1603 { $($field)+ },
1604 $($arg)+
1605 )
1606 );
1607 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
1608 $crate::event!(
1609 target: module_path!(),
1610 parent: $parent,
1611 $crate::Level::WARN,
1612 { $($k).+ = $($field)*}
1613 )
1614 );
1615 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
1616 $crate::event!(
1617 target: module_path!(),
1618 parent: $parent,
1619 $crate::Level::WARN,
1620 { ?$($k).+ = $($field)*}
1621 )
1622 );
1623 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
1624 $crate::event!(
1625 target: module_path!(),
1626 parent: $parent,
1627 $crate::Level::WARN,
1628 { %$($k).+ = $($field)*}
1629 )
1630 );
1631 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
1632 $crate::event!(
1633 target: module_path!(),
1634 parent: $parent,
1635 $crate::Level::WARN,
1636 { $($k).+, $($field)*}
1637 )
1638 );
1639 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
1640 $crate::event!(
1641 target: module_path!(),
1642 parent: $parent,
1643 $crate::Level::WARN,
1644 { ?$($k).+, $($field)*}
1645 )
1646 );
1647 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
1648 $crate::event!(
1649 target: module_path!(),
1650 parent: $parent,
1651 $crate::Level::WARN,
1652 { %$($k).+, $($field)*}
1653 )
1654 );
1655 (parent: $parent:expr, $($arg:tt)+) => (
1656 $crate::event!(
1657 target: module_path!(),
1658 parent: $parent,
1659 $crate::Level::WARN,
1660 {},
1661 $($arg)+
1662 )
1663 );
1664 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1665 $crate::event!(target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*)
1666 );
6a06907d
XL
1667 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1668 $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)* })
f035d41b 1669 );
6a06907d
XL
1670 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1671 $crate::event!(target: $target, $crate::Level::WARN, { ?$($k).+ $($field)* })
f035d41b 1672 );
6a06907d
XL
1673 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1674 $crate::event!(target: $target, $crate::Level::WARN, { %$($k).+ $($field)* })
f035d41b
XL
1675 );
1676 (target: $target:expr, $($arg:tt)+ ) => (
1677 $crate::event!(target: $target, $crate::Level::WARN, {}, $($arg)+)
1678 );
1679 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
1680 $crate::event!(
1681 target: module_path!(),
1682 $crate::Level::WARN,
1683 { $($field)+ },
1684 $($arg)+
1685 )
1686 );
1687 ($($k:ident).+ = $($field:tt)*) => (
1688 $crate::event!(
1689 target: module_path!(),
1690 $crate::Level::WARN,
1691 { $($k).+ = $($field)*}
1692 )
1693 );
1694 (?$($k:ident).+ = $($field:tt)*) => (
1695 $crate::event!(
1696 target: module_path!(),
1697 $crate::Level::WARN,
1698 { ?$($k).+ = $($field)*}
1699 )
1700 );
1701 (%$($k:ident).+ = $($field:tt)*) => (
1702 $crate::event!(
1703 target: module_path!(),
ee023bcb 1704 $crate::Level::WARN,
f035d41b
XL
1705 { %$($k).+ = $($field)*}
1706 )
1707 );
1708 ($($k:ident).+, $($field:tt)*) => (
1709 $crate::event!(
1710 target: module_path!(),
1711 $crate::Level::WARN,
1712 { $($k).+, $($field)*}
1713 )
1714 );
1715 (?$($k:ident).+, $($field:tt)*) => (
1716 $crate::event!(
1717 target: module_path!(),
1718 $crate::Level::WARN,
1719 { ?$($k).+, $($field)*}
1720 )
1721 );
1722 (%$($k:ident).+, $($field:tt)*) => (
1723 $crate::event!(
1724 target: module_path!(),
1725 $crate::Level::WARN,
1726 { %$($k).+, $($field)*}
1727 )
1728 );
1729 (?$($k:ident).+) => (
1730 $crate::event!(
1731 target: module_path!(),
1732 $crate::Level::WARN,
1733 { ?$($k).+ }
1734 )
1735 );
1736 (%$($k:ident).+) => (
1737 $crate::event!(
1738 target: module_path!(),
1739 $crate::Level::WARN,
1740 { %$($k).+ }
1741 )
1742 );
1743 ($($k:ident).+) => (
1744 $crate::event!(
1745 target: module_path!(),
1746 $crate::Level::WARN,
1747 { $($k).+ }
1748 )
1749 );
1750 ($($arg:tt)+) => (
1751 $crate::event!(
1752 target: module_path!(),
1753 $crate::Level::WARN,
1754 {},
1755 $($arg)+
1756 )
1757 );
1758}
1759
1760/// Constructs an event at the error level.
1761///
1762/// This functions similarly to the [`event!`] macro. See [the top-level
1763/// documentation][lib] for details on the syntax accepted by
1764/// this macro.
1765///
1766/// [`event!`]: macro.event.html
1767/// [lib]: index.html#using-the-macros
1768///
1769/// # Examples
1770///
1771/// ```rust
1772/// use tracing::error;
1773/// # fn main() {
1774///
1775/// let (err_info, port) = ("No connection", 22);
1776///
1777/// error!(port, error = %err_info);
1778/// error!(target: "app_events", "App Error: {}", err_info);
1779/// error!({ info = err_info }, "error on port: {}", port);
1780/// # }
1781/// ```
1782#[macro_export]
1783macro_rules! error {
1784 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1785 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*)
1786 );
1787 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => (
1788 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
1789 );
1790 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => (
1791 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
1792 );
1793 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => (
1794 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ })
1795 );
1796 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => (
1797 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+)
1798 );
1799 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => (
1800 $crate::event!(
1801 target: module_path!(),
1802 parent: $parent,
1803 $crate::Level::ERROR,
1804 { $($field)+ },
1805 $($arg)+
1806 )
1807 );
1808 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => (
1809 $crate::event!(
1810 target: module_path!(),
1811 parent: $parent,
1812 $crate::Level::ERROR,
1813 { $($k).+ = $($field)*}
1814 )
1815 );
1816 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => (
1817 $crate::event!(
1818 target: module_path!(),
1819 parent: $parent,
1820 $crate::Level::ERROR,
1821 { ?$($k).+ = $($field)*}
1822 )
1823 );
1824 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => (
1825 $crate::event!(
1826 target: module_path!(),
1827 parent: $parent,
1828 $crate::Level::ERROR,
1829 { %$($k).+ = $($field)*}
1830 )
1831 );
1832 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => (
1833 $crate::event!(
1834 target: module_path!(),
1835 parent: $parent,
1836 $crate::Level::ERROR,
1837 { $($k).+, $($field)*}
1838 )
1839 );
1840 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => (
1841 $crate::event!(
1842 target: module_path!(),
1843 parent: $parent,
1844 $crate::Level::ERROR,
1845 { ?$($k).+, $($field)*}
1846 )
1847 );
1848 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => (
1849 $crate::event!(
1850 target: module_path!(),
1851 parent: $parent,
1852 $crate::Level::ERROR,
1853 { %$($k).+, $($field)*}
1854 )
1855 );
1856 (parent: $parent:expr, $($arg:tt)+) => (
1857 $crate::event!(
1858 target: module_path!(),
1859 parent: $parent,
1860 $crate::Level::ERROR,
1861 {},
1862 $($arg)+
1863 )
1864 );
1865 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => (
1866 $crate::event!(target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*)
1867 );
6a06907d
XL
1868 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => (
1869 $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)* })
f035d41b 1870 );
6a06907d
XL
1871 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => (
1872 $crate::event!(target: $target, $crate::Level::ERROR, { ?$($k).+ $($field)* })
f035d41b 1873 );
6a06907d
XL
1874 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => (
1875 $crate::event!(target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* })
f035d41b
XL
1876 );
1877 (target: $target:expr, $($arg:tt)+ ) => (
1878 $crate::event!(target: $target, $crate::Level::ERROR, {}, $($arg)+)
1879 );
1880 ({ $($field:tt)+ }, $($arg:tt)+ ) => (
1881 $crate::event!(
1882 target: module_path!(),
1883 $crate::Level::ERROR,
1884 { $($field)+ },
1885 $($arg)+
1886 )
1887 );
1888 ($($k:ident).+ = $($field:tt)*) => (
1889 $crate::event!(
1890 target: module_path!(),
1891 $crate::Level::ERROR,
1892 { $($k).+ = $($field)*}
1893 )
1894 );
1895 (?$($k:ident).+ = $($field:tt)*) => (
1896 $crate::event!(
1897 target: module_path!(),
1898 $crate::Level::ERROR,
1899 { ?$($k).+ = $($field)*}
1900 )
1901 );
1902 (%$($k:ident).+ = $($field:tt)*) => (
1903 $crate::event!(
1904 target: module_path!(),
6a06907d 1905 $crate::Level::ERROR,
f035d41b
XL
1906 { %$($k).+ = $($field)*}
1907 )
1908 );
1909 ($($k:ident).+, $($field:tt)*) => (
1910 $crate::event!(
1911 target: module_path!(),
1912 $crate::Level::ERROR,
1913 { $($k).+, $($field)*}
1914 )
1915 );
1916 (?$($k:ident).+, $($field:tt)*) => (
1917 $crate::event!(
1918 target: module_path!(),
1919 $crate::Level::ERROR,
1920 { ?$($k).+, $($field)*}
1921 )
1922 );
1923 (%$($k:ident).+, $($field:tt)*) => (
1924 $crate::event!(
1925 target: module_path!(),
1926 $crate::Level::ERROR,
1927 { %$($k).+, $($field)*}
1928 )
1929 );
1930 (?$($k:ident).+) => (
1931 $crate::event!(
1932 target: module_path!(),
1933 $crate::Level::ERROR,
1934 { ?$($k).+ }
1935 )
1936 );
1937 (%$($k:ident).+) => (
1938 $crate::event!(
1939 target: module_path!(),
1940 $crate::Level::ERROR,
1941 { %$($k).+ }
1942 )
1943 );
1944 ($($k:ident).+) => (
1945 $crate::event!(
1946 target: module_path!(),
1947 $crate::Level::ERROR,
1948 { $($k).+ }
1949 )
1950 );
1951 ($($arg:tt)+) => (
1952 $crate::event!(
1953 target: module_path!(),
1954 $crate::Level::ERROR,
1955 {},
1956 $($arg)+
1957 )
1958 );
1959}
1960
1961/// Constructs a new static callsite for a span or event.
1962#[doc(hidden)]
1963#[macro_export]
1964macro_rules! callsite {
1965 (name: $name:expr, kind: $kind:expr, fields: $($fields:tt)*) => {{
1966 $crate::callsite! {
1967 name: $name,
1968 kind: $kind,
1969 target: module_path!(),
1970 level: $crate::Level::TRACE,
1971 fields: $($fields)*
1972 }
1973 }};
1974 (
1975 name: $name:expr,
1976 kind: $kind:expr,
1977 level: $lvl:expr,
1978 fields: $($fields:tt)*
1979 ) => {{
1980 $crate::callsite! {
1981 name: $name,
1982 kind: $kind,
1983 target: module_path!(),
1984 level: $lvl,
1985 fields: $($fields)*
1986 }
1987 }};
1988 (
1989 name: $name:expr,
1990 kind: $kind:expr,
1991 target: $target:expr,
1992 level: $lvl:expr,
1993 fields: $($fields:tt)*
1994 ) => {{
3dfed10e
XL
1995 use $crate::__macro_support::MacroCallsite;
1996 static META: $crate::Metadata<'static> = {
f035d41b
XL
1997 $crate::metadata! {
1998 name: $name,
1999 target: $target,
2000 level: $lvl,
2001 fields: $crate::fieldset!( $($fields)* ),
3dfed10e 2002 callsite: &CALLSITE,
f035d41b
XL
2003 kind: $kind,
2004 }
2005 };
3dfed10e
XL
2006 static CALLSITE: MacroCallsite = MacroCallsite::new(&META);
2007 CALLSITE.register();
2008 &CALLSITE
f035d41b
XL
2009 }};
2010}
2011
5869c6ff
XL
2012/// Constructs a new static callsite for a span or event.
2013#[doc(hidden)]
2014#[macro_export]
2015macro_rules! callsite2 {
2016 (name: $name:expr, kind: $kind:expr, fields: $($fields:tt)*) => {{
2017 $crate::callsite2! {
2018 name: $name,
2019 kind: $kind,
2020 target: module_path!(),
2021 level: $crate::Level::TRACE,
2022 fields: $($fields)*
2023 }
2024 }};
2025 (
2026 name: $name:expr,
2027 kind: $kind:expr,
2028 level: $lvl:expr,
2029 fields: $($fields:tt)*
2030 ) => {{
2031 $crate::callsite2! {
2032 name: $name,
2033 kind: $kind,
2034 target: module_path!(),
2035 level: $lvl,
2036 fields: $($fields)*
2037 }
2038 }};
2039 (
2040 name: $name:expr,
2041 kind: $kind:expr,
2042 target: $target:expr,
2043 level: $lvl:expr,
2044 fields: $($fields:tt)*
2045 ) => {{
2046 use $crate::__macro_support::MacroCallsite;
2047 static META: $crate::Metadata<'static> = {
2048 $crate::metadata! {
2049 name: $name,
2050 target: $target,
2051 level: $lvl,
2052 fields: $crate::fieldset!( $($fields)* ),
2053 callsite: &CALLSITE,
2054 kind: $kind,
2055 }
2056 };
2057 MacroCallsite::new(&META)
2058 }};
2059}
2060
f035d41b 2061#[macro_export]
3dfed10e 2062// TODO: determine if this ought to be public API?`
f035d41b
XL
2063#[doc(hidden)]
2064macro_rules! level_enabled {
2065 ($lvl:expr) => {
3dfed10e
XL
2066 $lvl <= $crate::level_filters::STATIC_MAX_LEVEL
2067 && $lvl <= $crate::level_filters::LevelFilter::current()
f035d41b
XL
2068 };
2069}
2070
f035d41b
XL
2071#[doc(hidden)]
2072#[macro_export]
2073macro_rules! valueset {
2074
2075 // === base case ===
2076 (@ { $(,)* $($val:expr),* $(,)* }, $next:expr $(,)*) => {
2077 &[ $($val),* ]
2078 };
2079
2080 // === recursive case (more tts) ===
2081
2082 // TODO(#1138): determine a new syntax for uninitialized span fields, and
2083 // re-enable this.
2084 // (@{ $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = _, $($rest:tt)*) => {
2085 // $crate::valueset!(@ { $($out),*, (&$next, None) }, $next, $($rest)*)
2086 // };
2087 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => {
2088 $crate::valueset!(
2089 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) },
2090 $next,
2091 $($rest)*
2092 )
2093 };
2094 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => {
2095 $crate::valueset!(
2096 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) },
2097 $next,
2098 $($rest)*
2099 )
2100 };
2101 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => {
2102 $crate::valueset!(
2103 @ { $($out),*, (&$next, Some(&$val as &Value)) },
2104 $next,
2105 $($rest)*
2106 )
2107 };
2108 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+, $($rest:tt)*) => {
2109 $crate::valueset!(
2110 @ { $($out),*, (&$next, Some(&$($k).+ as &Value)) },
2111 $next,
2112 $($rest)*
2113 )
2114 };
2115 (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+, $($rest:tt)*) => {
2116 $crate::valueset!(
2117 @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &Value)) },
2118 $next,
2119 $($rest)*
2120 )
2121 };
2122 (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+, $($rest:tt)*) => {
2123 $crate::valueset!(
2124 @ { $($out),*, (&$next, Some(&display(&$($k).+) as &Value)) },
2125 $next,
2126 $($rest)*
2127 )
2128 };
2129 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => {
2130 $crate::valueset!(
2131 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) },
2132 $next,
2133 )
2134 };
2135 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr) => {
2136 $crate::valueset!(
2137 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) },
2138 $next,
2139 )
2140 };
2141 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => {
2142 $crate::valueset!(
2143 @ { $($out),*, (&$next, Some(&$val as &Value)) },
2144 $next,
2145 )
2146 };
2147 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+) => {
2148 $crate::valueset!(
2149 @ { $($out),*, (&$next, Some(&$($k).+ as &Value)) },
2150 $next,
2151 )
2152 };
2153 (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+) => {
2154 $crate::valueset!(
2155 @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &Value)) },
2156 $next,
2157 )
2158 };
2159 (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+) => {
2160 $crate::valueset!(
2161 @ { $($out),*, (&$next, Some(&display(&$($k).+) as &Value)) },
2162 $next,
2163 )
2164 };
3dfed10e
XL
2165
2166 // Handle literal names
2167 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => {
2168 $crate::valueset!(
2169 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) },
2170 $next,
2171 $($rest)*
2172 )
2173 };
2174 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => {
2175 $crate::valueset!(
2176 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) },
2177 $next,
2178 $($rest)*
2179 )
2180 };
2181 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => {
2182 $crate::valueset!(
2183 @ { $($out),*, (&$next, Some(&$val as &Value)) },
2184 $next,
2185 $($rest)*
2186 )
2187 };
2188 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => {
2189 $crate::valueset!(
2190 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) },
2191 $next,
2192 )
2193 };
2194 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => {
2195 $crate::valueset!(
2196 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) },
2197 $next,
2198 )
2199 };
2200 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => {
2201 $crate::valueset!(
2202 @ { $($out),*, (&$next, Some(&$val as &Value)) },
2203 $next,
2204 )
2205 };
2206
f035d41b
XL
2207 // Remainder is unparseable, but exists --- must be format args!
2208 (@ { $(,)* $($out:expr),* }, $next:expr, $($rest:tt)+) => {
2209 $crate::valueset!(@ { (&$next, Some(&format_args!($($rest)+) as &Value)), $($out),* }, $next, )
2210 };
2211
2212 // === entry ===
2213 ($fields:expr, $($kvs:tt)+) => {
2214 {
2215 #[allow(unused_imports)]
2216 use $crate::field::{debug, display, Value};
2217 let mut iter = $fields.iter();
2218 $fields.value_set($crate::valueset!(
2219 @ { },
2220 iter.next().expect("FieldSet corrupted (this is a bug)"),
2221 $($kvs)+
2222 ))
2223 }
2224 };
2225 ($fields:expr,) => {
2226 {
2227 $fields.value_set(&[])
2228 }
2229 };
2230}
2231
2232#[doc(hidden)]
2233#[macro_export]
2234macro_rules! fieldset {
2235 // == base case ==
2236 (@ { $(,)* $($out:expr),* $(,)* } $(,)*) => {
2237 &[ $($out),* ]
2238 };
2239
2240 // == recursive cases (more tts) ==
2241 (@ { $(,)* $($out:expr),* } $($k:ident).+ = ?$val:expr, $($rest:tt)*) => {
2242 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2243 };
2244 (@ { $(,)* $($out:expr),* } $($k:ident).+ = %$val:expr, $($rest:tt)*) => {
2245 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2246 };
2247 (@ { $(,)* $($out:expr),* } $($k:ident).+ = $val:expr, $($rest:tt)*) => {
2248 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2249 };
2250 // TODO(#1138): determine a new syntax for uninitialized span fields, and
2251 // re-enable this.
2252 // (@ { $($out:expr),* } $($k:ident).+ = _, $($rest:tt)*) => {
2253 // $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2254 // };
2255 (@ { $(,)* $($out:expr),* } ?$($k:ident).+, $($rest:tt)*) => {
2256 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2257 };
2258 (@ { $(,)* $($out:expr),* } %$($k:ident).+, $($rest:tt)*) => {
2259 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2260 };
2261 (@ { $(,)* $($out:expr),* } $($k:ident).+, $($rest:tt)*) => {
2262 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2263 };
2264
3dfed10e
XL
2265 // Handle literal names
2266 (@ { $(,)* $($out:expr),* } $k:literal = ?$val:expr, $($rest:tt)*) => {
2267 $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
2268 };
2269 (@ { $(,)* $($out:expr),* } $k:literal = %$val:expr, $($rest:tt)*) => {
2270 $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
2271 };
2272 (@ { $(,)* $($out:expr),* } $k:literal = $val:expr, $($rest:tt)*) => {
2273 $crate::fieldset!(@ { $($out),*, $k } $($rest)*)
2274 };
2275
f035d41b
XL
2276 // Remainder is unparseable, but exists --- must be format args!
2277 (@ { $(,)* $($out:expr),* } $($rest:tt)+) => {
2278 $crate::fieldset!(@ { "message", $($out),*, })
2279 };
2280
2281 // == entry ==
2282 ($($args:tt)*) => {
2283 $crate::fieldset!(@ { } $($args)*,)
2284 };
2285
2286}
2287
2288#[cfg(feature = "log")]
2289#[doc(hidden)]
2290#[macro_export]
2291macro_rules! level_to_log {
2292 ($level:expr) => {
5869c6ff 2293 match $level {
3dfed10e
XL
2294 $crate::Level::ERROR => $crate::log::Level::Error,
2295 $crate::Level::WARN => $crate::log::Level::Warn,
2296 $crate::Level::INFO => $crate::log::Level::Info,
2297 $crate::Level::DEBUG => $crate::log::Level::Debug,
f035d41b
XL
2298 _ => $crate::log::Level::Trace,
2299 }
2300 };
2301}
2302
2303#[doc(hidden)]
2304#[macro_export]
2305macro_rules! __tracing_stringify {
2306 ($s:expr) => {
2307 stringify!($s)
2308 };
2309}
2310
2311#[cfg(not(feature = "log"))]
2312#[doc(hidden)]
2313#[macro_export]
2314macro_rules! __tracing_log {
5099ac24 2315 (target: $target:expr, $level:expr, $value_set:expr ) => {};
f035d41b
XL
2316}
2317
2318#[cfg(feature = "log")]
2319#[doc(hidden)]
2320#[macro_export]
2321macro_rules! __tracing_log {
5099ac24 2322 (target: $target:expr, $level:expr, $value_set:expr ) => {
6a06907d 2323 $crate::if_log_enabled! { $level, {
f035d41b 2324 use $crate::log;
5869c6ff 2325 let level = $crate::level_to_log!($level);
6a06907d 2326 if level <= log::max_level() {
f035d41b
XL
2327 let log_meta = log::Metadata::builder()
2328 .level(level)
2329 .target($target)
2330 .build();
2331 let logger = log::logger();
2332 if logger.enabled(&log_meta) {
2333 logger.log(&log::Record::builder()
2334 .file(Some(file!()))
2335 .module_path(Some(module_path!()))
2336 .line(Some(line!()))
2337 .metadata(log_meta)
5099ac24 2338 .args(format_args!("{}", $crate::__macro_support::LogValueSet($value_set)))
f035d41b
XL
2339 .build());
2340 }
2341 }
2342 }}
2343 };
2344}
2345
2346#[cfg(not(feature = "log"))]
2347#[doc(hidden)]
2348#[macro_export]
2349macro_rules! if_log_enabled {
6a06907d
XL
2350 ($lvl:expr, $e:expr;) => {
2351 $crate::if_log_enabled! { $lvl, $e }
f035d41b 2352 };
6a06907d
XL
2353 ($lvl:expr, $if_log:block) => {
2354 $crate::if_log_enabled! { $lvl, $if_log else {} }
f035d41b 2355 };
6a06907d 2356 ($lvl:expr, $if_log:block else $else_block:block) => {
f035d41b
XL
2357 $else_block
2358 };
2359}
2360
2361#[cfg(all(feature = "log", not(feature = "log-always")))]
2362#[doc(hidden)]
2363#[macro_export]
2364macro_rules! if_log_enabled {
6a06907d
XL
2365 ($lvl:expr, $e:expr;) => {
2366 $crate::if_log_enabled! { $lvl, $e }
f035d41b 2367 };
6a06907d
XL
2368 ($lvl:expr, $if_log:block) => {
2369 $crate::if_log_enabled! { $lvl, $if_log else {} }
f035d41b 2370 };
6a06907d
XL
2371 ($lvl:expr, $if_log:block else $else_block:block) => {
2372 if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL {
2373 if !$crate::dispatcher::has_been_set() {
2374 $if_log
2375 } else {
2376 $else_block
2377 }
f035d41b
XL
2378 } else {
2379 $else_block
2380 }
2381 };
2382}
2383
2384#[cfg(all(feature = "log", feature = "log-always"))]
2385#[doc(hidden)]
2386#[macro_export]
2387macro_rules! if_log_enabled {
6a06907d
XL
2388 ($lvl:expr, $e:expr;) => {
2389 $crate::if_log_enabled! { $lvl, $e }
f035d41b 2390 };
6a06907d
XL
2391 ($lvl:expr, $if_log:block) => {
2392 $crate::if_log_enabled! { $lvl, $if_log else {} }
f035d41b 2393 };
6a06907d
XL
2394 ($lvl:expr, $if_log:block else $else_block:block) => {
2395 if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL {
2396 #[allow(unused_braces)]
2397 $if_log
2398 } else {
2399 $else_block
2400 }
f035d41b
XL
2401 };
2402}