attributes: add support for custom levels for `ret` and `err` (#2330)
Fixes #2330 

The change is fairly straightforward, just adding support for customizable levels for `ret` and `err` in a fully backward-compatible way.

I made `Level` `pub(crate)` to be able to expose `level_to_tokens`, there may be a better way of doing it but it seemed simple enough and anyway it doesn't escape the crate.
## Feature Request

I'd like to be able to specify the log level that `Err` returns are printed at. 

### Crates

`tracing::instrument`

### Motivation

Currently it's hardcoded as `error`, but I have some functions that I'd like to instrument where returning an error is not especially unusual (think of for instance "is the user logged in yet?": any error eventually gets folded into "no, the user is not logged in"). In such cases, I'd like to be able to lower the level to WARN or INFO or even DEBUG.

### Proposal

How about an additional attribute `err_level`?

```rust
#[instrument(level="debug", ret, err, err_level="info")]
fn my_fun() -> Result<int> { Ok(42) }
```

### Alternatives

I could avoid using the instrument macro and annotate every single caller with an event, but that's not really the spirit of the crate :)
Configurable log level for `#[instrument(err)]`
diff --git a/tracing-attributes/src/attr.rs b/tracing-attributes/src/attr.rs
index 2af0400f2b..6bb586ef40 100644
--- a/tracing-attributes/src/attr.rs
+++ b/tracing-attributes/src/attr.rs
@@ -6,6 +6,14 @@ use quote::{quote, quote_spanned, ToTokens};
 use syn::ext::IdentExt as _;
 use syn::parse::{Parse, ParseStream};
 
+/// Arguments to `#[instrument(err(...))]` and `#[instrument(ret(...))]` which describe how the
+/// return value event should be emitted.
+#[derive(Clone, Default, Debug)]
+pub(crate) struct EventArgs {
+    level: Option<Level>,
+    pub(crate) mode: FormatMode,
+}
+
 #[derive(Clone, Default, Debug)]
 pub(crate) struct InstrumentArgs {
     level: Option<Level>,
@@ -15,51 +23,15 @@ pub(crate) struct InstrumentArgs {
     pub(crate) follows_from: Option<Expr>,
     pub(crate) skips: HashSet<Ident>,
     pub(crate) fields: Option<Fields>,
-    pub(crate) err_mode: Option<FormatMode>,
-    pub(crate) ret_mode: Option<FormatMode>,
+    pub(crate) err_args: Option<EventArgs>,
+    pub(crate) ret_args: Option<EventArgs>,
     /// Errors describing any unrecognized parse inputs that we skipped.
     parse_warnings: Vec<syn::Error>,
 }
 
 impl InstrumentArgs {
-    pub(crate) fn level(&self) -> impl ToTokens {
-        fn is_level(lit: &LitInt, expected: u64) -> bool {
-            match lit.base10_parse::<u64>() {
-                Ok(value) => value == expected,
-                Err(_) => false,
-            }
-        }
-
-        match &self.level {
-            Some(Level::Str(ref lit)) if lit.value().eq_ignore_ascii_case("trace") => {
-                quote!(tracing::Level::TRACE)
-            }
-            Some(Level::Str(ref lit)) if lit.value().eq_ignore_ascii_case("debug") => {
-                quote!(tracing::Level::DEBUG)
-            }
-            Some(Level::Str(ref lit)) if lit.value().eq_ignore_ascii_case("info") => {
-                quote!(tracing::Level::INFO)
-            }
-            Some(Level::Str(ref lit)) if lit.value().eq_ignore_ascii_case("warn") => {
-                quote!(tracing::Level::WARN)
-            }
-            Some(Level::Str(ref lit)) if lit.value().eq_ignore_ascii_case("error") => {
-                quote!(tracing::Level::ERROR)
-            }
-            Some(Level::Int(ref lit)) if is_level(lit, 1) => quote!(tracing::Level::TRACE),
-            Some(Level::Int(ref lit)) if is_level(lit, 2) => quote!(tracing::Level::DEBUG),
-            Some(Level::Int(ref lit)) if is_level(lit, 3) => quote!(tracing::Level::INFO),
-            Some(Level::Int(ref lit)) if is_level(lit, 4) => quote!(tracing::Level::WARN),
-            Some(Level::Int(ref lit)) if is_level(lit, 5) => quote!(tracing::Level::ERROR),
-            Some(Level::Path(ref pat)) => quote!(#pat),
-            Some(_) => quote! {
-                compile_error!(
-                    "unknown verbosity level, expected one of \"trace\", \
-                     \"debug\", \"info\", \"warn\", or \"error\", or a number 1-5"
-                )
-            },
-            None => quote!(tracing::Level::INFO),
-        }
+    pub(crate) fn level(&self) -> Level {
+        self.level.clone().unwrap_or(Level::Info)
     }
 
     pub(crate) fn target(&self) -> impl ToTokens {
@@ -154,12 +126,12 @@ impl Parse for InstrumentArgs {
                 args.fields = Some(input.parse()?);
             } else if lookahead.peek(kw::err) {
                 let _ = input.parse::<kw::err>();
-                let mode = FormatMode::parse(input)?;
-                args.err_mode = Some(mode);
+                let err_args = EventArgs::parse(input)?;
+                args.err_args = Some(err_args);
             } else if lookahead.peek(kw::ret) {
                 let _ = input.parse::<kw::ret>()?;
-                let mode = FormatMode::parse(input)?;
-                args.ret_mode = Some(mode);
+                let ret_args = EventArgs::parse(input)?;
+                args.ret_args = Some(ret_args);
             } else if lookahead.peek(Token![,]) {
                 let _ = input.parse::<Token![,]>()?;
             } else {
@@ -177,6 +149,55 @@ impl Parse for InstrumentArgs {
     }
 }
 
+impl EventArgs {
+    pub(crate) fn level(&self, default: Level) -> Level {
+        self.level.clone().unwrap_or(default)
+    }
+}
+
+impl Parse for EventArgs {
+    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
+        if !input.peek(syn::token::Paren) {
+            return Ok(Self::default());
+        }
+        let content;
+        let _ = syn::parenthesized!(content in input);
+        let mut result = Self::default();
+        let mut parse_one_arg =
+            || {
+                let lookahead = content.lookahead1();
+                if lookahead.peek(kw::level) {
+                    if result.level.is_some() {
+                        return Err(content.error("expected only a single `level` argument"));
+                    }
+                    result.level = Some(content.parse()?);
+                } else if result.mode != FormatMode::default() {
+                    return Err(content.error("expected only a single format argument"));
+                } else if let Some(ident) = content.parse::<Option<Ident>>()? {
+                    match ident.to_string().as_str() {
+                        "Debug" => result.mode = FormatMode::Debug,
+                        "Display" => result.mode = FormatMode::Display,
+                        _ => return Err(syn::Error::new(
+                            ident.span(),
+                            "unknown event formatting mode, expected either `Debug` or `Display`",
+                        )),
+                    }
+                }
+                Ok(())
+            };
+        parse_one_arg()?;
+        if !content.is_empty() {
+            if content.lookahead1().peek(Token![,]) {
+                let _ = content.parse::<Token![,]>()?;
+                parse_one_arg()?;
+            } else {
+                return Err(content.error("expected `,` or `)`"));
+            }
+        }
+        Ok(result)
+    }
+}
+
 struct StrArg<T> {
     value: LitStr,
     _p: std::marker::PhantomData<T>,
@@ -247,27 +268,6 @@ impl Default for FormatMode {
     }
 }
 
-impl Parse for FormatMode {
-    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
-        if !input.peek(syn::token::Paren) {
-            return Ok(FormatMode::default());
-        }
-        let content;
-        let _ = syn::parenthesized!(content in input);
-        let maybe_mode: Option<Ident> = content.parse()?;
-        maybe_mode.map_or(Ok(FormatMode::default()), |ident| {
-            match ident.to_string().as_str() {
-                "Debug" => Ok(FormatMode::Debug),
-                "Display" => Ok(FormatMode::Display),
-                _ => Err(syn::Error::new(
-                    ident.span(),
-                    "unknown error mode, must be Debug or Display",
-                )),
-            }
-        })
-    }
-}
-
 #[derive(Clone, Debug)]
 pub(crate) struct Fields(pub(crate) Punctuated<Field, Token![,]>);
 
@@ -363,9 +363,12 @@ impl ToTokens for FieldKind {
 }
 
 #[derive(Clone, Debug)]
-enum Level {
-    Str(LitStr),
-    Int(LitInt),
+pub(crate) enum Level {
+    Trace,
+    Debug,
+    Info,
+    Warn,
+    Error,
     Path(Path),
 }
 
@@ -375,9 +378,37 @@ impl Parse for Level {
         let _ = input.parse::<Token![=]>()?;
         let lookahead = input.lookahead1();
         if lookahead.peek(LitStr) {
-            Ok(Self::Str(input.parse()?))
+            let str: LitStr = input.parse()?;
+            match str.value() {
+                s if s.eq_ignore_ascii_case("trace") => Ok(Level::Trace),
+                s if s.eq_ignore_ascii_case("debug") => Ok(Level::Debug),
+                s if s.eq_ignore_ascii_case("info") => Ok(Level::Info),
+                s if s.eq_ignore_ascii_case("warn") => Ok(Level::Warn),
+                s if s.eq_ignore_ascii_case("error") => Ok(Level::Error),
+                _ => Err(input.error(
+                    "unknown verbosity level, expected one of \"trace\", \
+                     \"debug\", \"info\", \"warn\", or \"error\", or a number 1-5",
+                )),
+            }
         } else if lookahead.peek(LitInt) {
-            Ok(Self::Int(input.parse()?))
+            fn is_level(lit: &LitInt, expected: u64) -> bool {
+                match lit.base10_parse::<u64>() {
+                    Ok(value) => value == expected,
+                    Err(_) => false,
+                }
+            }
+            let int: LitInt = input.parse()?;
+            match &int {
+                i if is_level(i, 1) => Ok(Level::Trace),
+                i if is_level(i, 2) => Ok(Level::Debug),
+                i if is_level(i, 3) => Ok(Level::Info),
+                i if is_level(i, 4) => Ok(Level::Warn),
+                i if is_level(i, 5) => Ok(Level::Error),
+                _ => Err(input.error(
+                    "unknown verbosity level, expected one of \"trace\", \
+                     \"debug\", \"info\", \"warn\", or \"error\", or a number 1-5",
+                )),
+            }
         } else if lookahead.peek(Ident) {
             Ok(Self::Path(input.parse()?))
         } else {
@@ -386,6 +417,19 @@ impl Parse for Level {
     }
 }
 
+impl ToTokens for Level {
+    fn to_tokens(&self, tokens: &mut TokenStream) {
+        match self {
+            Level::Trace => tokens.extend(quote!(tracing::Level::TRACE)),
+            Level::Debug => tokens.extend(quote!(tracing::Level::DEBUG)),
+            Level::Info => tokens.extend(quote!(tracing::Level::INFO)),
+            Level::Warn => tokens.extend(quote!(tracing::Level::WARN)),
+            Level::Error => tokens.extend(quote!(tracing::Level::ERROR)),
+            Level::Path(ref pat) => tokens.extend(quote!(#pat)),
+        }
+    }
+}
+
 mod kw {
     syn::custom_keyword!(fields);
     syn::custom_keyword!(skip);
diff --git a/tracing-attributes/src/expand.rs b/tracing-attributes/src/expand.rs
index 0390a8c44e..d6b7855615 100644
--- a/tracing-attributes/src/expand.rs
+++ b/tracing-attributes/src/expand.rs
@@ -10,7 +10,7 @@ use syn::{
 };
 
 use crate::{
-    attr::{Field, Fields, FormatMode, InstrumentArgs},
+    attr::{Field, Fields, FormatMode, InstrumentArgs, Level},
     MaybeItemFn, MaybeItemFnRef,
 };
 
@@ -116,7 +116,8 @@ fn gen_block<B: ToTokens>(
         .map(|name| quote!(#name))
         .unwrap_or_else(|| quote!(#instrumented_function_name));
 
-    let level = args.level();
+    let args_level = args.level();
+    let level = args_level.clone();
 
     let follows_from = args.follows_from.iter();
     let follows_from = quote! {
@@ -232,21 +233,33 @@ fn gen_block<B: ToTokens>(
 
     let target = args.target();
 
-    let err_event = match args.err_mode {
-        Some(FormatMode::Default) | Some(FormatMode::Display) => {
-            Some(quote!(tracing::error!(target: #target, error = %e)))
+    let err_event = match args.err_args {
+        Some(event_args) => {
+            let level_tokens = event_args.level(Level::Error);
+            match event_args.mode {
+                FormatMode::Default | FormatMode::Display => Some(quote!(
+                    tracing::event!(target: #target, #level_tokens, error = %e)
+                )),
+                FormatMode::Debug => Some(quote!(
+                    tracing::event!(target: #target, #level_tokens, error = ?e)
+                )),
+            }
         }
-        Some(FormatMode::Debug) => Some(quote!(tracing::error!(target: #target, error = ?e))),
         _ => None,
     };
 
-    let ret_event = match args.ret_mode {
-        Some(FormatMode::Display) => Some(quote!(
-            tracing::event!(target: #target, #level, return = %x)
-        )),
-        Some(FormatMode::Default) | Some(FormatMode::Debug) => Some(quote!(
-            tracing::event!(target: #target, #level, return = ?x)
-        )),
+    let ret_event = match args.ret_args {
+        Some(event_args) => {
+            let level_tokens = event_args.level(args_level);
+            match event_args.mode {
+                FormatMode::Display => Some(quote!(
+                    tracing::event!(target: #target, #level_tokens, return = %x)
+                )),
+                FormatMode::Default | FormatMode::Debug => Some(quote!(
+                    tracing::event!(target: #target, #level_tokens, return = ?x)
+                )),
+            }
+        }
         _ => None,
     };
 
diff --git a/tracing-attributes/src/lib.rs b/tracing-attributes/src/lib.rs
index 6165803695..269e32522c 100644
--- a/tracing-attributes/src/lib.rs
+++ b/tracing-attributes/src/lib.rs
@@ -227,10 +227,20 @@ mod expand;
 ///     42
 /// }
 /// ```
-/// The return value event will have the same level as the span generated by `#[instrument]`.
-/// By default, this will be `TRACE`, but if the level is overridden, the event will be at the same
+/// The level of the return value event defaults to the same level as the span generated by `#[instrument]`.
+/// By default, this will be `TRACE`, but if the span level is overridden, the event will be at the same
 /// level.
 ///
+/// It's also possible to override the level for the `ret` event independently:
+///
+/// ```
+/// # use tracing_attributes::instrument;
+/// #[instrument(ret(level = "warn"))]
+/// fn my_function() -> i32 {
+///     42
+/// }
+/// ```
+///
 /// **Note**:  if the function returns a `Result<T, E>`, `ret` will record returned values if and
 /// only if the function returns [`Result::Ok`].
 ///
@@ -257,6 +267,16 @@ mod expand;
 /// }
 /// ```
 ///
+/// Similarly, you can override the level of the `err` event:
+///
+/// ```
+/// # use tracing_attributes::instrument;
+/// #[instrument(err(level = "info"))]
+/// fn my_function(arg: usize) -> Result<(), std::io::Error> {
+///     Ok(())
+/// }
+/// ```
+///
 /// By default, error values will be recorded using their `std::fmt::Display` implementations.
 /// If an error implements `std::fmt::Debug`, it can be recorded using its `Debug` implementation
 /// instead, by writing `err(Debug)`:

diff --git a/tracing-attributes/tests/err.rs b/tracing-attributes/tests/err.rs
index d062a2b7c1..842a6e0e3a 100644
--- a/tracing-attributes/tests/err.rs
+++ b/tracing-attributes/tests/err.rs
@@ -252,3 +252,72 @@ fn test_err_custom_target() {
     });
     handle.assert_finished();
 }
+
+#[instrument(err(level = "info"))]
+fn err_info() -> Result<u8, TryFromIntError> {
+    u8::try_from(1234)
+}
+
+#[test]
+fn test_err_info() {
+    let span = span::mock().named("err_info");
+    let (collector, handle) = collector::mock()
+        .new_span(span.clone())
+        .enter(span.clone())
+        .event(event::mock().at_level(Level::INFO))
+        .exit(span.clone())
+        .drop_span(span)
+        .done()
+        .run_with_handle();
+    with_default(collector, || err_info().ok());
+    handle.assert_finished();
+}
+
+#[instrument(err(Debug, level = "info"))]
+fn err_dbg_info() -> Result<u8, TryFromIntError> {
+    u8::try_from(1234)
+}
+
+#[test]
+fn test_err_dbg_info() {
+    let span = span::mock().named("err_dbg_info");
+    let (collector, handle) = collector::mock()
+        .new_span(span.clone())
+        .enter(span.clone())
+        .event(
+            event::mock().at_level(Level::INFO).with_fields(
+                field::mock("error")
+                    // use the actual error value that will be emitted, so
+                    // that this test doesn't break if the standard library
+                    // changes the `fmt::Debug` output from the error type
+                    // in the future.
+                    .with_value(&tracing::field::debug(u8::try_from(1234).unwrap_err())),
+            ),
+        )
+        .exit(span.clone())
+        .drop_span(span)
+        .done()
+        .run_with_handle();
+    with_default(collector, || err_dbg_info().ok());
+    handle.assert_finished();
+}
+
+#[instrument(level = "warn", err(level = "info"))]
+fn err_warn_info() -> Result<u8, TryFromIntError> {
+    u8::try_from(1234)
+}
+
+#[test]
+fn test_err_warn_info() {
+    let span = span::mock().named("err_warn_info").at_level(Level::WARN);
+    let (collector, handle) = collector::mock()
+        .new_span(span.clone())
+        .enter(span.clone())
+        .event(event::mock().at_level(Level::INFO))
+        .exit(span.clone())
+        .drop_span(span)
+        .done()
+        .run_with_handle();
+    with_default(collector, || err_warn_info().ok());
+    handle.assert_finished();
+}
diff --git a/tracing-attributes/tests/ret.rs b/tracing-attributes/tests/ret.rs
index fce206e0f6..2511e0a520 100644
--- a/tracing-attributes/tests/ret.rs
+++ b/tracing-attributes/tests/ret.rs
@@ -253,3 +253,53 @@ fn test_ret_and_ok() {
     with_default(collector, || ret_and_ok().ok());
     handle.assert_finished();
 }
+
+#[instrument(level = "warn", ret(level = "info"))]
+fn ret_warn_info() -> i32 {
+    42
+}
+
+#[test]
+fn test_warn_info() {
+    let span = span::mock().named("ret_warn_info").at_level(Level::WARN);
+    let (collector, handle) = collector::mock()
+        .new_span(span.clone())
+        .enter(span.clone())
+        .event(
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
+                .at_level(Level::INFO),
+        )
+        .exit(span.clone())
+        .drop_span(span)
+        .done()
+        .run_with_handle();
+
+    with_default(collector, ret_warn_info);
+    handle.assert_finished();
+}
+
+#[instrument(ret(level = "warn", Debug))]
+fn ret_dbg_warn() -> i32 {
+    42
+}
+
+#[test]
+fn test_dbg_warn() {
+    let span = span::mock().named("ret_dbg_warn").at_level(Level::INFO);
+    let (collector, handle) = collector::mock()
+        .new_span(span.clone())
+        .enter(span.clone())
+        .event(
+            event::mock()
+                .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
+                .at_level(Level::WARN),
+        )
+        .exit(span.clone())
+        .drop_span(span)
+        .done()
+        .run_with_handle();
+
+    with_default(collector, ret_dbg_warn);
+    handle.assert_finished();
+}

{"event_outside_of_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "entered": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "handles_to_different_spans_with_the_same_metadata_are_not_equal": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "arced_collector": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "string_message_without_delims": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "no_collector_disables_global": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "non_blocking::test::multi_threaded_writes": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::write_hourly_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "spans_always_go_to_the_subscriber_that_tagged_them": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::write_never_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_make_writer": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_structs": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_macros_dont_infinite_loop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "prefixed_span_macros": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "locals_with_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_max_log_files": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_tuples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_closes_after_event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_refs": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "borrow_val_events": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "move_field_out_of_struct": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "nonzeroi32_event_without_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_nested_tuples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "enabled": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "borrow_val_spans": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "locals_no_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "both_shorthands": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "new_span_with_target_and_log_level": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "record_new_values_for_fields": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "boxed_collector": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_closes_when_exited": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "prefixed_event_macros": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "entered_api": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_is_send": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_shorthand": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_with_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_and_event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_rotations": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span::test::test_record_backwards_compat": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "string_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "contextual_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "callsite_macro_api": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_dbg_info": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "rolling::test::write_minutely_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_path_concatenation": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "contextual_child": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_with_async_trait": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_child": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "cloning_a_span_calls_clone_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "non_blocking::test::backpressure_exerted": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "record_new_value_for_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::write_daily_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_async": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "one_with_everything": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_without_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "enter": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_child_at_levels": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "level_and_target": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_info": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "span_enabled": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dropping_a_span_calls_drop_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "moved_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "float_values": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "impl_trait_return_type": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "display_shorthand": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_tuple_structs": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_mut": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "multiple_max_level_hints": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "out_of_scope_fields": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dotted_field_name": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "field_shorthand_only": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "handles_to_different_spans_are_not_equal": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_block_is_send": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_child_regardless_of_ctx": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "borrowed_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_enabled": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_root_span_is_root_regardless_of_ctx": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_warn_info": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "max_level_hints": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "message_without_delims": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "spans_always_go_to_the_subscriber_that_tagged_them_even_across_threads": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "filter_caching_is_lexically_scoped": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "handles_to_the_same_span_are_equal": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "clone_and_drop_span_always_go_to_the_subscriber_that_tagged_the_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_with_async_trait_and_fields_expressions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "events_dont_leak": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_mut_async": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "new_span_after_event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_dbg": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_root_span_is_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_everything": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_nested": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_only_enters_for_polls": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "manual_impl_future": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_early_return": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_with_non_rust_symbol": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "filters_are_reevaluated_for_different_call_sites": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_with_async_trait_and_fields_expressions_with_generic_parameter": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "filters_are_not_reevaluated_for_the_same_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "wrapping_event_without_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "spans_dont_leak": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "drop_span_when_exiting_dispatchers_context": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_display_default": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "manual_box_pin": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"event_outside_of_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "entered": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "handles_to_different_spans_with_the_same_metadata_are_not_equal": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "arced_collector": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "string_message_without_delims": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "no_collector_disables_global": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "non_blocking::test::multi_threaded_writes": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::write_hourly_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "spans_always_go_to_the_subscriber_that_tagged_them": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::write_never_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_make_writer": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_structs": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_macros_dont_infinite_loop": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "prefixed_span_macros": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "locals_with_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_max_log_files": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_tuples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_closes_after_event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_refs": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "borrow_val_events": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "move_field_out_of_struct": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "nonzeroi32_event_without_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_nested_tuples": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "enabled": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "borrow_val_spans": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "locals_no_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "both_shorthands": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "new_span_with_target_and_log_level": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "record_new_values_for_fields": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "boxed_collector": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_closes_when_exited": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "prefixed_event_macros": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "entered_api": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_is_send": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_shorthand": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_with_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_and_event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_rotations": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span::test::test_record_backwards_compat": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "string_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "contextual_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "callsite_macro_api": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_dbg_info": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "rolling::test::write_minutely_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::test_path_concatenation": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "contextual_child": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_with_async_trait": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_child": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "cloning_a_span_calls_clone_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "non_blocking::test::backpressure_exerted": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "record_new_value_for_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "rolling::test::write_daily_log": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_async": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "one_with_everything": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_without_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "enter": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_child_at_levels": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "level_and_target": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "trace_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_info": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "span_enabled": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dropping_a_span_calls_drop_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "moved_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "float_values": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "impl_trait_return_type": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "display_shorthand": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_tuple_structs": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_mut": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "multiple_max_level_hints": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "warn_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "out_of_scope_fields": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "dotted_field_name": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "field_shorthand_only": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_span_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "handles_to_different_spans_are_not_equal": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_block_is_send": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_child_regardless_of_ctx": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "borrowed_field": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_enabled": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "info_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_root_span_is_root_regardless_of_ctx": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "event_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_warn_info": {"run": "NONE", "test": "NONE", "fix": "PASS"}, "max_level_hints": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "message_without_delims": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_span_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "spans_always_go_to_the_subscriber_that_tagged_them_even_across_threads": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "filter_caching_is_lexically_scoped": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "handles_to_the_same_span_are_equal": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "clone_and_drop_span_always_go_to_the_subscriber_that_tagged_the_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_with_async_trait_and_fields_expressions": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "events_dont_leak": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_mut_async": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "new_span_after_event": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_dbg": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "explicit_root_span_is_root": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "destructure_everything": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_nested": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_only_enters_for_polls": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "manual_impl_future": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_early_return": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "error_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "span_with_non_rust_symbol": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "filters_are_reevaluated_for_different_call_sites": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "async_fn_with_async_trait_and_fields_expressions_with_generic_parameter": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "debug_with_parent": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "filters_are_not_reevaluated_for_the_same_span": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "wrapping_event_without_message": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "spans_dont_leak": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "drop_span_when_exiting_dispatchers_context": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "test_err_display_default": {"run": "PASS", "test": "NONE", "fix": "PASS"}, "manual_box_pin": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"passed_count": 138, "failed_count": 1, "skipped_count": 1, "passed_tests": ["event_outside_of_span", "entered", "handles_to_different_spans_with_the_same_metadata_are_not_equal", "arced_collector", "string_message_without_delims", "no_collector_disables_global", "non_blocking::test::multi_threaded_writes", "rolling::test::write_hourly_log", "span_with_parent", "trace_with_parent", "spans_always_go_to_the_subscriber_that_tagged_them", "rolling::test::write_never_log", "rolling::test::test_make_writer", "destructure_structs", "event_macros_dont_infinite_loop", "prefixed_span_macros", "trace_span", "locals_with_message", "rolling::test::test_max_log_files", "destructure_tuples", "span_closes_after_event", "warn_with_parent", "destructure_refs", "warn_span", "info_root", "info", "borrow_val_events", "span", "move_field_out_of_struct", "nonzeroi32_event_without_message", "destructure_nested_tuples", "span_root", "enabled", "info_span_root", "borrow_val_spans", "test", "locals_no_message", "both_shorthands", "new_span_with_target_and_log_level", "record_new_values_for_fields", "trace", "boxed_collector", "span_closes_when_exited", "prefixed_event_macros", "entered_api", "async_fn_is_send", "debug_shorthand", "event_with_message", "span_and_event", "debug_root", "rolling::test::test_rotations", "span::test::test_record_backwards_compat", "event_root", "string_field", "contextual_root", "callsite_macro_api", "rolling::test::write_minutely_log", "rolling::test::test_path_concatenation", "contextual_child", "error_span_with_parent", "async_fn_with_async_trait", "debug_span_root", "explicit_child", "warn_root", "trace_span_root", "cloning_a_span_calls_clone_span", "non_blocking::test::backpressure_exerted", "debug", "record_new_value_for_field", "rolling::test::write_daily_log", "test_async", "one_with_everything", "event_without_message", "enter", "info_with_parent", "explicit_child_at_levels", "trace_span_with_parent", "warn", "level_and_target", "trace_root", "span_enabled", "dropping_a_span_calls_drop_span", "moved_field", "float_values", "impl_trait_return_type", "display_shorthand", "destructure_tuple_structs", "warn_span_with_parent", "test_mut", "multiple_max_level_hints", "warn_span_root", "out_of_scope_fields", "dotted_field_name", "event", "field_shorthand_only", "error_span_root", "error_root", "handles_to_different_spans_are_not_equal", "info_span", "async_block_is_send", "error_span", "explicit_child_regardless_of_ctx", "borrowed_field", "event_enabled", "info_span_with_parent", "explicit_root_span_is_root_regardless_of_ctx", "event_with_parent", "max_level_hints", "message_without_delims", "debug_span_with_parent", "spans_always_go_to_the_subscriber_that_tagged_them_even_across_threads", "filter_caching_is_lexically_scoped", "handles_to_the_same_span_are_equal", "debug_span", "clone_and_drop_span_always_go_to_the_subscriber_that_tagged_the_span", "async_fn_with_async_trait_and_fields_expressions", "events_dont_leak", "test_mut_async", "new_span_after_event", "error", "test_err_dbg", "explicit_root_span_is_root", "destructure_everything", "async_fn_nested", "async_fn_only_enters_for_polls", "manual_impl_future", "test_early_return", "error_with_parent", "span_with_non_rust_symbol", "filters_are_reevaluated_for_different_call_sites", "async_fn_with_async_trait_and_fields_expressions_with_generic_parameter", "debug_with_parent", "filters_are_not_reevaluated_for_the_same_span", "wrapping_event_without_message", "spans_dont_leak", "drop_span_when_exiting_dispatchers_context", "test_err_display_default", "manual_box_pin"], "failed_tests": ["test_err_custom_target"], "skipped_tests": ["non_blocking::test::logs_dropped_if_lossy"]}
{"passed_count": 0, "failed_count": 0, "skipped_count": 0, "passed_tests": [], "failed_tests": [], "skipped_tests": []}
{"passed_count": 141, "failed_count": 1, "skipped_count": 1, "passed_tests": ["event_outside_of_span", "entered", "handles_to_different_spans_with_the_same_metadata_are_not_equal", "arced_collector", "string_message_without_delims", "no_collector_disables_global", "non_blocking::test::multi_threaded_writes", "rolling::test::write_hourly_log", "span_with_parent", "trace_with_parent", "spans_always_go_to_the_subscriber_that_tagged_them", "rolling::test::write_never_log", "rolling::test::test_make_writer", "destructure_structs", "event_macros_dont_infinite_loop", "prefixed_span_macros", "trace_span", "locals_with_message", "rolling::test::test_max_log_files", "destructure_tuples", "span_closes_after_event", "warn_with_parent", "destructure_refs", "warn_span", "info_root", "info", "borrow_val_events", "span", "move_field_out_of_struct", "nonzeroi32_event_without_message", "destructure_nested_tuples", "enabled", "span_root", "info_span_root", "borrow_val_spans", "test", "locals_no_message", "both_shorthands", "new_span_with_target_and_log_level", "record_new_values_for_fields", "trace", "boxed_collector", "span_closes_when_exited", "prefixed_event_macros", "entered_api", "async_fn_is_send", "debug_shorthand", "event_with_message", "span_and_event", "debug_root", "rolling::test::test_rotations", "span::test::test_record_backwards_compat", "event_root", "string_field", "contextual_root", "callsite_macro_api", "test_err_dbg_info", "rolling::test::write_minutely_log", "rolling::test::test_path_concatenation", "contextual_child", "error_span_with_parent", "async_fn_with_async_trait", "debug_span_root", "explicit_child", "warn_root", "trace_span_root", "cloning_a_span_calls_clone_span", "non_blocking::test::backpressure_exerted", "debug", "record_new_value_for_field", "rolling::test::write_daily_log", "test_async", "one_with_everything", "event_without_message", "enter", "info_with_parent", "explicit_child_at_levels", "trace_span_with_parent", "warn", "level_and_target", "trace_root", "test_err_info", "span_enabled", "dropping_a_span_calls_drop_span", "moved_field", "float_values", "impl_trait_return_type", "display_shorthand", "destructure_tuple_structs", "warn_span_with_parent", "test_mut", "multiple_max_level_hints", "warn_span_root", "out_of_scope_fields", "dotted_field_name", "event", "field_shorthand_only", "error_span_root", "error_root", "handles_to_different_spans_are_not_equal", "info_span", "async_block_is_send", "error_span", "explicit_child_regardless_of_ctx", "borrowed_field", "event_enabled", "info_span_with_parent", "explicit_root_span_is_root_regardless_of_ctx", "event_with_parent", "test_err_warn_info", "max_level_hints", "message_without_delims", "debug_span_with_parent", "spans_always_go_to_the_subscriber_that_tagged_them_even_across_threads", "filter_caching_is_lexically_scoped", "handles_to_the_same_span_are_equal", "debug_span", "clone_and_drop_span_always_go_to_the_subscriber_that_tagged_the_span", "async_fn_with_async_trait_and_fields_expressions", "events_dont_leak", "test_mut_async", "new_span_after_event", "error", "test_err_dbg", "explicit_root_span_is_root", "destructure_everything", "async_fn_nested", "async_fn_only_enters_for_polls", "manual_impl_future", "test_early_return", "error_with_parent", "span_with_non_rust_symbol", "filters_are_reevaluated_for_different_call_sites", "async_fn_with_async_trait_and_fields_expressions_with_generic_parameter", "debug_with_parent", "filters_are_not_reevaluated_for_the_same_span", "wrapping_event_without_message", "spans_dont_leak", "drop_span_when_exiting_dispatchers_context", "test_err_display_default", "manual_box_pin"], "failed_tests": ["test_err_custom_target"], "skipped_tests": ["non_blocking::test::logs_dropped_if_lossy"]}