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