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::callsite::DefaultCallsite = $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!(Level::INFO, the_answer = data.0); 568 /// # } 569 /// ``` 570 /// 571 // /// Note that *unlike `span!`*, `event!` requires a value for all fields. As 572 // /// events are recorded immediately when the macro is invoked, there is no 573 // /// opportunity for fields to be recorded later. A trailing comma on the final 574 // /// field is valid. 575 // /// 576 // /// For example, the following does not compile: 577 // /// ```rust,compile_fail 578 // /// # use tracing::{Level, event}; 579 // /// # fn main() { 580 // /// event!(Level::INFO, foo = 5, bad_field, bar = "hello") 581 // /// #} 582 // /// ``` 583 #[macro_export] 584 macro_rules! event { 585 (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* } )=> ({ 586 use $crate::__macro_support::Callsite as _; 587 static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! { 588 name: $crate::__macro_support::concat!( 589 "event ", 590 file!(), 591 ":", 592 line!() 593 ), 594 kind: $crate::metadata::Kind::EVENT, 595 target: $target, 596 level: $lvl, 597 fields: $($fields)* 598 }; 599 600 let enabled = $crate::level_enabled!($lvl) && { 601 let interest = CALLSITE.interest(); 602 !interest.is_never() && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest) 603 }; 604 if enabled { 605 (|value_set: $crate::field::ValueSet| { 606 $crate::__tracing_log!( 607 $lvl, 608 CALLSITE, 609 &value_set 610 ); 611 let meta = CALLSITE.metadata(); 612 // event with explicit parent 613 $crate::Event::child_of( 614 $parent, 615 meta, 616 &value_set 617 ); 618 })($crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)); 619 } else { 620 $crate::__tracing_log!( 621 $lvl, 622 CALLSITE, 623 &$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*) 624 ); 625 } 626 }); 627 628 (target: $target:expr, parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ( 629 $crate::event!( 630 target: $target, 631 parent: $parent, 632 $lvl, 633 { message = format_args!($($arg)+), $($fields)* } 634 ) 635 ); 636 (target: $target:expr, parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => ( 637 $crate::event!(target: $target, parent: $parent, $lvl, { $($k).+ = $($fields)* }) 638 ); 639 (target: $target:expr, parent: $parent:expr, $lvl:expr, $($arg:tt)+) => ( 640 $crate::event!(target: $target, parent: $parent, $lvl, { $($arg)+ }) 641 ); 642 (target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({ 643 use $crate::__macro_support::Callsite as _; 644 static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! { 645 name: $crate::__macro_support::concat!( 646 "event ", 647 file!(), 648 ":", 649 line!() 650 ), 651 kind: $crate::metadata::Kind::EVENT, 652 target: $target, 653 level: $lvl, 654 fields: $($fields)* 655 }; 656 let enabled = $crate::level_enabled!($lvl) && { 657 let interest = CALLSITE.interest(); 658 !interest.is_never() && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest) 659 }; 660 if enabled { 661 (|value_set: $crate::field::ValueSet| { 662 let meta = CALLSITE.metadata(); 663 // event with contextual parent 664 $crate::Event::dispatch( 665 meta, 666 &value_set 667 ); 668 $crate::__tracing_log!( 669 $lvl, 670 CALLSITE, 671 &value_set 672 ); 673 })($crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)); 674 } else { 675 $crate::__tracing_log!( 676 $lvl, 677 CALLSITE, 678 &$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*) 679 ); 680 } 681 }); 682 (target: $target:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ( 683 $crate::event!( 684 target: $target, 685 $lvl, 686 { message = format_args!($($arg)+), $($fields)* } 687 ) 688 ); 689 (target: $target:expr, $lvl:expr, $($k:ident).+ = $($fields:tt)* ) => ( 690 $crate::event!(target: $target, $lvl, { $($k).+ = $($fields)* }) 691 ); 692 (target: $target:expr, $lvl:expr, $($arg:tt)+ ) => ( 693 $crate::event!(target: $target, $lvl, { $($arg)+ }) 694 ); 695 (parent: $parent:expr, $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ( 696 $crate::event!( 697 target: module_path!(), 698 parent: $parent, 699 $lvl, 700 { message = format_args!($($arg)+), $($fields)* } 701 ) 702 ); 703 (parent: $parent:expr, $lvl:expr, $($k:ident).+ = $($field:tt)*) => ( 704 $crate::event!( 705 target: module_path!(), 706 parent: $parent, 707 $lvl, 708 { $($k).+ = $($field)*} 709 ) 710 ); 711 (parent: $parent:expr, $lvl:expr, ?$($k:ident).+ = $($field:tt)*) => ( 712 $crate::event!( 713 target: module_path!(), 714 parent: $parent, 715 $lvl, 716 { ?$($k).+ = $($field)*} 717 ) 718 ); 719 (parent: $parent:expr, $lvl:expr, %$($k:ident).+ = $($field:tt)*) => ( 720 $crate::event!( 721 target: module_path!(), 722 parent: $parent, 723 $lvl, 724 { %$($k).+ = $($field)*} 725 ) 726 ); 727 (parent: $parent:expr, $lvl:expr, $($k:ident).+, $($field:tt)*) => ( 728 $crate::event!( 729 target: module_path!(), 730 parent: $parent, 731 $lvl, 732 { $($k).+, $($field)*} 733 ) 734 ); 735 (parent: $parent:expr, $lvl:expr, %$($k:ident).+, $($field:tt)*) => ( 736 $crate::event!( 737 target: module_path!(), 738 parent: $parent, 739 $lvl, 740 { %$($k).+, $($field)*} 741 ) 742 ); 743 (parent: $parent:expr, $lvl:expr, ?$($k:ident).+, $($field:tt)*) => ( 744 $crate::event!( 745 target: module_path!(), 746 parent: $parent, 747 $lvl, 748 { ?$($k).+, $($field)*} 749 ) 750 ); 751 (parent: $parent:expr, $lvl:expr, $($arg:tt)+ ) => ( 752 $crate::event!(target: module_path!(), parent: $parent, $lvl, { $($arg)+ }) 753 ); 754 ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ( 755 $crate::event!( 756 target: module_path!(), 757 $lvl, 758 { message = format_args!($($arg)+), $($fields)* } 759 ) 760 ); 761 ( $lvl:expr, { $($fields:tt)* }, $($arg:tt)+ ) => ( 762 $crate::event!( 763 target: module_path!(), 764 $lvl, 765 { message = format_args!($($arg)+), $($fields)* } 766 ) 767 ); 768 ($lvl:expr, $($k:ident).+ = $($field:tt)*) => ( 769 $crate::event!( 770 target: module_path!(), 771 $lvl, 772 { $($k).+ = $($field)*} 773 ) 774 ); 775 ($lvl:expr, $($k:ident).+, $($field:tt)*) => ( 776 $crate::event!( 777 target: module_path!(), 778 $lvl, 779 { $($k).+, $($field)*} 780 ) 781 ); 782 ($lvl:expr, ?$($k:ident).+, $($field:tt)*) => ( 783 $crate::event!( 784 target: module_path!(), 785 $lvl, 786 { ?$($k).+, $($field)*} 787 ) 788 ); 789 ($lvl:expr, %$($k:ident).+, $($field:tt)*) => ( 790 $crate::event!( 791 target: module_path!(), 792 $lvl, 793 { %$($k).+, $($field)*} 794 ) 795 ); 796 ($lvl:expr, ?$($k:ident).+) => ( 797 $crate::event!($lvl, ?$($k).+,) 798 ); 799 ($lvl:expr, %$($k:ident).+) => ( 800 $crate::event!($lvl, %$($k).+,) 801 ); 802 ($lvl:expr, $($k:ident).+) => ( 803 $crate::event!($lvl, $($k).+,) 804 ); 805 ( $lvl:expr, $($arg:tt)+ ) => ( 806 $crate::event!(target: module_path!(), $lvl, { $($arg)+ }) 807 ); 808 } 809 810 /// Tests whether an event with the specified level and target would be enabled. 811 /// 812 /// This is similar to [`enabled!`], but queries the current subscriber specifically for 813 /// an event, whereas [`enabled!`] queries for an event _or_ span. 814 /// 815 /// See the documentation for [`enabled!]` for more details on using this macro. 816 /// See also [`span_enabled!`]. 817 /// 818 /// # Examples 819 /// 820 /// ```rust 821 /// # use tracing::{event_enabled, Level}; 822 /// if event_enabled!(target: "my_crate", Level::DEBUG) { 823 /// // some expensive work... 824 /// } 825 /// // simpler 826 /// if event_enabled!(Level::DEBUG) { 827 /// // some expensive work... 828 /// } 829 /// // with fields 830 /// if event_enabled!(Level::DEBUG, foo_field) { 831 /// // some expensive work... 832 /// } 833 /// ``` 834 /// 835 /// [`enabled!`]: crate::enabled 836 /// [`span_enabled!`]: crate::span_enabled 837 #[macro_export] 838 macro_rules! event_enabled { 839 ($($rest:tt)*)=> ( 840 $crate::enabled!(kind: $crate::metadata::Kind::EVENT, $($rest)*) 841 ) 842 } 843 844 /// Tests whether a span with the specified level and target would be enabled. 845 /// 846 /// This is similar to [`enabled!`], but queries the current subscriber specifically for 847 /// an event, whereas [`enabled!`] queries for an event _or_ span. 848 /// 849 /// See the documentation for [`enabled!]` for more details on using this macro. 850 /// See also [`span_enabled!`]. 851 /// 852 /// # Examples 853 /// 854 /// ```rust 855 /// # use tracing::{span_enabled, Level}; 856 /// if span_enabled!(target: "my_crate", Level::DEBUG) { 857 /// // some expensive work... 858 /// } 859 /// // simpler 860 /// if span_enabled!(Level::DEBUG) { 861 /// // some expensive work... 862 /// } 863 /// // with fields 864 /// if span_enabled!(Level::DEBUG, foo_field) { 865 /// // some expensive work... 866 /// } 867 /// ``` 868 /// 869 /// [`enabled!`]: crate::enabled 870 /// [`span_enabled!`]: crate::span_enabled 871 #[macro_export] 872 macro_rules! span_enabled { 873 ($($rest:tt)*)=> ( 874 $crate::enabled!(kind: $crate::metadata::Kind::SPAN, $($rest)*) 875 ) 876 } 877 878 /// Checks whether a span or event is [enabled] based on the provided [metadata]. 879 /// 880 /// [enabled]: crate::Subscriber::enabled 881 /// [metadata]: crate::Metadata 882 /// 883 /// This macro is a specialized tool: it is intended to be used prior 884 /// to an expensive computation required *just* for that event, but 885 /// *cannot* be done as part of an argument to that event, such as 886 /// when multiple events are emitted (e.g., iterating over a collection 887 /// and emitting an event for each item). 888 /// 889 /// # Usage 890 /// 891 /// [Subscribers] can make filtering decisions based all the data included in a 892 /// span or event's [`Metadata`]. This means that it is possible for `enabled!` 893 /// to return a _false positive_ (indicating that something would be enabled 894 /// when it actually would not be) or a _false negative_ (indicating that 895 /// something would be disabled when it would actually be enabled). 896 /// 897 /// [Subscribers]: crate::subscriber::Subscriber 898 /// [`Metadata`]: crate::metadata::Metadata 899 /// 900 /// This occurs when a subscriber is using a _more specific_ filter than the 901 /// metadata provided to the `enabled!` macro. Some situations that can result 902 /// in false positives or false negatives include: 903 /// 904 /// - If a subscriber is using a filter which may enable a span or event based 905 /// on field names, but `enabled!` is invoked without listing field names, 906 /// `enabled!` may return a false negative if a specific field name would 907 /// cause the subscriber to enable something that would otherwise be disabled. 908 /// - If a subscriber is using a filter which enables or disables specific events by 909 /// file path and line number, a particular event may be enabled/disabled 910 /// even if an `enabled!` invocation with the same level, target, and fields 911 /// indicated otherwise. 912 /// - The subscriber can choose to enable _only_ spans or _only_ events, which `enabled` 913 /// will not reflect. 914 /// 915 /// `enabled!()` requires a [level](crate::Level) argument, an optional `target:` 916 /// argument, and an optional set of field names. If the fields are not provided, 917 /// they are considered to be unknown. `enabled!` attempts to match the 918 /// syntax of `event!()` as closely as possible, which can be seen in the 919 /// examples below. 920 /// 921 /// # Examples 922 /// 923 /// If the current subscriber is interested in recording `DEBUG`-level spans and 924 /// events in the current file and module path, this will evaluate to true: 925 /// ```rust 926 /// use tracing::{enabled, Level}; 927 /// 928 /// if enabled!(Level::DEBUG) { 929 /// // some expensive work... 930 /// } 931 /// ``` 932 /// 933 /// If the current subscriber is interested in recording spans and events 934 /// in the current file and module path, with the target "my_crate", and at the 935 /// level `DEBUG`, this will evaluate to true: 936 /// ```rust 937 /// # use tracing::{enabled, Level}; 938 /// if enabled!(target: "my_crate", Level::DEBUG) { 939 /// // some expensive work... 940 /// } 941 /// ``` 942 /// 943 /// If the current subscriber is interested in recording spans and events 944 /// in the current file and module path, with the target "my_crate", at 945 /// the level `DEBUG`, and with a field named "hello", this will evaluate 946 /// to true: 947 /// 948 /// ```rust 949 /// # use tracing::{enabled, Level}; 950 /// if enabled!(target: "my_crate", Level::DEBUG, hello) { 951 /// // some expensive work... 952 /// } 953 /// ``` 954 /// 955 /// # Alternatives 956 /// 957 /// `enabled!` queries subscribers with [`Metadata`] where 958 /// [`is_event`] and [`is_span`] both return `false`. Alternatively, 959 /// use [`event_enabled!`] or [`span_enabled!`] to ensure one of these 960 /// returns true. 961 /// 962 /// 963 /// [`Metadata`]: crate::Metadata 964 /// [`is_event`]: crate::Metadata::is_event 965 /// [`is_span`]: crate::Metadata::is_span 966 /// [`enabled!`]: crate::enabled 967 /// [`span_enabled!`]: crate::span_enabled 968 #[macro_export] 969 macro_rules! enabled { 970 (kind: $kind:expr, target: $target:expr, $lvl:expr, { $($fields:tt)* } )=> ({ 971 if $crate::level_enabled!($lvl) { 972 use $crate::__macro_support::Callsite as _; 973 static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! { 974 name: $crate::__macro_support::concat!( 975 "enabled ", 976 file!(), 977 ":", 978 line!() 979 ), 980 kind: $kind.hint(), 981 target: $target, 982 level: $lvl, 983 fields: $($fields)* 984 }; 985 let interest = CALLSITE.interest(); 986 if !interest.is_never() && $crate::__macro_support::__is_enabled(CALLSITE.metadata(), interest) { 987 let meta = CALLSITE.metadata(); 988 $crate::dispatcher::get_default(|current| current.enabled(meta)) 989 } else { 990 false 991 } 992 } else { 993 false 994 } 995 }); 996 // Just target and level 997 (kind: $kind:expr, target: $target:expr, $lvl:expr ) => ( 998 $crate::enabled!(kind: $kind, target: $target, $lvl, { }) 999 ); 1000 (target: $target:expr, $lvl:expr ) => ( 1001 $crate::enabled!(kind: $crate::metadata::Kind::HINT, target: $target, $lvl, { }) 1002 ); 1003 1004 // These four cases handle fields with no values 1005 (kind: $kind:expr, target: $target:expr, $lvl:expr, $($field:tt)*) => ( 1006 $crate::enabled!( 1007 kind: $kind, 1008 target: $target, 1009 $lvl, 1010 { $($field)*} 1011 ) 1012 ); 1013 (target: $target:expr, $lvl:expr, $($field:tt)*) => ( 1014 $crate::enabled!( 1015 kind: $crate::metadata::Kind::HINT, 1016 target: $target, 1017 $lvl, 1018 { $($field)*} 1019 ) 1020 ); 1021 1022 // Level and field case 1023 (kind: $kind:expr, $lvl:expr, $($field:tt)*) => ( 1024 $crate::enabled!( 1025 kind: $kind, 1026 target: module_path!(), 1027 $lvl, 1028 { $($field)*} 1029 ) 1030 ); 1031 1032 // Simplest `enabled!` case 1033 (kind: $kind:expr, $lvl:expr) => ( 1034 $crate::enabled!(kind: $kind, target: module_path!(), $lvl, { }) 1035 ); 1036 ($lvl:expr) => ( 1037 $crate::enabled!(kind: $crate::metadata::Kind::HINT, target: module_path!(), $lvl, { }) 1038 ); 1039 1040 // Fallthrough from above 1041 ($lvl:expr, $($field:tt)*) => ( 1042 $crate::enabled!( 1043 kind: $crate::metadata::Kind::HINT, 1044 target: module_path!(), 1045 $lvl, 1046 { $($field)*} 1047 ) 1048 ); 1049 } 1050 1051 /// Constructs an event at the trace level. 1052 /// 1053 /// This functions similarly to the [`event!`] macro. See [the top-level 1054 /// documentation][lib] for details on the syntax accepted by 1055 /// this macro. 1056 /// 1057 /// [`event!`]: crate::event! 1058 /// [lib]: crate#using-the-macros 1059 /// 1060 /// # Examples 1061 /// 1062 /// ```rust 1063 /// use tracing::trace; 1064 /// # #[derive(Debug, Copy, Clone)] struct Position { x: f32, y: f32 } 1065 /// # impl Position { 1066 /// # const ORIGIN: Self = Self { x: 0.0, y: 0.0 }; 1067 /// # fn dist(&self, other: Position) -> f32 { 1068 /// # let x = (other.x - self.x).exp2(); let y = (self.y - other.y).exp2(); 1069 /// # (x + y).sqrt() 1070 /// # } 1071 /// # } 1072 /// # fn main() { 1073 /// let pos = Position { x: 3.234, y: -1.223 }; 1074 /// let origin_dist = pos.dist(Position::ORIGIN); 1075 /// 1076 /// trace!(position = ?pos, ?origin_dist); 1077 /// trace!( 1078 /// target: "app_events", 1079 /// position = ?pos, 1080 /// "x is {} and y is {}", 1081 /// if pos.x >= 0.0 { "positive" } else { "negative" }, 1082 /// if pos.y >= 0.0 { "positive" } else { "negative" } 1083 /// ); 1084 /// # } 1085 /// ``` 1086 #[macro_export] 1087 macro_rules! trace { 1088 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1089 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($field)* }, $($arg)*) 1090 ); 1091 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => ( 1092 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ }) 1093 ); 1094 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => ( 1095 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ }) 1096 ); 1097 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => ( 1098 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, { $($k).+ $($field)+ }) 1099 ); 1100 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( 1101 $crate::event!(target: $target, parent: $parent, $crate::Level::TRACE, {}, $($arg)+) 1102 ); 1103 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => ( 1104 $crate::event!( 1105 target: module_path!(), 1106 parent: $parent, 1107 $crate::Level::TRACE, 1108 { $($field)+ }, 1109 $($arg)+ 1110 ) 1111 ); 1112 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => ( 1113 $crate::event!( 1114 target: module_path!(), 1115 parent: $parent, 1116 $crate::Level::TRACE, 1117 { $($k).+ = $($field)*} 1118 ) 1119 ); 1120 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => ( 1121 $crate::event!( 1122 target: module_path!(), 1123 parent: $parent, 1124 $crate::Level::TRACE, 1125 { ?$($k).+ = $($field)*} 1126 ) 1127 ); 1128 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => ( 1129 $crate::event!( 1130 target: module_path!(), 1131 parent: $parent, 1132 $crate::Level::TRACE, 1133 { %$($k).+ = $($field)*} 1134 ) 1135 ); 1136 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( 1137 $crate::event!( 1138 target: module_path!(), 1139 parent: $parent, 1140 $crate::Level::TRACE, 1141 { $($k).+, $($field)*} 1142 ) 1143 ); 1144 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => ( 1145 $crate::event!( 1146 target: module_path!(), 1147 parent: $parent, 1148 $crate::Level::TRACE, 1149 { ?$($k).+, $($field)*} 1150 ) 1151 ); 1152 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => ( 1153 $crate::event!( 1154 target: module_path!(), 1155 parent: $parent, 1156 $crate::Level::TRACE, 1157 { %$($k).+, $($field)*} 1158 ) 1159 ); 1160 (parent: $parent:expr, $($arg:tt)+) => ( 1161 $crate::event!( 1162 target: module_path!(), 1163 parent: $parent, 1164 $crate::Level::TRACE, 1165 {}, 1166 $($arg)+ 1167 ) 1168 ); 1169 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1170 $crate::event!(target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*) 1171 ); 1172 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( 1173 $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)* }) 1174 ); 1175 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( 1176 $crate::event!(target: $target, $crate::Level::TRACE, { ?$($k).+ $($field)* }) 1177 ); 1178 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( 1179 $crate::event!(target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* }) 1180 ); 1181 (target: $target:expr, $($arg:tt)+ ) => ( 1182 $crate::event!(target: $target, $crate::Level::TRACE, {}, $($arg)+) 1183 ); 1184 ({ $($field:tt)+ }, $($arg:tt)+ ) => ( 1185 $crate::event!( 1186 target: module_path!(), 1187 $crate::Level::TRACE, 1188 { $($field)+ }, 1189 $($arg)+ 1190 ) 1191 ); 1192 ($($k:ident).+ = $($field:tt)*) => ( 1193 $crate::event!( 1194 target: module_path!(), 1195 $crate::Level::TRACE, 1196 { $($k).+ = $($field)*} 1197 ) 1198 ); 1199 ($($k:ident).+, $($field:tt)*) => ( 1200 $crate::event!( 1201 target: module_path!(), 1202 $crate::Level::TRACE, 1203 { $($k).+, $($field)*} 1204 ) 1205 ); 1206 (?$($k:ident).+, $($field:tt)*) => ( 1207 $crate::event!( 1208 target: module_path!(), 1209 $crate::Level::TRACE, 1210 { ?$($k).+, $($field)*} 1211 ) 1212 ); 1213 (%$($k:ident).+, $($field:tt)*) => ( 1214 $crate::event!( 1215 target: module_path!(), 1216 $crate::Level::TRACE, 1217 { %$($k).+, $($field)*} 1218 ) 1219 ); 1220 (?$($k:ident).+) => ( 1221 $crate::event!( 1222 target: module_path!(), 1223 $crate::Level::TRACE, 1224 { ?$($k).+ } 1225 ) 1226 ); 1227 (%$($k:ident).+) => ( 1228 $crate::event!( 1229 target: module_path!(), 1230 $crate::Level::TRACE, 1231 { %$($k).+ } 1232 ) 1233 ); 1234 ($($k:ident).+) => ( 1235 $crate::event!( 1236 target: module_path!(), 1237 $crate::Level::TRACE, 1238 { $($k).+ } 1239 ) 1240 ); 1241 ($($arg:tt)+) => ( 1242 $crate::event!( 1243 target: module_path!(), 1244 $crate::Level::TRACE, 1245 {}, 1246 $($arg)+ 1247 ) 1248 ); 1249 } 1250 1251 /// Constructs an event at the debug level. 1252 /// 1253 /// This functions similarly to the [`event!`] macro. See [the top-level 1254 /// documentation][lib] for details on the syntax accepted by 1255 /// this macro. 1256 /// 1257 /// [`event!`]: crate::event! 1258 /// [lib]: crate#using-the-macros 1259 /// 1260 /// # Examples 1261 /// 1262 /// ```rust 1263 /// use tracing::debug; 1264 /// # fn main() { 1265 /// # #[derive(Debug)] struct Position { x: f32, y: f32 } 1266 /// 1267 /// let pos = Position { x: 3.234, y: -1.223 }; 1268 /// 1269 /// debug!(?pos.x, ?pos.y); 1270 /// debug!(target: "app_events", position = ?pos, "New position"); 1271 /// # } 1272 /// ``` 1273 #[macro_export] 1274 macro_rules! debug { 1275 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1276 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($field)* }, $($arg)*) 1277 ); 1278 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => ( 1279 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ }) 1280 ); 1281 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => ( 1282 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ }) 1283 ); 1284 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => ( 1285 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, { $($k).+ $($field)+ }) 1286 ); 1287 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( 1288 $crate::event!(target: $target, parent: $parent, $crate::Level::DEBUG, {}, $($arg)+) 1289 ); 1290 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => ( 1291 $crate::event!( 1292 target: module_path!(), 1293 parent: $parent, 1294 $crate::Level::DEBUG, 1295 { $($field)+ }, 1296 $($arg)+ 1297 ) 1298 ); 1299 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => ( 1300 $crate::event!( 1301 target: module_path!(), 1302 parent: $parent, 1303 $crate::Level::DEBUG, 1304 { $($k).+ = $($field)*} 1305 ) 1306 ); 1307 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => ( 1308 $crate::event!( 1309 target: module_path!(), 1310 parent: $parent, 1311 $crate::Level::DEBUG, 1312 { ?$($k).+ = $($field)*} 1313 ) 1314 ); 1315 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => ( 1316 $crate::event!( 1317 target: module_path!(), 1318 parent: $parent, 1319 $crate::Level::DEBUG, 1320 { %$($k).+ = $($field)*} 1321 ) 1322 ); 1323 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( 1324 $crate::event!( 1325 target: module_path!(), 1326 parent: $parent, 1327 $crate::Level::DEBUG, 1328 { $($k).+, $($field)*} 1329 ) 1330 ); 1331 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => ( 1332 $crate::event!( 1333 target: module_path!(), 1334 parent: $parent, 1335 $crate::Level::DEBUG, 1336 { ?$($k).+, $($field)*} 1337 ) 1338 ); 1339 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => ( 1340 $crate::event!( 1341 target: module_path!(), 1342 parent: $parent, 1343 $crate::Level::DEBUG, 1344 { %$($k).+, $($field)*} 1345 ) 1346 ); 1347 (parent: $parent:expr, $($arg:tt)+) => ( 1348 $crate::event!( 1349 target: module_path!(), 1350 parent: $parent, 1351 $crate::Level::DEBUG, 1352 {}, 1353 $($arg)+ 1354 ) 1355 ); 1356 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1357 $crate::event!(target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*) 1358 ); 1359 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( 1360 $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)* }) 1361 ); 1362 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( 1363 $crate::event!(target: $target, $crate::Level::DEBUG, { ?$($k).+ $($field)* }) 1364 ); 1365 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( 1366 $crate::event!(target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* }) 1367 ); 1368 (target: $target:expr, $($arg:tt)+ ) => ( 1369 $crate::event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+) 1370 ); 1371 ({ $($field:tt)+ }, $($arg:tt)+ ) => ( 1372 $crate::event!( 1373 target: module_path!(), 1374 $crate::Level::DEBUG, 1375 { $($field)+ }, 1376 $($arg)+ 1377 ) 1378 ); 1379 ($($k:ident).+ = $($field:tt)*) => ( 1380 $crate::event!( 1381 target: module_path!(), 1382 $crate::Level::DEBUG, 1383 { $($k).+ = $($field)*} 1384 ) 1385 ); 1386 (?$($k:ident).+ = $($field:tt)*) => ( 1387 $crate::event!( 1388 target: module_path!(), 1389 $crate::Level::DEBUG, 1390 { ?$($k).+ = $($field)*} 1391 ) 1392 ); 1393 (%$($k:ident).+ = $($field:tt)*) => ( 1394 $crate::event!( 1395 target: module_path!(), 1396 $crate::Level::DEBUG, 1397 { %$($k).+ = $($field)*} 1398 ) 1399 ); 1400 ($($k:ident).+, $($field:tt)*) => ( 1401 $crate::event!( 1402 target: module_path!(), 1403 $crate::Level::DEBUG, 1404 { $($k).+, $($field)*} 1405 ) 1406 ); 1407 (?$($k:ident).+, $($field:tt)*) => ( 1408 $crate::event!( 1409 target: module_path!(), 1410 $crate::Level::DEBUG, 1411 { ?$($k).+, $($field)*} 1412 ) 1413 ); 1414 (%$($k:ident).+, $($field:tt)*) => ( 1415 $crate::event!( 1416 target: module_path!(), 1417 $crate::Level::DEBUG, 1418 { %$($k).+, $($field)*} 1419 ) 1420 ); 1421 (?$($k:ident).+) => ( 1422 $crate::event!( 1423 target: module_path!(), 1424 $crate::Level::DEBUG, 1425 { ?$($k).+ } 1426 ) 1427 ); 1428 (%$($k:ident).+) => ( 1429 $crate::event!( 1430 target: module_path!(), 1431 $crate::Level::DEBUG, 1432 { %$($k).+ } 1433 ) 1434 ); 1435 ($($k:ident).+) => ( 1436 $crate::event!( 1437 target: module_path!(), 1438 $crate::Level::DEBUG, 1439 { $($k).+ } 1440 ) 1441 ); 1442 ($($arg:tt)+) => ( 1443 $crate::event!( 1444 target: module_path!(), 1445 $crate::Level::DEBUG, 1446 {}, 1447 $($arg)+ 1448 ) 1449 ); 1450 } 1451 1452 /// Constructs an event at the info level. 1453 /// 1454 /// This functions similarly to the [`event!`] macro. See [the top-level 1455 /// documentation][lib] for details on the syntax accepted by 1456 /// this macro. 1457 /// 1458 /// [`event!`]: crate::event! 1459 /// [lib]: crate#using-the-macros 1460 /// 1461 /// # Examples 1462 /// 1463 /// ```rust 1464 /// use tracing::info; 1465 /// # // this is so the test will still work in no-std mode 1466 /// # #[derive(Debug)] 1467 /// # pub struct Ipv4Addr; 1468 /// # impl Ipv4Addr { fn new(o1: u8, o2: u8, o3: u8, o4: u8) -> Self { Self } } 1469 /// # fn main() { 1470 /// # struct Connection { port: u32, speed: f32 } 1471 /// use tracing::field; 1472 /// 1473 /// let addr = Ipv4Addr::new(127, 0, 0, 1); 1474 /// let conn = Connection { port: 40, speed: 3.20 }; 1475 /// 1476 /// info!(conn.port, "connected to {:?}", addr); 1477 /// info!( 1478 /// target: "connection_events", 1479 /// ip = ?addr, 1480 /// conn.port, 1481 /// ?conn.speed, 1482 /// ); 1483 /// # } 1484 /// ``` 1485 #[macro_export] 1486 macro_rules! info { 1487 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1488 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($field)* }, $($arg)*) 1489 ); 1490 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => ( 1491 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ }) 1492 ); 1493 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => ( 1494 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ }) 1495 ); 1496 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => ( 1497 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, { $($k).+ $($field)+ }) 1498 ); 1499 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( 1500 $crate::event!(target: $target, parent: $parent, $crate::Level::INFO, {}, $($arg)+) 1501 ); 1502 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => ( 1503 $crate::event!( 1504 target: module_path!(), 1505 parent: $parent, 1506 $crate::Level::INFO, 1507 { $($field)+ }, 1508 $($arg)+ 1509 ) 1510 ); 1511 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => ( 1512 $crate::event!( 1513 target: module_path!(), 1514 parent: $parent, 1515 $crate::Level::INFO, 1516 { $($k).+ = $($field)*} 1517 ) 1518 ); 1519 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => ( 1520 $crate::event!( 1521 target: module_path!(), 1522 parent: $parent, 1523 $crate::Level::INFO, 1524 { ?$($k).+ = $($field)*} 1525 ) 1526 ); 1527 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => ( 1528 $crate::event!( 1529 target: module_path!(), 1530 parent: $parent, 1531 $crate::Level::INFO, 1532 { %$($k).+ = $($field)*} 1533 ) 1534 ); 1535 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( 1536 $crate::event!( 1537 target: module_path!(), 1538 parent: $parent, 1539 $crate::Level::INFO, 1540 { $($k).+, $($field)*} 1541 ) 1542 ); 1543 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => ( 1544 $crate::event!( 1545 target: module_path!(), 1546 parent: $parent, 1547 $crate::Level::INFO, 1548 { ?$($k).+, $($field)*} 1549 ) 1550 ); 1551 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => ( 1552 $crate::event!( 1553 target: module_path!(), 1554 parent: $parent, 1555 $crate::Level::INFO, 1556 { %$($k).+, $($field)*} 1557 ) 1558 ); 1559 (parent: $parent:expr, $($arg:tt)+) => ( 1560 $crate::event!( 1561 target: module_path!(), 1562 parent: $parent, 1563 $crate::Level::INFO, 1564 {}, 1565 $($arg)+ 1566 ) 1567 ); 1568 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1569 $crate::event!(target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*) 1570 ); 1571 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( 1572 $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* }) 1573 ); 1574 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( 1575 $crate::event!(target: $target, $crate::Level::INFO, { ?$($k).+ $($field)* }) 1576 ); 1577 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( 1578 $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* }) 1579 ); 1580 (target: $target:expr, $($arg:tt)+ ) => ( 1581 $crate::event!(target: $target, $crate::Level::INFO, {}, $($arg)+) 1582 ); 1583 ({ $($field:tt)+ }, $($arg:tt)+ ) => ( 1584 $crate::event!( 1585 target: module_path!(), 1586 $crate::Level::INFO, 1587 { $($field)+ }, 1588 $($arg)+ 1589 ) 1590 ); 1591 ($($k:ident).+ = $($field:tt)*) => ( 1592 $crate::event!( 1593 target: module_path!(), 1594 $crate::Level::INFO, 1595 { $($k).+ = $($field)*} 1596 ) 1597 ); 1598 (?$($k:ident).+ = $($field:tt)*) => ( 1599 $crate::event!( 1600 target: module_path!(), 1601 $crate::Level::INFO, 1602 { ?$($k).+ = $($field)*} 1603 ) 1604 ); 1605 (%$($k:ident).+ = $($field:tt)*) => ( 1606 $crate::event!( 1607 target: module_path!(), 1608 $crate::Level::INFO, 1609 { %$($k).+ = $($field)*} 1610 ) 1611 ); 1612 ($($k:ident).+, $($field:tt)*) => ( 1613 $crate::event!( 1614 target: module_path!(), 1615 $crate::Level::INFO, 1616 { $($k).+, $($field)*} 1617 ) 1618 ); 1619 (?$($k:ident).+, $($field:tt)*) => ( 1620 $crate::event!( 1621 target: module_path!(), 1622 $crate::Level::INFO, 1623 { ?$($k).+, $($field)*} 1624 ) 1625 ); 1626 (%$($k:ident).+, $($field:tt)*) => ( 1627 $crate::event!( 1628 target: module_path!(), 1629 $crate::Level::INFO, 1630 { %$($k).+, $($field)*} 1631 ) 1632 ); 1633 (?$($k:ident).+) => ( 1634 $crate::event!( 1635 target: module_path!(), 1636 $crate::Level::INFO, 1637 { ?$($k).+ } 1638 ) 1639 ); 1640 (%$($k:ident).+) => ( 1641 $crate::event!( 1642 target: module_path!(), 1643 $crate::Level::INFO, 1644 { %$($k).+ } 1645 ) 1646 ); 1647 ($($k:ident).+) => ( 1648 $crate::event!( 1649 target: module_path!(), 1650 $crate::Level::INFO, 1651 { $($k).+ } 1652 ) 1653 ); 1654 ($($arg:tt)+) => ( 1655 $crate::event!( 1656 target: module_path!(), 1657 $crate::Level::INFO, 1658 {}, 1659 $($arg)+ 1660 ) 1661 ); 1662 } 1663 1664 /// Constructs an event at the warn level. 1665 /// 1666 /// This functions similarly to the [`event!`] macro. See [the top-level 1667 /// documentation][lib] for details on the syntax accepted by 1668 /// this macro. 1669 /// 1670 /// [`event!`]: crate::event! 1671 /// [lib]: crate#using-the-macros 1672 /// 1673 /// # Examples 1674 /// 1675 /// ```rust 1676 /// use tracing::warn; 1677 /// # fn main() { 1678 /// 1679 /// let warn_description = "Invalid Input"; 1680 /// let input = &[0x27, 0x45]; 1681 /// 1682 /// warn!(?input, warning = warn_description); 1683 /// warn!( 1684 /// target: "input_events", 1685 /// warning = warn_description, 1686 /// "Received warning for input: {:?}", input, 1687 /// ); 1688 /// # } 1689 /// ``` 1690 #[macro_export] 1691 macro_rules! warn { 1692 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1693 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($field)* }, $($arg)*) 1694 ); 1695 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => ( 1696 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ }) 1697 ); 1698 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => ( 1699 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ }) 1700 ); 1701 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => ( 1702 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, { $($k).+ $($field)+ }) 1703 ); 1704 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( 1705 $crate::event!(target: $target, parent: $parent, $crate::Level::WARN, {}, $($arg)+) 1706 ); 1707 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => ( 1708 $crate::event!( 1709 target: module_path!(), 1710 parent: $parent, 1711 $crate::Level::WARN, 1712 { $($field)+ }, 1713 $($arg)+ 1714 ) 1715 ); 1716 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => ( 1717 $crate::event!( 1718 target: module_path!(), 1719 parent: $parent, 1720 $crate::Level::WARN, 1721 { $($k).+ = $($field)*} 1722 ) 1723 ); 1724 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => ( 1725 $crate::event!( 1726 target: module_path!(), 1727 parent: $parent, 1728 $crate::Level::WARN, 1729 { ?$($k).+ = $($field)*} 1730 ) 1731 ); 1732 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => ( 1733 $crate::event!( 1734 target: module_path!(), 1735 parent: $parent, 1736 $crate::Level::WARN, 1737 { %$($k).+ = $($field)*} 1738 ) 1739 ); 1740 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( 1741 $crate::event!( 1742 target: module_path!(), 1743 parent: $parent, 1744 $crate::Level::WARN, 1745 { $($k).+, $($field)*} 1746 ) 1747 ); 1748 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => ( 1749 $crate::event!( 1750 target: module_path!(), 1751 parent: $parent, 1752 $crate::Level::WARN, 1753 { ?$($k).+, $($field)*} 1754 ) 1755 ); 1756 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => ( 1757 $crate::event!( 1758 target: module_path!(), 1759 parent: $parent, 1760 $crate::Level::WARN, 1761 { %$($k).+, $($field)*} 1762 ) 1763 ); 1764 (parent: $parent:expr, $($arg:tt)+) => ( 1765 $crate::event!( 1766 target: module_path!(), 1767 parent: $parent, 1768 $crate::Level::WARN, 1769 {}, 1770 $($arg)+ 1771 ) 1772 ); 1773 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1774 $crate::event!(target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*) 1775 ); 1776 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( 1777 $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)* }) 1778 ); 1779 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( 1780 $crate::event!(target: $target, $crate::Level::WARN, { ?$($k).+ $($field)* }) 1781 ); 1782 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( 1783 $crate::event!(target: $target, $crate::Level::WARN, { %$($k).+ $($field)* }) 1784 ); 1785 (target: $target:expr, $($arg:tt)+ ) => ( 1786 $crate::event!(target: $target, $crate::Level::WARN, {}, $($arg)+) 1787 ); 1788 ({ $($field:tt)+ }, $($arg:tt)+ ) => ( 1789 $crate::event!( 1790 target: module_path!(), 1791 $crate::Level::WARN, 1792 { $($field)+ }, 1793 $($arg)+ 1794 ) 1795 ); 1796 ($($k:ident).+ = $($field:tt)*) => ( 1797 $crate::event!( 1798 target: module_path!(), 1799 $crate::Level::WARN, 1800 { $($k).+ = $($field)*} 1801 ) 1802 ); 1803 (?$($k:ident).+ = $($field:tt)*) => ( 1804 $crate::event!( 1805 target: module_path!(), 1806 $crate::Level::WARN, 1807 { ?$($k).+ = $($field)*} 1808 ) 1809 ); 1810 (%$($k:ident).+ = $($field:tt)*) => ( 1811 $crate::event!( 1812 target: module_path!(), 1813 $crate::Level::WARN, 1814 { %$($k).+ = $($field)*} 1815 ) 1816 ); 1817 ($($k:ident).+, $($field:tt)*) => ( 1818 $crate::event!( 1819 target: module_path!(), 1820 $crate::Level::WARN, 1821 { $($k).+, $($field)*} 1822 ) 1823 ); 1824 (?$($k:ident).+, $($field:tt)*) => ( 1825 $crate::event!( 1826 target: module_path!(), 1827 $crate::Level::WARN, 1828 { ?$($k).+, $($field)*} 1829 ) 1830 ); 1831 (%$($k:ident).+, $($field:tt)*) => ( 1832 $crate::event!( 1833 target: module_path!(), 1834 $crate::Level::WARN, 1835 { %$($k).+, $($field)*} 1836 ) 1837 ); 1838 (?$($k:ident).+) => ( 1839 $crate::event!( 1840 target: module_path!(), 1841 $crate::Level::WARN, 1842 { ?$($k).+ } 1843 ) 1844 ); 1845 (%$($k:ident).+) => ( 1846 $crate::event!( 1847 target: module_path!(), 1848 $crate::Level::WARN, 1849 { %$($k).+ } 1850 ) 1851 ); 1852 ($($k:ident).+) => ( 1853 $crate::event!( 1854 target: module_path!(), 1855 $crate::Level::WARN, 1856 { $($k).+ } 1857 ) 1858 ); 1859 ($($arg:tt)+) => ( 1860 $crate::event!( 1861 target: module_path!(), 1862 $crate::Level::WARN, 1863 {}, 1864 $($arg)+ 1865 ) 1866 ); 1867 } 1868 1869 /// Constructs an event at the error level. 1870 /// 1871 /// This functions similarly to the [`event!`] macro. See [the top-level 1872 /// documentation][lib] for details on the syntax accepted by 1873 /// this macro. 1874 /// 1875 /// [`event!`]: crate::event! 1876 /// [lib]: crate#using-the-macros 1877 /// 1878 /// # Examples 1879 /// 1880 /// ```rust 1881 /// use tracing::error; 1882 /// # fn main() { 1883 /// 1884 /// let (err_info, port) = ("No connection", 22); 1885 /// 1886 /// error!(port, error = %err_info); 1887 /// error!(target: "app_events", "App Error: {}", err_info); 1888 /// error!({ info = err_info }, "error on port: {}", port); 1889 /// # } 1890 /// ``` 1891 #[macro_export] 1892 macro_rules! error { 1893 (target: $target:expr, parent: $parent:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1894 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($field)* }, $($arg)*) 1895 ); 1896 (target: $target:expr, parent: $parent:expr, $($k:ident).+ $($field:tt)+ ) => ( 1897 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ }) 1898 ); 1899 (target: $target:expr, parent: $parent:expr, ?$($k:ident).+ $($field:tt)+ ) => ( 1900 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ }) 1901 ); 1902 (target: $target:expr, parent: $parent:expr, %$($k:ident).+ $($field:tt)+ ) => ( 1903 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, { $($k).+ $($field)+ }) 1904 ); 1905 (target: $target:expr, parent: $parent:expr, $($arg:tt)+ ) => ( 1906 $crate::event!(target: $target, parent: $parent, $crate::Level::ERROR, {}, $($arg)+) 1907 ); 1908 (parent: $parent:expr, { $($field:tt)+ }, $($arg:tt)+ ) => ( 1909 $crate::event!( 1910 target: module_path!(), 1911 parent: $parent, 1912 $crate::Level::ERROR, 1913 { $($field)+ }, 1914 $($arg)+ 1915 ) 1916 ); 1917 (parent: $parent:expr, $($k:ident).+ = $($field:tt)*) => ( 1918 $crate::event!( 1919 target: module_path!(), 1920 parent: $parent, 1921 $crate::Level::ERROR, 1922 { $($k).+ = $($field)*} 1923 ) 1924 ); 1925 (parent: $parent:expr, ?$($k:ident).+ = $($field:tt)*) => ( 1926 $crate::event!( 1927 target: module_path!(), 1928 parent: $parent, 1929 $crate::Level::ERROR, 1930 { ?$($k).+ = $($field)*} 1931 ) 1932 ); 1933 (parent: $parent:expr, %$($k:ident).+ = $($field:tt)*) => ( 1934 $crate::event!( 1935 target: module_path!(), 1936 parent: $parent, 1937 $crate::Level::ERROR, 1938 { %$($k).+ = $($field)*} 1939 ) 1940 ); 1941 (parent: $parent:expr, $($k:ident).+, $($field:tt)*) => ( 1942 $crate::event!( 1943 target: module_path!(), 1944 parent: $parent, 1945 $crate::Level::ERROR, 1946 { $($k).+, $($field)*} 1947 ) 1948 ); 1949 (parent: $parent:expr, ?$($k:ident).+, $($field:tt)*) => ( 1950 $crate::event!( 1951 target: module_path!(), 1952 parent: $parent, 1953 $crate::Level::ERROR, 1954 { ?$($k).+, $($field)*} 1955 ) 1956 ); 1957 (parent: $parent:expr, %$($k:ident).+, $($field:tt)*) => ( 1958 $crate::event!( 1959 target: module_path!(), 1960 parent: $parent, 1961 $crate::Level::ERROR, 1962 { %$($k).+, $($field)*} 1963 ) 1964 ); 1965 (parent: $parent:expr, $($arg:tt)+) => ( 1966 $crate::event!( 1967 target: module_path!(), 1968 parent: $parent, 1969 $crate::Level::ERROR, 1970 {}, 1971 $($arg)+ 1972 ) 1973 ); 1974 (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( 1975 $crate::event!(target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*) 1976 ); 1977 (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( 1978 $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)* }) 1979 ); 1980 (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( 1981 $crate::event!(target: $target, $crate::Level::ERROR, { ?$($k).+ $($field)* }) 1982 ); 1983 (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( 1984 $crate::event!(target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* }) 1985 ); 1986 (target: $target:expr, $($arg:tt)+ ) => ( 1987 $crate::event!(target: $target, $crate::Level::ERROR, {}, $($arg)+) 1988 ); 1989 ({ $($field:tt)+ }, $($arg:tt)+ ) => ( 1990 $crate::event!( 1991 target: module_path!(), 1992 $crate::Level::ERROR, 1993 { $($field)+ }, 1994 $($arg)+ 1995 ) 1996 ); 1997 ($($k:ident).+ = $($field:tt)*) => ( 1998 $crate::event!( 1999 target: module_path!(), 2000 $crate::Level::ERROR, 2001 { $($k).+ = $($field)*} 2002 ) 2003 ); 2004 (?$($k:ident).+ = $($field:tt)*) => ( 2005 $crate::event!( 2006 target: module_path!(), 2007 $crate::Level::ERROR, 2008 { ?$($k).+ = $($field)*} 2009 ) 2010 ); 2011 (%$($k:ident).+ = $($field:tt)*) => ( 2012 $crate::event!( 2013 target: module_path!(), 2014 $crate::Level::ERROR, 2015 { %$($k).+ = $($field)*} 2016 ) 2017 ); 2018 ($($k:ident).+, $($field:tt)*) => ( 2019 $crate::event!( 2020 target: module_path!(), 2021 $crate::Level::ERROR, 2022 { $($k).+, $($field)*} 2023 ) 2024 ); 2025 (?$($k:ident).+, $($field:tt)*) => ( 2026 $crate::event!( 2027 target: module_path!(), 2028 $crate::Level::ERROR, 2029 { ?$($k).+, $($field)*} 2030 ) 2031 ); 2032 (%$($k:ident).+, $($field:tt)*) => ( 2033 $crate::event!( 2034 target: module_path!(), 2035 $crate::Level::ERROR, 2036 { %$($k).+, $($field)*} 2037 ) 2038 ); 2039 (?$($k:ident).+) => ( 2040 $crate::event!( 2041 target: module_path!(), 2042 $crate::Level::ERROR, 2043 { ?$($k).+ } 2044 ) 2045 ); 2046 (%$($k:ident).+) => ( 2047 $crate::event!( 2048 target: module_path!(), 2049 $crate::Level::ERROR, 2050 { %$($k).+ } 2051 ) 2052 ); 2053 ($($k:ident).+) => ( 2054 $crate::event!( 2055 target: module_path!(), 2056 $crate::Level::ERROR, 2057 { $($k).+ } 2058 ) 2059 ); 2060 ($($arg:tt)+) => ( 2061 $crate::event!( 2062 target: module_path!(), 2063 $crate::Level::ERROR, 2064 {}, 2065 $($arg)+ 2066 ) 2067 ); 2068 } 2069 2070 /// Constructs a new static callsite for a span or event. 2071 #[doc(hidden)] 2072 #[macro_export] 2073 macro_rules! callsite { 2074 (name: $name:expr, kind: $kind:expr, fields: $($fields:tt)*) => {{ 2075 $crate::callsite! { 2076 name: $name, 2077 kind: $kind, 2078 target: module_path!(), 2079 level: $crate::Level::TRACE, 2080 fields: $($fields)* 2081 } 2082 }}; 2083 ( 2084 name: $name:expr, 2085 kind: $kind:expr, 2086 level: $lvl:expr, 2087 fields: $($fields:tt)* 2088 ) => {{ 2089 $crate::callsite! { 2090 name: $name, 2091 kind: $kind, 2092 target: module_path!(), 2093 level: $lvl, 2094 fields: $($fields)* 2095 } 2096 }}; 2097 ( 2098 name: $name:expr, 2099 kind: $kind:expr, 2100 target: $target:expr, 2101 level: $lvl:expr, 2102 fields: $($fields:tt)* 2103 ) => {{ 2104 static META: $crate::Metadata<'static> = { 2105 $crate::metadata! { 2106 name: $name, 2107 target: $target, 2108 level: $lvl, 2109 fields: $crate::fieldset!( $($fields)* ), 2110 callsite: &CALLSITE, 2111 kind: $kind, 2112 } 2113 }; 2114 static CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite::DefaultCallsite::new(&META); 2115 CALLSITE.register(); 2116 &CALLSITE 2117 }}; 2118 } 2119 2120 /// Constructs a new static callsite for a span or event. 2121 #[doc(hidden)] 2122 #[macro_export] 2123 macro_rules! callsite2 { 2124 (name: $name:expr, kind: $kind:expr, fields: $($fields:tt)*) => {{ 2125 $crate::callsite2! { 2126 name: $name, 2127 kind: $kind, 2128 target: module_path!(), 2129 level: $crate::Level::TRACE, 2130 fields: $($fields)* 2131 } 2132 }}; 2133 ( 2134 name: $name:expr, 2135 kind: $kind:expr, 2136 level: $lvl:expr, 2137 fields: $($fields:tt)* 2138 ) => {{ 2139 $crate::callsite2! { 2140 name: $name, 2141 kind: $kind, 2142 target: module_path!(), 2143 level: $lvl, 2144 fields: $($fields)* 2145 } 2146 }}; 2147 ( 2148 name: $name:expr, 2149 kind: $kind:expr, 2150 target: $target:expr, 2151 level: $lvl:expr, 2152 fields: $($fields:tt)* 2153 ) => {{ 2154 static META: $crate::Metadata<'static> = { 2155 $crate::metadata! { 2156 name: $name, 2157 target: $target, 2158 level: $lvl, 2159 fields: $crate::fieldset!( $($fields)* ), 2160 callsite: &CALLSITE, 2161 kind: $kind, 2162 } 2163 }; 2164 $crate::callsite::DefaultCallsite::new(&META) 2165 }}; 2166 } 2167 2168 #[macro_export] 2169 // TODO: determine if this ought to be public API?` 2170 #[doc(hidden)] 2171 macro_rules! level_enabled { 2172 ($lvl:expr) => { 2173 $lvl <= $crate::level_filters::STATIC_MAX_LEVEL 2174 && $lvl <= $crate::level_filters::LevelFilter::current() 2175 }; 2176 } 2177 2178 #[doc(hidden)] 2179 #[macro_export] 2180 macro_rules! valueset { 2181 2182 // === base case === 2183 (@ { $(,)* $($val:expr),* $(,)* }, $next:expr $(,)*) => { 2184 &[ $($val),* ] 2185 }; 2186 2187 // === recursive case (more tts) === 2188 2189 // TODO(#1138): determine a new syntax for uninitialized span fields, and 2190 // re-enable this. 2191 // (@{ $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = _, $($rest:tt)*) => { 2192 // $crate::valueset!(@ { $($out),*, (&$next, None) }, $next, $($rest)*) 2193 // }; 2194 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { 2195 $crate::valueset!( 2196 @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) }, 2197 $next, 2198 $($rest)* 2199 ) 2200 }; 2201 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { 2202 $crate::valueset!( 2203 @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) }, 2204 $next, 2205 $($rest)* 2206 ) 2207 }; 2208 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { 2209 $crate::valueset!( 2210 @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, 2211 $next, 2212 $($rest)* 2213 ) 2214 }; 2215 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+, $($rest:tt)*) => { 2216 $crate::valueset!( 2217 @ { $($out),*, (&$next, Some(&$($k).+ as &dyn Value)) }, 2218 $next, 2219 $($rest)* 2220 ) 2221 }; 2222 (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+, $($rest:tt)*) => { 2223 $crate::valueset!( 2224 @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &dyn Value)) }, 2225 $next, 2226 $($rest)* 2227 ) 2228 }; 2229 (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+, $($rest:tt)*) => { 2230 $crate::valueset!( 2231 @ { $($out),*, (&$next, Some(&display(&$($k).+) as &dyn Value)) }, 2232 $next, 2233 $($rest)* 2234 ) 2235 }; 2236 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => { 2237 $crate::valueset!( 2238 @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) }, 2239 $next, 2240 ) 2241 }; 2242 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr) => { 2243 $crate::valueset!( 2244 @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) }, 2245 $next, 2246 ) 2247 }; 2248 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => { 2249 $crate::valueset!( 2250 @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, 2251 $next, 2252 ) 2253 }; 2254 (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+) => { 2255 $crate::valueset!( 2256 @ { $($out),*, (&$next, Some(&$($k).+ as &dyn Value)) }, 2257 $next, 2258 ) 2259 }; 2260 (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+) => { 2261 $crate::valueset!( 2262 @ { $($out),*, (&$next, Some(&debug(&$($k).+) as &dyn Value)) }, 2263 $next, 2264 ) 2265 }; 2266 (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+) => { 2267 $crate::valueset!( 2268 @ { $($out),*, (&$next, Some(&display(&$($k).+) as &dyn Value)) }, 2269 $next, 2270 ) 2271 }; 2272 2273 // Handle literal names 2274 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => { 2275 $crate::valueset!( 2276 @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) }, 2277 $next, 2278 $($rest)* 2279 ) 2280 }; 2281 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => { 2282 $crate::valueset!( 2283 @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) }, 2284 $next, 2285 $($rest)* 2286 ) 2287 }; 2288 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => { 2289 $crate::valueset!( 2290 @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, 2291 $next, 2292 $($rest)* 2293 ) 2294 }; 2295 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => { 2296 $crate::valueset!( 2297 @ { $($out),*, (&$next, Some(&debug(&$val) as &dyn Value)) }, 2298 $next, 2299 ) 2300 }; 2301 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => { 2302 $crate::valueset!( 2303 @ { $($out),*, (&$next, Some(&display(&$val) as &dyn Value)) }, 2304 $next, 2305 ) 2306 }; 2307 (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => { 2308 $crate::valueset!( 2309 @ { $($out),*, (&$next, Some(&$val as &dyn Value)) }, 2310 $next, 2311 ) 2312 }; 2313 2314 // Remainder is unparseable, but exists --- must be format args! 2315 (@ { $(,)* $($out:expr),* }, $next:expr, $($rest:tt)+) => { 2316 $crate::valueset!(@ { (&$next, Some(&format_args!($($rest)+) as &dyn Value)), $($out),* }, $next, ) 2317 }; 2318 2319 // === entry === 2320 ($fields:expr, $($kvs:tt)+) => { 2321 { 2322 #[allow(unused_imports)] 2323 use $crate::field::{debug, display, Value}; 2324 let mut iter = $fields.iter(); 2325 $fields.value_set($crate::valueset!( 2326 @ { }, 2327 iter.next().expect("FieldSet corrupted (this is a bug)"), 2328 $($kvs)+ 2329 )) 2330 } 2331 }; 2332 ($fields:expr,) => { 2333 { 2334 $fields.value_set(&[]) 2335 } 2336 }; 2337 } 2338 2339 #[doc(hidden)] 2340 #[macro_export] 2341 macro_rules! fieldset { 2342 // == base case == 2343 (@ { $(,)* $($out:expr),* $(,)* } $(,)*) => { 2344 &[ $($out),* ] 2345 }; 2346 2347 // == recursive cases (more tts) == 2348 (@ { $(,)* $($out:expr),* } $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { 2349 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) 2350 }; 2351 (@ { $(,)* $($out:expr),* } $($k:ident).+ = %$val:expr, $($rest:tt)*) => { 2352 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) 2353 }; 2354 (@ { $(,)* $($out:expr),* } $($k:ident).+ = $val:expr, $($rest:tt)*) => { 2355 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) 2356 }; 2357 // TODO(#1138): determine a new syntax for uninitialized span fields, and 2358 // re-enable this. 2359 // (@ { $($out:expr),* } $($k:ident).+ = _, $($rest:tt)*) => { 2360 // $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) 2361 // }; 2362 (@ { $(,)* $($out:expr),* } ?$($k:ident).+, $($rest:tt)*) => { 2363 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) 2364 }; 2365 (@ { $(,)* $($out:expr),* } %$($k:ident).+, $($rest:tt)*) => { 2366 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) 2367 }; 2368 (@ { $(,)* $($out:expr),* } $($k:ident).+, $($rest:tt)*) => { 2369 $crate::fieldset!(@ { $($out),*, $crate::__tracing_stringify!($($k).+) } $($rest)*) 2370 }; 2371 2372 // Handle literal names 2373 (@ { $(,)* $($out:expr),* } $k:literal = ?$val:expr, $($rest:tt)*) => { 2374 $crate::fieldset!(@ { $($out),*, $k } $($rest)*) 2375 }; 2376 (@ { $(,)* $($out:expr),* } $k:literal = %$val:expr, $($rest:tt)*) => { 2377 $crate::fieldset!(@ { $($out),*, $k } $($rest)*) 2378 }; 2379 (@ { $(,)* $($out:expr),* } $k:literal = $val:expr, $($rest:tt)*) => { 2380 $crate::fieldset!(@ { $($out),*, $k } $($rest)*) 2381 }; 2382 2383 // Remainder is unparseable, but exists --- must be format args! 2384 (@ { $(,)* $($out:expr),* } $($rest:tt)+) => { 2385 $crate::fieldset!(@ { "message", $($out),*, }) 2386 }; 2387 2388 // == entry == 2389 ($($args:tt)*) => { 2390 $crate::fieldset!(@ { } $($args)*,) 2391 }; 2392 2393 } 2394 2395 #[cfg(feature = "log")] 2396 #[doc(hidden)] 2397 #[macro_export] 2398 macro_rules! level_to_log { 2399 ($level:expr) => { 2400 match $level { 2401 $crate::Level::ERROR => $crate::log::Level::Error, 2402 $crate::Level::WARN => $crate::log::Level::Warn, 2403 $crate::Level::INFO => $crate::log::Level::Info, 2404 $crate::Level::DEBUG => $crate::log::Level::Debug, 2405 _ => $crate::log::Level::Trace, 2406 } 2407 }; 2408 } 2409 2410 #[doc(hidden)] 2411 #[macro_export] 2412 macro_rules! __tracing_stringify { 2413 ($s:expr) => { 2414 stringify!($s) 2415 }; 2416 } 2417 2418 #[cfg(not(feature = "log"))] 2419 #[doc(hidden)] 2420 #[macro_export] 2421 macro_rules! __tracing_log { 2422 ($level:expr, $callsite:expr, $value_set:expr) => {}; 2423 } 2424 2425 #[cfg(feature = "log")] 2426 #[doc(hidden)] 2427 #[macro_export] 2428 macro_rules! __tracing_log { 2429 ($level:expr, $callsite:expr, $value_set:expr) => { 2430 $crate::if_log_enabled! { $level, { 2431 use $crate::log; 2432 let level = $crate::level_to_log!($level); 2433 if level <= log::max_level() { 2434 let meta = $callsite.metadata(); 2435 let log_meta = log::Metadata::builder() 2436 .level(level) 2437 .target(meta.target()) 2438 .build(); 2439 let logger = log::logger(); 2440 if logger.enabled(&log_meta) { 2441 $crate::__macro_support::__tracing_log(meta, logger, log_meta, $value_set) 2442 } 2443 } 2444 }} 2445 }; 2446 } 2447 2448 #[cfg(not(feature = "log"))] 2449 #[doc(hidden)] 2450 #[macro_export] 2451 macro_rules! if_log_enabled { 2452 ($lvl:expr, $e:expr;) => { 2453 $crate::if_log_enabled! { $lvl, $e } 2454 }; 2455 ($lvl:expr, $if_log:block) => { 2456 $crate::if_log_enabled! { $lvl, $if_log else {} } 2457 }; 2458 ($lvl:expr, $if_log:block else $else_block:block) => { 2459 $else_block 2460 }; 2461 } 2462 2463 #[cfg(all(feature = "log", not(feature = "log-always")))] 2464 #[doc(hidden)] 2465 #[macro_export] 2466 macro_rules! if_log_enabled { 2467 ($lvl:expr, $e:expr;) => { 2468 $crate::if_log_enabled! { $lvl, $e } 2469 }; 2470 ($lvl:expr, $if_log:block) => { 2471 $crate::if_log_enabled! { $lvl, $if_log else {} } 2472 }; 2473 ($lvl:expr, $if_log:block else $else_block:block) => { 2474 if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL { 2475 if !$crate::dispatcher::has_been_set() { 2476 $if_log 2477 } else { 2478 $else_block 2479 } 2480 } else { 2481 $else_block 2482 } 2483 }; 2484 } 2485 2486 #[cfg(all(feature = "log", feature = "log-always"))] 2487 #[doc(hidden)] 2488 #[macro_export] 2489 macro_rules! if_log_enabled { 2490 ($lvl:expr, $e:expr;) => { 2491 $crate::if_log_enabled! { $lvl, $e } 2492 }; 2493 ($lvl:expr, $if_log:block) => { 2494 $crate::if_log_enabled! { $lvl, $if_log else {} } 2495 }; 2496 ($lvl:expr, $if_log:block else $else_block:block) => { 2497 if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL { 2498 #[allow(unused_braces)] 2499 $if_log 2500 } else { 2501 $else_block 2502 } 2503 }; 2504 } 2505