From a1d1b6def686f20927ef6c719e6eccf0a5d1dd2a Mon Sep 17 00:00:00 2001 From: DaniPopes <57450786+DaniPopes@users.noreply.github.com> Date: Wed, 18 Feb 2026 04:49:34 +0100 Subject: [PATCH] fix: prevent ANSI escape codes leaking into Tracy zone text (#22306) --- crates/tracing/src/layers.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/crates/tracing/src/layers.rs b/crates/tracing/src/layers.rs index 59d98f4ea7..75f8efb659 100644 --- a/crates/tracing/src/layers.rs +++ b/crates/tracing/src/layers.rs @@ -146,9 +146,24 @@ impl Layers { #[cfg(feature = "tracy")] pub(crate) fn tracy(&mut self, config: LayerInfo) -> eyre::Result<()> { - struct Config(tracing_subscriber::fmt::format::DefaultFields); + // Newtype wrapper around `DefaultFields` so that `FormattedFields` uses a + // distinct extension key from the fmt layer's `FormattedFields`. Without + // this, when both layers are active the fmt layer may insert ANSI-colored fields first, + // and the Tracy layer reuses them — leaking escape codes into Tracy zone text. + struct TracyFields(tracing_subscriber::fmt::format::DefaultFields); + impl<'writer> tracing_subscriber::fmt::FormatFields<'writer> for TracyFields { + fn format_fields( + &self, + writer: tracing_subscriber::fmt::format::Writer<'writer>, + fields: R, + ) -> core::fmt::Result { + self.0.format_fields(writer, fields) + } + } + + struct Config(TracyFields); impl tracing_tracy::Config for Config { - type Formatter = tracing_subscriber::fmt::format::DefaultFields; + type Formatter = TracyFields; fn formatter(&self) -> &Self::Formatter { &self.0 } @@ -157,9 +172,11 @@ impl Layers { } } - self.add_layer(tracing_tracy::TracyLayer::new(Config(Default::default())).with_filter( - build_env_filter(Some(config.default_directive.parse()?), &config.filters)?, - )); + self.add_layer( + tracing_tracy::TracyLayer::new(Config(TracyFields(Default::default()))).with_filter( + build_env_filter(Some(config.default_directive.parse()?), &config.filters)?, + ), + ); Ok(()) }