1 /// Constructs a new span.
3 /// See [the top-level documentation][lib] for details on the syntax accepted by
6 /// [lib]: crate#using-the-macros
10 /// Creating a new span:
12 /// # use tracing::{span, Level};
14 /// let span = span!(Level::TRACE, "my span");
15 /// let _enter = span.enter();
16 /// // do work inside the span...
21 (target
: $target
:expr
, parent
: $parent
:expr
, $lvl
:expr
, $name
:expr
) => {
22 $
crate::span
!(target
: $target
, parent
: $parent
, $lvl
, $name
,)
24 (target
: $target
:expr
, parent
: $parent
:expr
, $lvl
:expr
, $name
:expr
, $
($fields
:tt
)*) => {
26 use $
crate::__macro_support
::Callsite
as _
;
27 static CALLSITE
: $
crate::__macro_support
::MacroCallsite
= $
crate::callsite2
! {
29 kind
: $
crate::metadata
::Kind
::SPAN
,
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
)
39 let meta
= CALLSITE
.metadata();
40 // span with explicit parent
41 $
crate::Span
::child_of(
44 &$
crate::valueset
!(meta
.fields(), $
($fields
)*),
47 let span
= CALLSITE
.disabled_span();
48 $
crate::if_log_enabled
! { $lvl
, {
49 span
.record_all(&$
crate::valueset
!(CALLSITE
.metadata().fields(), $
($fields
)*));
55 (target
: $target
:expr
, $lvl
:expr
, $name
:expr
, $
($fields
:tt
)*) => {
57 use $
crate::__macro_support
::Callsite
as _
;
58 static CALLSITE
: $
crate::__macro_support
::MacroCallsite
= $
crate::callsite2
! {
60 kind
: $
crate::metadata
::Kind
::SPAN
,
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
)
70 let meta
= CALLSITE
.metadata();
71 // span with contextual parent
74 &$
crate::valueset
!(meta
.fields(), $
($fields
)*),
77 let span
= CALLSITE
.disabled_span();
78 $
crate::if_log_enabled
! { $lvl
, {
79 span
.record_all(&$
crate::valueset
!(CALLSITE
.metadata().fields(), $
($fields
)*));
85 (target
: $target
:expr
, parent
: $parent
:expr
, $lvl
:expr
, $name
:expr
) => {
86 $
crate::span
!(target
: $target
, parent
: $parent
, $lvl
, $name
,)
88 (parent
: $parent
:expr
, $lvl
:expr
, $name
:expr
, $
($fields
:tt
)*) => {
90 target
: module_path
!(),
97 (parent
: $parent
:expr
, $lvl
:expr
, $name
:expr
) => {
99 target
: module_path
!(),
105 (target
: $target
:expr
, $lvl
:expr
, $name
:expr
, $
($fields
:tt
)*) => {
113 (target
: $target
:expr
, $lvl
:expr
, $name
:expr
) => {
114 $
crate::span
!(target
: $target
, $lvl
, $name
,)
116 ($lvl
:expr
, $name
:expr
, $
($fields
:tt
)*) => {
118 target
: module_path
!(),
124 ($lvl
:expr
, $name
:expr
) => {
126 target
: module_path
!(),
133 /// Constructs a span at the trace level.
135 /// [Fields] and [attributes] are set using the same syntax as the [`span!`]
138 /// See [the top-level documentation][lib] for details on the syntax accepted by
141 /// [lib]: crate#using-the-macros
142 /// [attributes]: crate#configuring-attributes
143 /// [Fields]: crate#recording-fields
144 /// [`span!`]: crate::span!
149 /// # use tracing::{trace_span, span, Level};
151 /// trace_span!("my_span");
152 /// // is equivalent to:
153 /// span!(Level::TRACE, "my_span");
158 /// # use tracing::{trace_span, span, Level};
160 /// let span = trace_span!("my span");
161 /// span.in_scope(|| {
162 /// // do work inside the span...
167 macro_rules
! trace_span
{
168 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
172 $
crate::Level
::TRACE
,
177 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
) => {
178 $
crate::trace_span
!(target
: $target
, parent
: $parent
, $name
,)
180 (parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
182 target
: module_path
!(),
184 $
crate::Level
::TRACE
,
189 (parent
: $parent
:expr
, $name
:expr
) => {
190 $
crate::trace_span
!(parent
: $parent
, $name
,)
192 (target
: $target
:expr
, $name
:expr
, $
($field
:tt
)*) => {
195 $
crate::Level
::TRACE
,
200 (target
: $target
:expr
, $name
:expr
) => {
201 $
crate::trace_span
!(target
: $target
, $name
,)
203 ($name
:expr
, $
($field
:tt
)*) => {
205 target
: module_path
!(),
206 $
crate::Level
::TRACE
,
211 ($name
:expr
) => { $crate::trace_span!($name,) }
;
214 /// Constructs a span at the debug level.
216 /// [Fields] and [attributes] are set using the same syntax as the [`span!`]
219 /// See [the top-level documentation][lib] for details on the syntax accepted by
222 /// [lib]: crate#using-the-macros
223 /// [attributes]: crate#configuring-attributes
224 /// [Fields]: crate#recording-fields
225 /// [`span!`]: crate::span!
230 /// # use tracing::{debug_span, span, Level};
232 /// debug_span!("my_span");
233 /// // is equivalent to:
234 /// span!(Level::DEBUG, "my_span");
239 /// # use tracing::debug_span;
241 /// let span = debug_span!("my span");
242 /// span.in_scope(|| {
243 /// // do work inside the span...
248 macro_rules
! debug_span
{
249 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
253 $
crate::Level
::DEBUG
,
258 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
) => {
259 $
crate::debug_span
!(target
: $target
, parent
: $parent
, $name
,)
261 (parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
263 target
: module_path
!(),
265 $
crate::Level
::DEBUG
,
270 (parent
: $parent
:expr
, $name
:expr
) => {
271 $
crate::debug_span
!(parent
: $parent
, $name
,)
273 (target
: $target
:expr
, $name
:expr
, $
($field
:tt
)*) => {
276 $
crate::Level
::DEBUG
,
281 (target
: $target
:expr
, $name
:expr
) => {
282 $
crate::debug_span
!(target
: $target
, $name
,)
284 ($name
:expr
, $
($field
:tt
)*) => {
286 target
: module_path
!(),
287 $
crate::Level
::DEBUG
,
292 ($name
:expr
) => {$crate::debug_span!($name,)}
;
295 /// Constructs a span at the info level.
297 /// [Fields] and [attributes] are set using the same syntax as the [`span!`]
300 /// See [the top-level documentation][lib] for details on the syntax accepted by
303 /// [lib]: crate#using-the-macros
304 /// [attributes]: crate#configuring-attributes
305 /// [Fields]: crate#recording-fields
306 /// [`span!`]: crate::span!
311 /// # use tracing::{span, info_span, Level};
313 /// info_span!("my_span");
314 /// // is equivalent to:
315 /// span!(Level::INFO, "my_span");
320 /// # use tracing::info_span;
322 /// let span = info_span!("my span");
323 /// span.in_scope(|| {
324 /// // do work inside the span...
329 macro_rules
! info_span
{
330 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
339 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
) => {
340 $
crate::info_span
!(target
: $target
, parent
: $parent
, $name
,)
342 (parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
344 target
: module_path
!(),
351 (parent
: $parent
:expr
, $name
:expr
) => {
352 $
crate::info_span
!(parent
: $parent
, $name
,)
354 (target
: $target
:expr
, $name
:expr
, $
($field
:tt
)*) => {
362 (target
: $target
:expr
, $name
:expr
) => {
363 $
crate::info_span
!(target
: $target
, $name
,)
365 ($name
:expr
, $
($field
:tt
)*) => {
367 target
: module_path
!(),
373 ($name
:expr
) => {$crate::info_span!($name,)}
;
376 /// Constructs a span at the warn level.
378 /// [Fields] and [attributes] are set using the same syntax as the [`span!`]
381 /// See [the top-level documentation][lib] for details on the syntax accepted by
384 /// [lib]: crate#using-the-macros
385 /// [attributes]: crate#configuring-attributes
386 /// [Fields]: crate#recording-fields
387 /// [`span!`]: crate::span!
392 /// # use tracing::{warn_span, span, Level};
394 /// warn_span!("my_span");
395 /// // is equivalent to:
396 /// span!(Level::WARN, "my_span");
401 /// use tracing::warn_span;
403 /// let span = warn_span!("my span");
404 /// span.in_scope(|| {
405 /// // do work inside the span...
410 macro_rules
! warn_span
{
411 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
420 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
) => {
421 $
crate::warn_span
!(target
: $target
, parent
: $parent
, $name
,)
423 (parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
425 target
: module_path
!(),
432 (parent
: $parent
:expr
, $name
:expr
) => {
433 $
crate::warn_span
!(parent
: $parent
, $name
,)
435 (target
: $target
:expr
, $name
:expr
, $
($field
:tt
)*) => {
443 (target
: $target
:expr
, $name
:expr
) => {
444 $
crate::warn_span
!(target
: $target
, $name
,)
446 ($name
:expr
, $
($field
:tt
)*) => {
448 target
: module_path
!(),
454 ($name
:expr
) => {$crate::warn_span!($name,)}
;
456 /// Constructs a span at the error level.
458 /// [Fields] and [attributes] are set using the same syntax as the [`span!`]
461 /// See [the top-level documentation][lib] for details on the syntax accepted by
464 /// [lib]: crate#using-the-macros
465 /// [attributes]: crate#configuring-attributes
466 /// [Fields]: crate#recording-fields
467 /// [`span!`]: crate::span!
472 /// # use tracing::{span, error_span, Level};
474 /// error_span!("my_span");
475 /// // is equivalent to:
476 /// span!(Level::ERROR, "my_span");
481 /// # use tracing::error_span;
483 /// let span = error_span!("my span");
484 /// span.in_scope(|| {
485 /// // do work inside the span...
490 macro_rules
! error_span
{
491 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
495 $
crate::Level
::ERROR
,
500 (target
: $target
:expr
, parent
: $parent
:expr
, $name
:expr
) => {
501 $
crate::error_span
!(target
: $target
, parent
: $parent
, $name
,)
503 (parent
: $parent
:expr
, $name
:expr
, $
($field
:tt
)*) => {
505 target
: module_path
!(),
507 $
crate::Level
::ERROR
,
512 (parent
: $parent
:expr
, $name
:expr
) => {
513 $
crate::error_span
!(parent
: $parent
, $name
,)
515 (target
: $target
:expr
, $name
:expr
, $
($field
:tt
)*) => {
518 $
crate::Level
::ERROR
,
523 (target
: $target
:expr
, $name
:expr
) => {
524 $
crate::error_span
!(target
: $target
, $name
,)
526 ($name
:expr
, $
($field
:tt
)*) => {
528 target
: module_path
!(),
529 $
crate::Level
::ERROR
,
534 ($name
:expr
) => {$crate::error_span!($name,)}
;
537 /// Constructs a new `Event`.
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".
543 /// See [the top-level documentation][lib] for details on the syntax accepted by
546 /// [lib]: crate#using-the-macros
551 /// use tracing::{event, Level};
554 /// let data = (42, "forty-two");
555 /// let private_data = "private";
556 /// let error = "a bad error";
558 /// event!(Level::ERROR, %error, "Received error");
560 /// target: "app_events",
564 /// "App warning: {}",
567 /// event!(Level::INFO, the_answer = data.0);
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.
576 // /// For example, the following does not compile:
577 // /// ```rust,compile_fail
578 // /// # use tracing::{Level, event};
580 // /// event!(Level::INFO, foo = 5, bad_field, bar = "hello")
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
! {
588 name
: $
crate::__macro_support
::concat
!(
594 kind
: $
crate::metadata
::Kind
::EVENT
,
600 let enabled
= $
crate::level_enabled
!($lvl
) && {
601 let interest
= CALLSITE
.interest();
602 !interest
.is_never() && CALLSITE
.is_enabled(interest
)
605 (|value_set
: $
crate::field
::ValueSet
| {
606 $
crate::__tracing_log
!(
611 let meta
= CALLSITE
.metadata();
612 // event with explicit parent
613 $
crate::Event
::child_of(
618 })($
crate::valueset
!(CALLSITE
.metadata().fields(), $
($fields
)*));
620 $
crate::__tracing_log
!(
623 &$
crate::valueset
!(CALLSITE
.metadata().fields(), $
($fields
)*)
628 (target
: $target
:expr
, parent
: $parent
:expr
, $lvl
:expr
, { $($fields:tt)* }
, $
($arg
:tt
)+ ) => (
633 { message = format_args!($($arg)+), $($fields)* }
636 (target
: $target
:expr
, parent
: $parent
:expr
, $lvl
:expr
, $
($k
:ident
).+ = $
($fields
:tt
)* ) => (
637 $
crate::event
!(target
: $target
, parent
: $parent
, $lvl
, { $($k).+ = $($fields)* }
)
639 (target
: $target
:expr
, parent
: $parent
:expr
, $lvl
:expr
, $
($arg
:tt
)+) => (
640 $
crate::event
!(target
: $target
, parent
: $parent
, $lvl
, { $($arg)+ }
)
642 (target
: $target
:expr
, $lvl
:expr
, { $($fields:tt)* }
)=> ({
643 use $
crate::__macro_support
::Callsite
as _
;
644 static CALLSITE
: $
crate::__macro_support
::MacroCallsite
= $
crate::callsite2
! {
645 name
: $
crate::__macro_support
::concat
!(
651 kind
: $
crate::metadata
::Kind
::EVENT
,
656 let enabled
= $
crate::level_enabled
!($lvl
) && {
657 let interest
= CALLSITE
.interest();
658 !interest
.is_never() && CALLSITE
.is_enabled(interest
)
661 (|value_set
: $
crate::field
::ValueSet
| {
662 let meta
= CALLSITE
.metadata();
663 // event with contextual parent
664 $
crate::Event
::dispatch(
668 $
crate::__tracing_log
!(
673 })($
crate::valueset
!(CALLSITE
.metadata().fields(), $
($fields
)*));
675 $
crate::__tracing_log
!(
678 &$
crate::valueset
!(CALLSITE
.metadata().fields(), $
($fields
)*)
682 (target
: $target
:expr
, $lvl
:expr
, { $($fields:tt)* }
, $
($arg
:tt
)+ ) => (
686 { message = format_args!($($arg)+), $($fields)* }
689 (target
: $target
:expr
, $lvl
:expr
, $
($k
:ident
).+ = $
($fields
:tt
)* ) => (
690 $
crate::event
!(target
: $target
, $lvl
, { $($k).+ = $($fields)* }
)
692 (target
: $target
:expr
, $lvl
:expr
, $
($arg
:tt
)+ ) => (
693 $
crate::event
!(target
: $target
, $lvl
, { $($arg)+ }
)
695 (parent
: $parent
:expr
, $lvl
:expr
, { $($fields:tt)* }
, $
($arg
:tt
)+ ) => (
697 target
: module_path
!(),
700 { message = format_args!($($arg)+), $($fields)* }
703 (parent
: $parent
:expr
, $lvl
:expr
, $
($k
:ident
).+ = $
($field
:tt
)*) => (
705 target
: module_path
!(),
708 { $($k).+ = $($field)*}
711 (parent
: $parent
:expr
, $lvl
:expr
, ?$
($k
:ident
).+ = $
($field
:tt
)*) => (
713 target
: module_path
!(),
716 { ?$($k).+ = $($field)*}
719 (parent
: $parent
:expr
, $lvl
:expr
, %$
($k
:ident
).+ = $
($field
:tt
)*) => (
721 target
: module_path
!(),
724 { %$($k).+ = $($field)*}
727 (parent
: $parent
:expr
, $lvl
:expr
, $
($k
:ident
).+, $
($field
:tt
)*) => (
729 target
: module_path
!(),
732 { $($k).+, $($field)*}
735 (parent
: $parent
:expr
, $lvl
:expr
, %$
($k
:ident
).+, $
($field
:tt
)*) => (
737 target
: module_path
!(),
740 { %$($k).+, $($field)*}
743 (parent
: $parent
:expr
, $lvl
:expr
, ?$
($k
:ident
).+, $
($field
:tt
)*) => (
745 target
: module_path
!(),
748 { ?$($k).+, $($field)*}
751 (parent
: $parent
:expr
, $lvl
:expr
, $
($arg
:tt
)+ ) => (
752 $
crate::event
!(target
: module_path
!(), parent
: $parent
, $lvl
, { $($arg)+ }
)
754 ( $lvl
:expr
, { $($fields:tt)* }
, $
($arg
:tt
)+ ) => (
756 target
: module_path
!(),
758 { message = format_args!($($arg)+), $($fields)* }
761 ( $lvl
:expr
, { $($fields:tt)* }
, $
($arg
:tt
)+ ) => (
763 target
: module_path
!(),
765 { message = format_args!($($arg)+), $($fields)* }
768 ($lvl
:expr
, $
($k
:ident
).+ = $
($field
:tt
)*) => (
770 target
: module_path
!(),
772 { $($k).+ = $($field)*}
775 ($lvl
:expr
, $
($k
:ident
).+, $
($field
:tt
)*) => (
777 target
: module_path
!(),
779 { $($k).+, $($field)*}
782 ($lvl
:expr
, ?$
($k
:ident
).+, $
($field
:tt
)*) => (
784 target
: module_path
!(),
786 { ?$($k).+, $($field)*}
789 ($lvl
:expr
, %$
($k
:ident
).+, $
($field
:tt
)*) => (
791 target
: module_path
!(),
793 { %$($k).+, $($field)*}
796 ($lvl
:expr
, ?$
($k
:ident
).+) => (
797 $
crate::event
!($lvl
, ?$
($k
).+,)
799 ($lvl
:expr
, %$
($k
:ident
).+) => (
800 $
crate::event
!($lvl
, %$
($k
).+,)
802 ($lvl
:expr
, $
($k
:ident
).+) => (
803 $
crate::event
!($lvl
, $
($k
).+,)
805 ( $lvl
:expr
, $
($arg
:tt
)+ ) => (
806 $
crate::event
!(target
: module_path
!(), $lvl
, { $($arg)+ }
)
810 /// Tests whether an event with the specified level and target would be enabled.
812 /// This is similar to [`enabled!`], but queries the current subscriber specifically for
813 /// an event, whereas [`enabled!`] queries for an event _or_ span.
815 /// See the documentation for [`enabled!]` for more details on using this macro.
816 /// See also [`span_enabled!`].
821 /// # use tracing::{event_enabled, Level};
822 /// if event_enabled!(target: "my_crate", Level::DEBUG) {
823 /// // some expensive work...
826 /// if event_enabled!(Level::DEBUG) {
827 /// // some expensive work...
830 /// if event_enabled!(Level::DEBUG, foo_field) {
831 /// // some expensive work...
836 macro_rules
! event_enabled
{
838 $
crate::enabled
!(kind
: $
crate::metadata
::Kind
::EVENT
, $
($rest
)*)
842 /// Tests whether a span with the specified level and target would be enabled.
844 /// This is similar to [`enabled!`], but queries the current subscriber specifically for
845 /// an event, whereas [`enabled!`] queries for an event _or_ span.
847 /// See the documentation for [`enabled!]` for more details on using this macro.
848 /// See also [`span_enabled!`].
853 /// # use tracing::{span_enabled, Level};
854 /// if span_enabled!(target: "my_crate", Level::DEBUG) {
855 /// // some expensive work...
858 /// if span_enabled!(Level::DEBUG) {
859 /// // some expensive work...
862 /// if span_enabled!(Level::DEBUG, foo_field) {
863 /// // some expensive work...
868 macro_rules
! span_enabled
{
870 $
crate::enabled
!(kind
: $
crate::metadata
::Kind
::SPAN
, $
($rest
)*)
874 /// Checks whether a span or event is [enabled] based on the provided [metadata].
876 /// [enabled]: crate::Subscriber::enabled
877 /// [metadata]: crate::Metadata
879 /// This macro is a specialized tool: it is intended to be used prior
880 /// to an expensive computation required *just* for that event, but
881 /// *cannot* be done as part of an argument to that event, such as
882 /// when multiple events are emitted (e.g., iterating over a collection
883 /// and emitting an event for each item).
887 /// [Subscribers] can make filtering decisions based all the data included in a
888 /// span or event's [`Metadata`]. This means that it is possible for `enabled!`
889 /// to return a _false positive_ (indicating that something would be enabled
890 /// when it actually would not be) or a _false negative_ (indicating that
891 /// something would be disabled when it would actually be enabled).
893 /// [Subscribers]: crate::subscriber::Subscriber
894 /// [`Metadata`]: crate::metadata::Metadata
896 /// This occurs when a subscriber is using a _more specific_ filter than the
897 /// metadata provided to the `enabled!` macro. Some situations that can result
898 /// in false positives or false negatives include:
900 /// - If a subscriber is using a filter which may enable a span or event based
901 /// on field names, but `enabled!` is invoked without listing field names,
902 /// `enabled!` may return a false negative if a specific field name would
903 /// cause the subscriber to enable something that would otherwise be disabled.
904 /// - If a subscriber is using a filter which enables or disables specific events by
905 /// file path and line number, a particular event may be enabled/disabled
906 /// even if an `enabled!` invocation with the same level, target, and fields
907 /// indicated otherwise.
908 /// - The subscriber can choose to enable _only_ spans or _only_ events, which `enabled`
909 /// will not reflect.
911 /// `enabled!()` requires a [level](crate::Level) argument, an optional `target:`
912 /// argument, and an optional set of field names. If the fields are not provided,
913 /// they are considered to be unknown. `enabled!` attempts to match the
914 /// syntax of `event!()` as closely as possible, which can be seen in the
919 /// If the current subscriber is interested in recording `DEBUG`-level spans and
920 /// events in the current file and module path, this will evaluate to true:
922 /// use tracing::{enabled, Level};
924 /// if enabled!(Level::DEBUG) {
925 /// // some expensive work...
929 /// If the current subscriber is interested in recording spans and events
930 /// in the current file and module path, with the target "my_crate", and at the
931 /// level `DEBUG`, this will evaluate to true:
933 /// # use tracing::{enabled, Level};
934 /// if enabled!(target: "my_crate", Level::DEBUG) {
935 /// // some expensive work...
939 /// If the current subscriber is interested in recording spans and events
940 /// in the current file and module path, with the target "my_crate", at
941 /// the level `DEBUG`, and with a field named "hello", this will evaluate
945 /// # use tracing::{enabled, Level};
946 /// if enabled!(target: "my_crate", Level::DEBUG, hello) {
947 /// // some expensive work...
953 /// `enabled!` queries subscribers with [`Metadata`] where
954 /// [`is_event`] and [`is_span`] both return `false`. Alternatively,
955 /// use [`event_enabled!`] or [`span_enabled!`] to ensure one of these
959 /// [`Metadata`]: crate::Metadata
960 /// [`is_event`]: crate::Metadata::is_event
961 /// [`is_span`]: crate::Metadata::is_span
964 macro_rules
! enabled
{
965 (kind
: $kind
:expr
, target
: $target
:expr
, $lvl
:expr
, { $($fields:tt)* }
)=> ({
966 if $
crate::level_enabled
!($lvl
) {
967 use $
crate::__macro_support
::Callsite
as _
;
968 static CALLSITE
: $
crate::__macro_support
::MacroCallsite
= $
crate::callsite2
! {
969 name
: $
crate::__macro_support
::concat
!(
980 let interest
= CALLSITE
.interest();
981 if !interest
.is_never() && CALLSITE
.is_enabled(interest
) {
982 let meta
= CALLSITE
.metadata();
983 $
crate::dispatcher
::get_default(|current
| current
.enabled(meta
))
991 // Just target and level
992 (kind
: $kind
:expr
, target
: $target
:expr
, $lvl
:expr
) => (
993 $
crate::enabled
!(kind
: $kind
, target
: $target
, $lvl
, { }
)
995 (target
: $target
:expr
, $lvl
:expr
) => (
996 $
crate::enabled
!(kind
: $
crate::metadata
::Kind
::HINT
, target
: $target
, $lvl
, { }
)
999 // These four cases handle fields with no values
1000 (kind
: $kind
:expr
, target
: $target
:expr
, $lvl
:expr
, $
($field
:tt
)*) => (
1008 (target
: $target
:expr
, $lvl
:expr
, $
($field
:tt
)*) => (
1010 kind
: $
crate::metadata
::Kind
::HINT
,
1017 // Level and field case
1018 (kind
: $kind
:expr
, $lvl
:expr
, $
($field
:tt
)*) => (
1021 target
: module_path
!(),
1027 // Simplest `enabled!` case
1028 (kind
: $kind
:expr
, $lvl
:expr
) => (
1029 $
crate::enabled
!(kind
: $kind
, target
: module_path
!(), $lvl
, { }
)
1032 $
crate::enabled
!(kind
: $
crate::metadata
::Kind
::HINT
, target
: module_path
!(), $lvl
, { }
)
1035 // Fallthrough from above
1036 ($lvl
:expr
, $
($field
:tt
)*) => (
1038 kind
: $
crate::metadata
::Kind
::HINT
,
1039 target
: module_path
!(),
1046 /// Constructs an event at the trace level.
1048 /// This functions similarly to the [`event!`] macro. See [the top-level
1049 /// documentation][lib] for details on the syntax accepted by
1052 /// [`event!`]: crate::event!
1053 /// [lib]: crate#using-the-macros
1058 /// use tracing::trace;
1059 /// # #[derive(Debug, Copy, Clone)] struct Position { x: f32, y: f32 }
1060 /// # impl Position {
1061 /// # const ORIGIN: Self = Self { x: 0.0, y: 0.0 };
1062 /// # fn dist(&self, other: Position) -> f32 {
1063 /// # let x = (other.x - self.x).exp2(); let y = (self.y - other.y).exp2();
1064 /// # (x + y).sqrt()
1068 /// let pos = Position { x: 3.234, y: -1.223 };
1069 /// let origin_dist = pos.dist(Position::ORIGIN);
1071 /// trace!(position = ?pos, ?origin_dist);
1073 /// target: "app_events",
1074 /// position = ?pos,
1075 /// "x is {} and y is {}",
1076 /// if pos.x >= 0.0 { "positive" } else { "negative" },
1077 /// if pos.y >= 0.0 { "positive" } else { "negative" }
1082 macro_rules
! trace
{
1083 (target
: $target
:expr
, parent
: $parent
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1084 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::TRACE
, { $($field)* }
, $
($arg
)*)
1086 (target
: $target
:expr
, parent
: $parent
:expr
, $
($k
:ident
).+ $
($field
:tt
)+ ) => (
1087 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::TRACE
, { $($k).+ $($field)+ }
)
1089 (target
: $target
:expr
, parent
: $parent
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1090 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::TRACE
, { $($k).+ $($field)+ }
)
1092 (target
: $target
:expr
, parent
: $parent
:expr
, %$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1093 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::TRACE
, { $($k).+ $($field)+ }
)
1095 (target
: $target
:expr
, parent
: $parent
:expr
, $
($arg
:tt
)+ ) => (
1096 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::TRACE
, {}
, $
($arg
)+)
1098 (parent
: $parent
:expr
, { $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1100 target
: module_path
!(),
1102 $
crate::Level
::TRACE
,
1107 (parent
: $parent
:expr
, $
($k
:ident
).+ = $
($field
:tt
)*) => (
1109 target
: module_path
!(),
1111 $
crate::Level
::TRACE
,
1112 { $($k).+ = $($field)*}
1115 (parent
: $parent
:expr
, ?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1117 target
: module_path
!(),
1119 $
crate::Level
::TRACE
,
1120 { ?$($k).+ = $($field)*}
1123 (parent
: $parent
:expr
, %$
($k
:ident
).+ = $
($field
:tt
)*) => (
1125 target
: module_path
!(),
1127 $
crate::Level
::TRACE
,
1128 { %$($k).+ = $($field)*}
1131 (parent
: $parent
:expr
, $
($k
:ident
).+, $
($field
:tt
)*) => (
1133 target
: module_path
!(),
1135 $
crate::Level
::TRACE
,
1136 { $($k).+, $($field)*}
1139 (parent
: $parent
:expr
, ?$
($k
:ident
).+, $
($field
:tt
)*) => (
1141 target
: module_path
!(),
1143 $
crate::Level
::TRACE
,
1144 { ?$($k).+, $($field)*}
1147 (parent
: $parent
:expr
, %$
($k
:ident
).+, $
($field
:tt
)*) => (
1149 target
: module_path
!(),
1151 $
crate::Level
::TRACE
,
1152 { %$($k).+, $($field)*}
1155 (parent
: $parent
:expr
, $
($arg
:tt
)+) => (
1157 target
: module_path
!(),
1159 $
crate::Level
::TRACE
,
1164 (target
: $target
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1165 $
crate::event
!(target
: $target
, $
crate::Level
::TRACE
, { $($field)* }
, $
($arg
)*)
1167 (target
: $target
:expr
, $
($k
:ident
).+ $
($field
:tt
)* ) => (
1168 $
crate::event
!(target
: $target
, $
crate::Level
::TRACE
, { $($k).+ $($field)* }
)
1170 (target
: $target
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)* ) => (
1171 $
crate::event
!(target
: $target
, $
crate::Level
::TRACE
, { ?$($k).+ $($field)* }
)
1173 (target
: $target
:expr
, %$
($k
:ident
).+ $
($field
:tt
)* ) => (
1174 $
crate::event
!(target
: $target
, $
crate::Level
::TRACE
, { %$($k).+ $($field)* }
)
1176 (target
: $target
:expr
, $
($arg
:tt
)+ ) => (
1177 $
crate::event
!(target
: $target
, $
crate::Level
::TRACE
, {}
, $
($arg
)+)
1179 ({ $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1181 target
: module_path
!(),
1182 $
crate::Level
::TRACE
,
1187 ($
($k
:ident
).+ = $
($field
:tt
)*) => (
1189 target
: module_path
!(),
1190 $
crate::Level
::TRACE
,
1191 { $($k).+ = $($field)*}
1194 ($
($k
:ident
).+, $
($field
:tt
)*) => (
1196 target
: module_path
!(),
1197 $
crate::Level
::TRACE
,
1198 { $($k).+, $($field)*}
1201 (?$
($k
:ident
).+, $
($field
:tt
)*) => (
1203 target
: module_path
!(),
1204 $
crate::Level
::TRACE
,
1205 { ?$($k).+, $($field)*}
1208 (%$
($k
:ident
).+, $
($field
:tt
)*) => (
1210 target
: module_path
!(),
1211 $
crate::Level
::TRACE
,
1212 { %$($k).+, $($field)*}
1215 (?$
($k
:ident
).+) => (
1217 target
: module_path
!(),
1218 $
crate::Level
::TRACE
,
1222 (%$
($k
:ident
).+) => (
1224 target
: module_path
!(),
1225 $
crate::Level
::TRACE
,
1229 ($
($k
:ident
).+) => (
1231 target
: module_path
!(),
1232 $
crate::Level
::TRACE
,
1238 target
: module_path
!(),
1239 $
crate::Level
::TRACE
,
1246 /// Constructs an event at the debug level.
1248 /// This functions similarly to the [`event!`] macro. See [the top-level
1249 /// documentation][lib] for details on the syntax accepted by
1252 /// [`event!`]: crate::event!
1253 /// [lib]: crate#using-the-macros
1258 /// use tracing::debug;
1260 /// # #[derive(Debug)] struct Position { x: f32, y: f32 }
1262 /// let pos = Position { x: 3.234, y: -1.223 };
1264 /// debug!(?pos.x, ?pos.y);
1265 /// debug!(target: "app_events", position = ?pos, "New position");
1269 macro_rules
! debug
{
1270 (target
: $target
:expr
, parent
: $parent
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1271 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::DEBUG
, { $($field)* }
, $
($arg
)*)
1273 (target
: $target
:expr
, parent
: $parent
:expr
, $
($k
:ident
).+ $
($field
:tt
)+ ) => (
1274 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::DEBUG
, { $($k).+ $($field)+ }
)
1276 (target
: $target
:expr
, parent
: $parent
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1277 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::DEBUG
, { $($k).+ $($field)+ }
)
1279 (target
: $target
:expr
, parent
: $parent
:expr
, %$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1280 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::DEBUG
, { $($k).+ $($field)+ }
)
1282 (target
: $target
:expr
, parent
: $parent
:expr
, $
($arg
:tt
)+ ) => (
1283 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::DEBUG
, {}
, $
($arg
)+)
1285 (parent
: $parent
:expr
, { $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1287 target
: module_path
!(),
1289 $
crate::Level
::DEBUG
,
1294 (parent
: $parent
:expr
, $
($k
:ident
).+ = $
($field
:tt
)*) => (
1296 target
: module_path
!(),
1298 $
crate::Level
::DEBUG
,
1299 { $($k).+ = $($field)*}
1302 (parent
: $parent
:expr
, ?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1304 target
: module_path
!(),
1306 $
crate::Level
::DEBUG
,
1307 { ?$($k).+ = $($field)*}
1310 (parent
: $parent
:expr
, %$
($k
:ident
).+ = $
($field
:tt
)*) => (
1312 target
: module_path
!(),
1314 $
crate::Level
::DEBUG
,
1315 { %$($k).+ = $($field)*}
1318 (parent
: $parent
:expr
, $
($k
:ident
).+, $
($field
:tt
)*) => (
1320 target
: module_path
!(),
1322 $
crate::Level
::DEBUG
,
1323 { $($k).+, $($field)*}
1326 (parent
: $parent
:expr
, ?$
($k
:ident
).+, $
($field
:tt
)*) => (
1328 target
: module_path
!(),
1330 $
crate::Level
::DEBUG
,
1331 { ?$($k).+, $($field)*}
1334 (parent
: $parent
:expr
, %$
($k
:ident
).+, $
($field
:tt
)*) => (
1336 target
: module_path
!(),
1338 $
crate::Level
::DEBUG
,
1339 { %$($k).+, $($field)*}
1342 (parent
: $parent
:expr
, $
($arg
:tt
)+) => (
1344 target
: module_path
!(),
1346 $
crate::Level
::DEBUG
,
1351 (target
: $target
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1352 $
crate::event
!(target
: $target
, $
crate::Level
::DEBUG
, { $($field)* }
, $
($arg
)*)
1354 (target
: $target
:expr
, $
($k
:ident
).+ $
($field
:tt
)* ) => (
1355 $
crate::event
!(target
: $target
, $
crate::Level
::DEBUG
, { $($k).+ $($field)* }
)
1357 (target
: $target
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)* ) => (
1358 $
crate::event
!(target
: $target
, $
crate::Level
::DEBUG
, { ?$($k).+ $($field)* }
)
1360 (target
: $target
:expr
, %$
($k
:ident
).+ $
($field
:tt
)* ) => (
1361 $
crate::event
!(target
: $target
, $
crate::Level
::DEBUG
, { %$($k).+ $($field)* }
)
1363 (target
: $target
:expr
, $
($arg
:tt
)+ ) => (
1364 $
crate::event
!(target
: $target
, $
crate::Level
::DEBUG
, {}
, $
($arg
)+)
1366 ({ $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1368 target
: module_path
!(),
1369 $
crate::Level
::DEBUG
,
1374 ($
($k
:ident
).+ = $
($field
:tt
)*) => (
1376 target
: module_path
!(),
1377 $
crate::Level
::DEBUG
,
1378 { $($k).+ = $($field)*}
1381 (?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1383 target
: module_path
!(),
1384 $
crate::Level
::DEBUG
,
1385 { ?$($k).+ = $($field)*}
1388 (%$
($k
:ident
).+ = $
($field
:tt
)*) => (
1390 target
: module_path
!(),
1391 $
crate::Level
::DEBUG
,
1392 { %$($k).+ = $($field)*}
1395 ($
($k
:ident
).+, $
($field
:tt
)*) => (
1397 target
: module_path
!(),
1398 $
crate::Level
::DEBUG
,
1399 { $($k).+, $($field)*}
1402 (?$
($k
:ident
).+, $
($field
:tt
)*) => (
1404 target
: module_path
!(),
1405 $
crate::Level
::DEBUG
,
1406 { ?$($k).+, $($field)*}
1409 (%$
($k
:ident
).+, $
($field
:tt
)*) => (
1411 target
: module_path
!(),
1412 $
crate::Level
::DEBUG
,
1413 { %$($k).+, $($field)*}
1416 (?$
($k
:ident
).+) => (
1418 target
: module_path
!(),
1419 $
crate::Level
::DEBUG
,
1423 (%$
($k
:ident
).+) => (
1425 target
: module_path
!(),
1426 $
crate::Level
::DEBUG
,
1430 ($
($k
:ident
).+) => (
1432 target
: module_path
!(),
1433 $
crate::Level
::DEBUG
,
1439 target
: module_path
!(),
1440 $
crate::Level
::DEBUG
,
1447 /// Constructs an event at the info level.
1449 /// This functions similarly to the [`event!`] macro. See [the top-level
1450 /// documentation][lib] for details on the syntax accepted by
1453 /// [`event!`]: crate::event!
1454 /// [lib]: crate#using-the-macros
1459 /// use tracing::info;
1460 /// # // this is so the test will still work in no-std mode
1461 /// # #[derive(Debug)]
1462 /// # pub struct Ipv4Addr;
1463 /// # impl Ipv4Addr { fn new(o1: u8, o2: u8, o3: u8, o4: u8) -> Self { Self } }
1465 /// # struct Connection { port: u32, speed: f32 }
1466 /// use tracing::field;
1468 /// let addr = Ipv4Addr::new(127, 0, 0, 1);
1469 /// let conn = Connection { port: 40, speed: 3.20 };
1471 /// info!(conn.port, "connected to {:?}", addr);
1473 /// target: "connection_events",
1482 (target
: $target
:expr
, parent
: $parent
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1483 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::INFO
, { $($field)* }
, $
($arg
)*)
1485 (target
: $target
:expr
, parent
: $parent
:expr
, $
($k
:ident
).+ $
($field
:tt
)+ ) => (
1486 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::INFO
, { $($k).+ $($field)+ }
)
1488 (target
: $target
:expr
, parent
: $parent
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1489 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::INFO
, { $($k).+ $($field)+ }
)
1491 (target
: $target
:expr
, parent
: $parent
:expr
, %$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1492 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::INFO
, { $($k).+ $($field)+ }
)
1494 (target
: $target
:expr
, parent
: $parent
:expr
, $
($arg
:tt
)+ ) => (
1495 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::INFO
, {}
, $
($arg
)+)
1497 (parent
: $parent
:expr
, { $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1499 target
: module_path
!(),
1501 $
crate::Level
::INFO
,
1506 (parent
: $parent
:expr
, $
($k
:ident
).+ = $
($field
:tt
)*) => (
1508 target
: module_path
!(),
1510 $
crate::Level
::INFO
,
1511 { $($k).+ = $($field)*}
1514 (parent
: $parent
:expr
, ?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1516 target
: module_path
!(),
1518 $
crate::Level
::INFO
,
1519 { ?$($k).+ = $($field)*}
1522 (parent
: $parent
:expr
, %$
($k
:ident
).+ = $
($field
:tt
)*) => (
1524 target
: module_path
!(),
1526 $
crate::Level
::INFO
,
1527 { %$($k).+ = $($field)*}
1530 (parent
: $parent
:expr
, $
($k
:ident
).+, $
($field
:tt
)*) => (
1532 target
: module_path
!(),
1534 $
crate::Level
::INFO
,
1535 { $($k).+, $($field)*}
1538 (parent
: $parent
:expr
, ?$
($k
:ident
).+, $
($field
:tt
)*) => (
1540 target
: module_path
!(),
1542 $
crate::Level
::INFO
,
1543 { ?$($k).+, $($field)*}
1546 (parent
: $parent
:expr
, %$
($k
:ident
).+, $
($field
:tt
)*) => (
1548 target
: module_path
!(),
1550 $
crate::Level
::INFO
,
1551 { %$($k).+, $($field)*}
1554 (parent
: $parent
:expr
, $
($arg
:tt
)+) => (
1556 target
: module_path
!(),
1558 $
crate::Level
::INFO
,
1563 (target
: $target
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1564 $
crate::event
!(target
: $target
, $
crate::Level
::INFO
, { $($field)* }
, $
($arg
)*)
1566 (target
: $target
:expr
, $
($k
:ident
).+ $
($field
:tt
)* ) => (
1567 $
crate::event
!(target
: $target
, $
crate::Level
::INFO
, { $($k).+ $($field)* }
)
1569 (target
: $target
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)* ) => (
1570 $
crate::event
!(target
: $target
, $
crate::Level
::INFO
, { ?$($k).+ $($field)* }
)
1572 (target
: $target
:expr
, %$
($k
:ident
).+ $
($field
:tt
)* ) => (
1573 $
crate::event
!(target
: $target
, $
crate::Level
::INFO
, { $($k).+ $($field)* }
)
1575 (target
: $target
:expr
, $
($arg
:tt
)+ ) => (
1576 $
crate::event
!(target
: $target
, $
crate::Level
::INFO
, {}
, $
($arg
)+)
1578 ({ $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1580 target
: module_path
!(),
1581 $
crate::Level
::INFO
,
1586 ($
($k
:ident
).+ = $
($field
:tt
)*) => (
1588 target
: module_path
!(),
1589 $
crate::Level
::INFO
,
1590 { $($k).+ = $($field)*}
1593 (?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1595 target
: module_path
!(),
1596 $
crate::Level
::INFO
,
1597 { ?$($k).+ = $($field)*}
1600 (%$
($k
:ident
).+ = $
($field
:tt
)*) => (
1602 target
: module_path
!(),
1603 $
crate::Level
::INFO
,
1604 { %$($k).+ = $($field)*}
1607 ($
($k
:ident
).+, $
($field
:tt
)*) => (
1609 target
: module_path
!(),
1610 $
crate::Level
::INFO
,
1611 { $($k).+, $($field)*}
1614 (?$
($k
:ident
).+, $
($field
:tt
)*) => (
1616 target
: module_path
!(),
1617 $
crate::Level
::INFO
,
1618 { ?$($k).+, $($field)*}
1621 (%$
($k
:ident
).+, $
($field
:tt
)*) => (
1623 target
: module_path
!(),
1624 $
crate::Level
::INFO
,
1625 { %$($k).+, $($field)*}
1628 (?$
($k
:ident
).+) => (
1630 target
: module_path
!(),
1631 $
crate::Level
::INFO
,
1635 (%$
($k
:ident
).+) => (
1637 target
: module_path
!(),
1638 $
crate::Level
::INFO
,
1642 ($
($k
:ident
).+) => (
1644 target
: module_path
!(),
1645 $
crate::Level
::INFO
,
1651 target
: module_path
!(),
1652 $
crate::Level
::INFO
,
1659 /// Constructs an event at the warn level.
1661 /// This functions similarly to the [`event!`] macro. See [the top-level
1662 /// documentation][lib] for details on the syntax accepted by
1665 /// [`event!`]: crate::event!
1666 /// [lib]: crate#using-the-macros
1671 /// use tracing::warn;
1674 /// let warn_description = "Invalid Input";
1675 /// let input = &[0x27, 0x45];
1677 /// warn!(?input, warning = warn_description);
1679 /// target: "input_events",
1680 /// warning = warn_description,
1681 /// "Received warning for input: {:?}", input,
1687 (target
: $target
:expr
, parent
: $parent
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1688 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::WARN
, { $($field)* }
, $
($arg
)*)
1690 (target
: $target
:expr
, parent
: $parent
:expr
, $
($k
:ident
).+ $
($field
:tt
)+ ) => (
1691 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::WARN
, { $($k).+ $($field)+ }
)
1693 (target
: $target
:expr
, parent
: $parent
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1694 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::WARN
, { $($k).+ $($field)+ }
)
1696 (target
: $target
:expr
, parent
: $parent
:expr
, %$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1697 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::WARN
, { $($k).+ $($field)+ }
)
1699 (target
: $target
:expr
, parent
: $parent
:expr
, $
($arg
:tt
)+ ) => (
1700 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::WARN
, {}
, $
($arg
)+)
1702 (parent
: $parent
:expr
, { $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1704 target
: module_path
!(),
1706 $
crate::Level
::WARN
,
1711 (parent
: $parent
:expr
, $
($k
:ident
).+ = $
($field
:tt
)*) => (
1713 target
: module_path
!(),
1715 $
crate::Level
::WARN
,
1716 { $($k).+ = $($field)*}
1719 (parent
: $parent
:expr
, ?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1721 target
: module_path
!(),
1723 $
crate::Level
::WARN
,
1724 { ?$($k).+ = $($field)*}
1727 (parent
: $parent
:expr
, %$
($k
:ident
).+ = $
($field
:tt
)*) => (
1729 target
: module_path
!(),
1731 $
crate::Level
::WARN
,
1732 { %$($k).+ = $($field)*}
1735 (parent
: $parent
:expr
, $
($k
:ident
).+, $
($field
:tt
)*) => (
1737 target
: module_path
!(),
1739 $
crate::Level
::WARN
,
1740 { $($k).+, $($field)*}
1743 (parent
: $parent
:expr
, ?$
($k
:ident
).+, $
($field
:tt
)*) => (
1745 target
: module_path
!(),
1747 $
crate::Level
::WARN
,
1748 { ?$($k).+, $($field)*}
1751 (parent
: $parent
:expr
, %$
($k
:ident
).+, $
($field
:tt
)*) => (
1753 target
: module_path
!(),
1755 $
crate::Level
::WARN
,
1756 { %$($k).+, $($field)*}
1759 (parent
: $parent
:expr
, $
($arg
:tt
)+) => (
1761 target
: module_path
!(),
1763 $
crate::Level
::WARN
,
1768 (target
: $target
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1769 $
crate::event
!(target
: $target
, $
crate::Level
::WARN
, { $($field)* }
, $
($arg
)*)
1771 (target
: $target
:expr
, $
($k
:ident
).+ $
($field
:tt
)* ) => (
1772 $
crate::event
!(target
: $target
, $
crate::Level
::WARN
, { $($k).+ $($field)* }
)
1774 (target
: $target
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)* ) => (
1775 $
crate::event
!(target
: $target
, $
crate::Level
::WARN
, { ?$($k).+ $($field)* }
)
1777 (target
: $target
:expr
, %$
($k
:ident
).+ $
($field
:tt
)* ) => (
1778 $
crate::event
!(target
: $target
, $
crate::Level
::WARN
, { %$($k).+ $($field)* }
)
1780 (target
: $target
:expr
, $
($arg
:tt
)+ ) => (
1781 $
crate::event
!(target
: $target
, $
crate::Level
::WARN
, {}
, $
($arg
)+)
1783 ({ $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1785 target
: module_path
!(),
1786 $
crate::Level
::WARN
,
1791 ($
($k
:ident
).+ = $
($field
:tt
)*) => (
1793 target
: module_path
!(),
1794 $
crate::Level
::WARN
,
1795 { $($k).+ = $($field)*}
1798 (?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1800 target
: module_path
!(),
1801 $
crate::Level
::WARN
,
1802 { ?$($k).+ = $($field)*}
1805 (%$
($k
:ident
).+ = $
($field
:tt
)*) => (
1807 target
: module_path
!(),
1808 $
crate::Level
::WARN
,
1809 { %$($k).+ = $($field)*}
1812 ($
($k
:ident
).+, $
($field
:tt
)*) => (
1814 target
: module_path
!(),
1815 $
crate::Level
::WARN
,
1816 { $($k).+, $($field)*}
1819 (?$
($k
:ident
).+, $
($field
:tt
)*) => (
1821 target
: module_path
!(),
1822 $
crate::Level
::WARN
,
1823 { ?$($k).+, $($field)*}
1826 (%$
($k
:ident
).+, $
($field
:tt
)*) => (
1828 target
: module_path
!(),
1829 $
crate::Level
::WARN
,
1830 { %$($k).+, $($field)*}
1833 (?$
($k
:ident
).+) => (
1835 target
: module_path
!(),
1836 $
crate::Level
::WARN
,
1840 (%$
($k
:ident
).+) => (
1842 target
: module_path
!(),
1843 $
crate::Level
::WARN
,
1847 ($
($k
:ident
).+) => (
1849 target
: module_path
!(),
1850 $
crate::Level
::WARN
,
1856 target
: module_path
!(),
1857 $
crate::Level
::WARN
,
1864 /// Constructs an event at the error level.
1866 /// This functions similarly to the [`event!`] macro. See [the top-level
1867 /// documentation][lib] for details on the syntax accepted by
1870 /// [`event!`]: crate::event!
1871 /// [lib]: crate#using-the-macros
1876 /// use tracing::error;
1879 /// let (err_info, port) = ("No connection", 22);
1881 /// error!(port, error = %err_info);
1882 /// error!(target: "app_events", "App Error: {}", err_info);
1883 /// error!({ info = err_info }, "error on port: {}", port);
1887 macro_rules
! error
{
1888 (target
: $target
:expr
, parent
: $parent
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1889 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::ERROR
, { $($field)* }
, $
($arg
)*)
1891 (target
: $target
:expr
, parent
: $parent
:expr
, $
($k
:ident
).+ $
($field
:tt
)+ ) => (
1892 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::ERROR
, { $($k).+ $($field)+ }
)
1894 (target
: $target
:expr
, parent
: $parent
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1895 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::ERROR
, { $($k).+ $($field)+ }
)
1897 (target
: $target
:expr
, parent
: $parent
:expr
, %$
($k
:ident
).+ $
($field
:tt
)+ ) => (
1898 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::ERROR
, { $($k).+ $($field)+ }
)
1900 (target
: $target
:expr
, parent
: $parent
:expr
, $
($arg
:tt
)+ ) => (
1901 $
crate::event
!(target
: $target
, parent
: $parent
, $
crate::Level
::ERROR
, {}
, $
($arg
)+)
1903 (parent
: $parent
:expr
, { $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1905 target
: module_path
!(),
1907 $
crate::Level
::ERROR
,
1912 (parent
: $parent
:expr
, $
($k
:ident
).+ = $
($field
:tt
)*) => (
1914 target
: module_path
!(),
1916 $
crate::Level
::ERROR
,
1917 { $($k).+ = $($field)*}
1920 (parent
: $parent
:expr
, ?$
($k
:ident
).+ = $
($field
:tt
)*) => (
1922 target
: module_path
!(),
1924 $
crate::Level
::ERROR
,
1925 { ?$($k).+ = $($field)*}
1928 (parent
: $parent
:expr
, %$
($k
:ident
).+ = $
($field
:tt
)*) => (
1930 target
: module_path
!(),
1932 $
crate::Level
::ERROR
,
1933 { %$($k).+ = $($field)*}
1936 (parent
: $parent
:expr
, $
($k
:ident
).+, $
($field
:tt
)*) => (
1938 target
: module_path
!(),
1940 $
crate::Level
::ERROR
,
1941 { $($k).+, $($field)*}
1944 (parent
: $parent
:expr
, ?$
($k
:ident
).+, $
($field
:tt
)*) => (
1946 target
: module_path
!(),
1948 $
crate::Level
::ERROR
,
1949 { ?$($k).+, $($field)*}
1952 (parent
: $parent
:expr
, %$
($k
:ident
).+, $
($field
:tt
)*) => (
1954 target
: module_path
!(),
1956 $
crate::Level
::ERROR
,
1957 { %$($k).+, $($field)*}
1960 (parent
: $parent
:expr
, $
($arg
:tt
)+) => (
1962 target
: module_path
!(),
1964 $
crate::Level
::ERROR
,
1969 (target
: $target
:expr
, { $($field:tt)* }
, $
($arg
:tt
)* ) => (
1970 $
crate::event
!(target
: $target
, $
crate::Level
::ERROR
, { $($field)* }
, $
($arg
)*)
1972 (target
: $target
:expr
, $
($k
:ident
).+ $
($field
:tt
)* ) => (
1973 $
crate::event
!(target
: $target
, $
crate::Level
::ERROR
, { $($k).+ $($field)* }
)
1975 (target
: $target
:expr
, ?$
($k
:ident
).+ $
($field
:tt
)* ) => (
1976 $
crate::event
!(target
: $target
, $
crate::Level
::ERROR
, { ?$($k).+ $($field)* }
)
1978 (target
: $target
:expr
, %$
($k
:ident
).+ $
($field
:tt
)* ) => (
1979 $
crate::event
!(target
: $target
, $
crate::Level
::ERROR
, { %$($k).+ $($field)* }
)
1981 (target
: $target
:expr
, $
($arg
:tt
)+ ) => (
1982 $
crate::event
!(target
: $target
, $
crate::Level
::ERROR
, {}
, $
($arg
)+)
1984 ({ $($field:tt)+ }
, $
($arg
:tt
)+ ) => (
1986 target
: module_path
!(),
1987 $
crate::Level
::ERROR
,
1992 ($
($k
:ident
).+ = $
($field
:tt
)*) => (
1994 target
: module_path
!(),
1995 $
crate::Level
::ERROR
,
1996 { $($k).+ = $($field)*}
1999 (?$
($k
:ident
).+ = $
($field
:tt
)*) => (
2001 target
: module_path
!(),
2002 $
crate::Level
::ERROR
,
2003 { ?$($k).+ = $($field)*}
2006 (%$
($k
:ident
).+ = $
($field
:tt
)*) => (
2008 target
: module_path
!(),
2009 $
crate::Level
::ERROR
,
2010 { %$($k).+ = $($field)*}
2013 ($
($k
:ident
).+, $
($field
:tt
)*) => (
2015 target
: module_path
!(),
2016 $
crate::Level
::ERROR
,
2017 { $($k).+, $($field)*}
2020 (?$
($k
:ident
).+, $
($field
:tt
)*) => (
2022 target
: module_path
!(),
2023 $
crate::Level
::ERROR
,
2024 { ?$($k).+, $($field)*}
2027 (%$
($k
:ident
).+, $
($field
:tt
)*) => (
2029 target
: module_path
!(),
2030 $
crate::Level
::ERROR
,
2031 { %$($k).+, $($field)*}
2034 (?$
($k
:ident
).+) => (
2036 target
: module_path
!(),
2037 $
crate::Level
::ERROR
,
2041 (%$
($k
:ident
).+) => (
2043 target
: module_path
!(),
2044 $
crate::Level
::ERROR
,
2048 ($
($k
:ident
).+) => (
2050 target
: module_path
!(),
2051 $
crate::Level
::ERROR
,
2057 target
: module_path
!(),
2058 $
crate::Level
::ERROR
,
2065 /// Constructs a new static callsite for a span or event.
2068 macro_rules
! callsite
{
2069 (name
: $name
:expr
, kind
: $kind
:expr
, fields
: $
($fields
:tt
)*) => {{
2073 target
: module_path
!(),
2074 level
: $
crate::Level
::TRACE
,
2082 fields
: $
($fields
:tt
)*
2087 target
: module_path
!(),
2095 target
: $target
:expr
,
2097 fields
: $
($fields
:tt
)*
2099 use $
crate::__macro_support
::MacroCallsite
;
2100 static META
: $
crate::Metadata
<'
static> = {
2105 fields
: $
crate::fieldset
!( $
($fields
)* ),
2106 callsite
: &CALLSITE
,
2110 static CALLSITE
: MacroCallsite
= MacroCallsite
::new(&META
);
2111 CALLSITE
.register();
2116 /// Constructs a new static callsite for a span or event.
2119 macro_rules
! callsite2
{
2120 (name
: $name
:expr
, kind
: $kind
:expr
, fields
: $
($fields
:tt
)*) => {{
2121 $
crate::callsite2
! {
2124 target
: module_path
!(),
2125 level
: $
crate::Level
::TRACE
,
2133 fields
: $
($fields
:tt
)*
2135 $
crate::callsite2
! {
2138 target
: module_path
!(),
2146 target
: $target
:expr
,
2148 fields
: $
($fields
:tt
)*
2150 use $
crate::__macro_support
::MacroCallsite
;
2151 static META
: $
crate::Metadata
<'
static> = {
2156 fields
: $
crate::fieldset
!( $
($fields
)* ),
2157 callsite
: &CALLSITE
,
2161 MacroCallsite
::new(&META
)
2166 // TODO: determine if this ought to be public API?`
2168 macro_rules
! level_enabled
{
2170 $lvl
<= $
crate::level_filters
::STATIC_MAX_LEVEL
2171 && $lvl
<= $
crate::level_filters
::LevelFilter
::current()
2177 macro_rules
! valueset
{
2179 // === base case ===
2180 (@ { $(,)* $($val:expr),* $(,)* }
, $next
:expr $
(,)*) => {
2184 // === recursive case (more tts) ===
2186 // TODO(#1138): determine a new syntax for uninitialized span fields, and
2188 // (@{ $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = _, $($rest:tt)*) => {
2189 // $crate::valueset!(@ { $($out),*, (&$next, None) }, $next, $($rest)*)
2191 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+ = ?$val
:expr
, $
($rest
:tt
)*) => {
2193 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) }
,
2198 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+ = %$val
:expr
, $
($rest
:tt
)*) => {
2200 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) }
,
2205 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+ = $val
:expr
, $
($rest
:tt
)*) => {
2207 @ { $($out),*, (&$next, Some(&$val as &Value)) }
,
2212 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+, $
($rest
:tt
)*) => {
2214 @ { $($out),*, (&$next, Some(&$($k).+ as &Value)) }
,
2219 (@ { $(,)* $($out:expr),* }
, $next
:expr
, ?$
($k
:ident
).+, $
($rest
:tt
)*) => {
2221 @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &Value)) }
,
2226 (@ { $(,)* $($out:expr),* }
, $next
:expr
, %$
($k
:ident
).+, $
($rest
:tt
)*) => {
2228 @ { $($out),*, (&$next, Some(&display(&$($k).+) as &Value)) }
,
2233 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+ = ?$val
:expr
) => {
2235 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) }
,
2239 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+ = %$val
:expr
) => {
2241 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) }
,
2245 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+ = $val
:expr
) => {
2247 @ { $($out),*, (&$next, Some(&$val as &Value)) }
,
2251 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($k
:ident
).+) => {
2253 @ { $($out),*, (&$next, Some(&$($k).+ as &Value)) }
,
2257 (@ { $(,)* $($out:expr),* }
, $next
:expr
, ?$
($k
:ident
).+) => {
2259 @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &Value)) }
,
2263 (@ { $(,)* $($out:expr),* }
, $next
:expr
, %$
($k
:ident
).+) => {
2265 @ { $($out),*, (&$next, Some(&display(&$($k).+) as &Value)) }
,
2270 // Handle literal names
2271 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $k
:literal
= ?$val
:expr
, $
($rest
:tt
)*) => {
2273 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) }
,
2278 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $k
:literal
= %$val
:expr
, $
($rest
:tt
)*) => {
2280 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) }
,
2285 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $k
:literal
= $val
:expr
, $
($rest
:tt
)*) => {
2287 @ { $($out),*, (&$next, Some(&$val as &Value)) }
,
2292 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $k
:literal
= ?$val
:expr
) => {
2294 @ { $($out),*, (&$next, Some(&debug(&$val) as &Value)) }
,
2298 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $k
:literal
= %$val
:expr
) => {
2300 @ { $($out),*, (&$next, Some(&display(&$val) as &Value)) }
,
2304 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $k
:literal
= $val
:expr
) => {
2306 @ { $($out),*, (&$next, Some(&$val as &Value)) }
,
2311 // Remainder is unparseable, but exists --- must be format args!
2312 (@ { $(,)* $($out:expr),* }
, $next
:expr
, $
($rest
:tt
)+) => {
2313 $
crate::valueset
!(@ { (&$next, Some(&format_args!($($rest)+) as &Value)), $($out),* }
, $next
, )
2317 ($fields
:expr
, $
($kvs
:tt
)+) => {
2319 #[allow(unused_imports)]
2320 use $
crate::field
::{debug, display, Value}
;
2321 let mut iter
= $fields
.iter();
2322 $fields
.value_set($
crate::valueset
!(
2324 iter
.next().expect("FieldSet corrupted (this is a bug)"),
2329 ($fields
:expr
,) => {
2331 $fields
.value_set(&[])
2338 macro_rules
! fieldset
{
2340 (@ { $(,)* $($out:expr),* $(,)* } $
(,)*) => {
2344 // == recursive cases (more tts) ==
2345 (@ { $(,)* $($out:expr),* } $
($k
:ident
).+ = ?$val
:expr
, $
($rest
:tt
)*) => {
2346 $
crate::fieldset
!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $
($rest
)*)
2348 (@ { $(,)* $($out:expr),* } $
($k
:ident
).+ = %$val
:expr
, $
($rest
:tt
)*) => {
2349 $
crate::fieldset
!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $
($rest
)*)
2351 (@ { $(,)* $($out:expr),* } $
($k
:ident
).+ = $val
:expr
, $
($rest
:tt
)*) => {
2352 $
crate::fieldset
!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $
($rest
)*)
2354 // TODO(#1138): determine a new syntax for uninitialized span fields, and
2356 // (@ { $($out:expr),* } $($k:ident).+ = _, $($rest:tt)*) => {
2357 // $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*)
2359 (@ { $(,)* $($out:expr),* } ?$
($k
:ident
).+, $
($rest
:tt
)*) => {
2360 $
crate::fieldset
!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $
($rest
)*)
2362 (@ { $(,)* $($out:expr),* }
%$
($k
:ident
).+, $
($rest
:tt
)*) => {
2363 $
crate::fieldset
!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $
($rest
)*)
2365 (@ { $(,)* $($out:expr),* } $
($k
:ident
).+, $
($rest
:tt
)*) => {
2366 $
crate::fieldset
!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $
($rest
)*)
2369 // Handle literal names
2370 (@ { $(,)* $($out:expr),* } $k
:literal
= ?$val
:expr
, $
($rest
:tt
)*) => {
2371 $
crate::fieldset
!(@ { $($out),*, $k } $
($rest
)*)
2373 (@ { $(,)* $($out:expr),* } $k
:literal
= %$val
:expr
, $
($rest
:tt
)*) => {
2374 $
crate::fieldset
!(@ { $($out),*, $k } $
($rest
)*)
2376 (@ { $(,)* $($out:expr),* } $k
:literal
= $val
:expr
, $
($rest
:tt
)*) => {
2377 $
crate::fieldset
!(@ { $($out),*, $k } $
($rest
)*)
2380 // Remainder is unparseable, but exists --- must be format args!
2381 (@ { $(,)* $($out:expr),* } $
($rest
:tt
)+) => {
2382 $
crate::fieldset
!(@ { "message", $($out),*, }
)
2387 $
crate::fieldset
!(@ { } $
($args
)*,)
2392 #[cfg(feature = "log")]
2395 macro_rules
! level_to_log
{
2398 $
crate::Level
::ERROR
=> $
crate::log
::Level
::Error
,
2399 $
crate::Level
::WARN
=> $
crate::log
::Level
::Warn
,
2400 $
crate::Level
::INFO
=> $
crate::log
::Level
::Info
,
2401 $
crate::Level
::DEBUG
=> $
crate::log
::Level
::Debug
,
2402 _
=> $
crate::log
::Level
::Trace
,
2409 macro_rules
! __tracing_stringify
{
2415 #[cfg(not(feature = "log"))]
2418 macro_rules
! __tracing_log
{
2419 ($level
:expr
, $callsite
:expr
, $value_set
:expr
) => {}
;
2422 #[cfg(feature = "log")]
2425 macro_rules
! __tracing_log
{
2426 ($level
:expr
, $callsite
:expr
, $value_set
:expr
) => {
2427 $
crate::if_log_enabled
! { $level
, {
2429 let level
= $
crate::level_to_log
!($level
);
2430 if level
<= log
::max_level() {
2431 let log_meta
= log
::Metadata
::builder()
2433 .target(CALLSITE
.metadata().target())
2435 let logger
= log
::logger();
2436 if logger
.enabled(&log_meta
) {
2437 $callsite
.log(logger
, log_meta
, $value_set
)
2444 #[cfg(not(feature = "log"))]
2447 macro_rules
! if_log_enabled
{
2448 ($lvl
:expr
, $e
:expr
;) => {
2449 $
crate::if_log_enabled
! { $lvl, $e }
2451 ($lvl
:expr
, $if_log
:block
) => {
2452 $
crate::if_log_enabled
! { $lvl, $if_log else {}
}
2454 ($lvl
:expr
, $if_log
:block
else $else_block
:block
) => {
2459 #[cfg(all(feature = "log", not(feature = "log-always")))]
2462 macro_rules
! if_log_enabled
{
2463 ($lvl
:expr
, $e
:expr
;) => {
2464 $
crate::if_log_enabled
! { $lvl, $e }
2466 ($lvl
:expr
, $if_log
:block
) => {
2467 $
crate::if_log_enabled
! { $lvl, $if_log else {}
}
2469 ($lvl
:expr
, $if_log
:block
else $else_block
:block
) => {
2470 if $
crate::level_to_log
!($lvl
) <= $
crate::log
::STATIC_MAX_LEVEL
{
2471 if !$
crate::dispatcher
::has_been_set() {
2482 #[cfg(all(feature = "log", feature = "log-always"))]
2485 macro_rules
! if_log_enabled
{
2486 ($lvl
:expr
, $e
:expr
;) => {
2487 $
crate::if_log_enabled
! { $lvl, $e }
2489 ($lvl
:expr
, $if_log
:block
) => {
2490 $
crate::if_log_enabled
! { $lvl, $if_log else {}
}
2492 ($lvl
:expr
, $if_log
:block
else $else_block
:block
) => {
2493 if $
crate::level_to_log
!($lvl
) <= $
crate::log
::STATIC_MAX_LEVEL
{
2494 #[allow(unused_braces)]