From 969e82c98f93eb9fbdbc6261f78d12918bd45853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Wed, 18 Jun 2025 14:10:34 +0200 Subject: [PATCH 1/3] no longer use Deref for FormattedFields in tracing-subscriber to prepare removal. --- tracing-subscriber/src/fmt/fmt_layer.rs | 4 ++-- tracing-subscriber/src/fmt/format/mod.rs | 4 ++-- tracing-subscriber/src/fmt/format/pretty.rs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tracing-subscriber/src/fmt/fmt_layer.rs b/tracing-subscriber/src/fmt/fmt_layer.rs index 9dbc0fe895..93a1150c6b 100644 --- a/tracing-subscriber/src/fmt/fmt_layer.rs +++ b/tracing-subscriber/src/fmt/fmt_layer.rs @@ -797,6 +797,7 @@ impl fmt::Display for FormattedFields { } } +// TODO: Evaluate removing Deref in future versions, as its a powerful tool and barely useful (consumers can just call `.fields` directly) impl Deref for FormattedFields { type Target = String; fn deref(&self) -> &Self::Target { @@ -1631,8 +1632,7 @@ mod test { .with_timer(MockTime) .with_span_events(FmtSpan::ACTIVE); - let (reloadable_layer, reload_handle) = - crate::reload::Layer::new(inner_layer); + let (reloadable_layer, reload_handle) = crate::reload::Layer::new(inner_layer); let reload = reloadable_layer.with_subscriber(Registry::default()); with_default(reload, || { diff --git a/tracing-subscriber/src/fmt/format/mod.rs b/tracing-subscriber/src/fmt/format/mod.rs index f5da2da66f..456fcf6575 100644 --- a/tracing-subscriber/src/fmt/format/mod.rs +++ b/tracing-subscriber/src/fmt/format/mod.rs @@ -969,7 +969,7 @@ where let ext = span.extensions(); if let Some(fields) = &ext.get::>() { - if !fields.is_empty() { + if !fields.fields.is_empty() { write!(writer, "{}{}{}", bold.paint("{"), fields, bold.paint("}"))?; } } @@ -1146,7 +1146,7 @@ where { let exts = span.extensions(); if let Some(fields) = exts.get::>() { - if !fields.is_empty() { + if !fields.fields.is_empty() { write!(writer, " {}", dimmed.paint(&fields.fields))?; } } diff --git a/tracing-subscriber/src/fmt/format/pretty.rs b/tracing-subscriber/src/fmt/format/pretty.rs index a6713542ae..aa7b3830ba 100644 --- a/tracing-subscriber/src/fmt/format/pretty.rs +++ b/tracing-subscriber/src/fmt/format/pretty.rs @@ -324,7 +324,7 @@ where let fields = &ext .get::>() .expect("Unable to find FormattedFields in extensions; this is a bug"); - if !fields.is_empty() { + if !fields.fields.is_empty() { write!(writer, " {} {}", dimmed.paint("with"), fields)?; } writer.write_char('\n')?; @@ -346,7 +346,7 @@ impl<'writer> FormatFields<'writer> for Pretty { current: &'writer mut FormattedFields, fields: &span::Record<'_>, ) -> fmt::Result { - let empty = current.is_empty(); + let empty = current.fields.is_empty(); let writer = current.as_writer(); let mut v = PrettyVisitor::new(writer, empty); fields.record(&mut v); From 1fa67dac5c909e35e705f8bcc64ad68a6e520b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Thu, 19 Jun 2025 11:37:32 +0200 Subject: [PATCH 2/3] warn users of a bug in `tracing-subscriber` which is there for some time and hard to fix --- tracing/src/span.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tracing/src/span.rs b/tracing/src/span.rs index 46e9cf82c0..718514fa4c 100644 --- a/tracing/src/span.rs +++ b/tracing/src/span.rs @@ -1162,6 +1162,11 @@ impl Span { /// span was created: /// /// + ///
+    ///     Note: FmtSubscriber has a bug
+    ///     where it duplicates span fiels because of its implementation. See details at:  Github
+    /// 
+ /// /// ``` /// use tracing::{trace_span, field}; /// From 24f7012fbb8ad1394aa960cf3417afd8567a9bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=A4rtens?= Date: Thu, 19 Jun 2025 12:50:34 +0200 Subject: [PATCH 3/3] fix a spelling mistake. change position to the end of the description to not interupt the ":" in the note above. There are several ways to trigger this, e.g.: ```rust //[dependencies] //tracing-subscriber = "0.3" //tracing = "0.1" fn main() { tracing_subscriber::fmt() .with_max_level(tracing::Level::TRACE) .init(); let span = tracing::info_span!("request", duplicate = tracing::field::Empty); span.record("duplicate", &100); span.record("duplicate", &200); span.record("duplicate", tracing::field::Empty); span.record("duplicate", &300); // produces: // 2025-06-19T10:45:31.070903Z INFO request{duplicate=100 duplicate=200 duplicate=300}: bbbb: some event! // ^ first duplicate // ^ second duplcate // ^ an additional space by the empty field // ^ expected value here let _guard = span.enter(); tracing::info!("some event!"); } ``` --- tracing/src/span.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tracing/src/span.rs b/tracing/src/span.rs index 718514fa4c..23a4f85091 100644 --- a/tracing/src/span.rs +++ b/tracing/src/span.rs @@ -1162,11 +1162,6 @@ impl Span { /// span was created: /// /// - ///
-    ///     Note: FmtSubscriber has a bug
-    ///     where it duplicates span fiels because of its implementation. See details at:  Github
-    /// 
- /// /// ``` /// use tracing::{trace_span, field}; /// @@ -1192,6 +1187,11 @@ impl Span { /// **Note**: To record several values in just one call, see the [`record_all!`](crate::record_all!) macro. /// /// + ///
+    ///     Note: FmtSubscriber has a bug
+    ///     where it might duplicates span fields because of its implementation. See details at:  Github
+    /// 
+ /// /// [`field::Empty`]: super::field::Empty /// [`Metadata`]: super::Metadata pub fn record(