From bb07304da60c198d4cf7308c2fa677a2ebb9a96f Mon Sep 17 00:00:00 2001 From: CreditWorthy Date: Tue, 12 Aug 2025 21:37:38 -0500 Subject: [PATCH] fmt: add with_event_name configuration option Adds with_event_name() to control display of event names in formatted output. Filters out verbose default names like "event src/main.rs:123", showing only custom event names when enabled. Closes #2774 --- tracing-subscriber/src/fmt/fmt_layer.rs | 10 ++ tracing-subscriber/src/fmt/format/mod.rs | 151 ++++++++++++++++++++++- tracing-subscriber/src/fmt/mod.rs | 14 +++ 3 files changed, 170 insertions(+), 5 deletions(-) diff --git a/tracing-subscriber/src/fmt/fmt_layer.rs b/tracing-subscriber/src/fmt/fmt_layer.rs index 9dbc0fe895..2a6d12769a 100644 --- a/tracing-subscriber/src/fmt/fmt_layer.rs +++ b/tracing-subscriber/src/fmt/fmt_layer.rs @@ -516,6 +516,16 @@ where } } + /// Sets whether or not an event's [name] is displayed. + /// + /// [name]: tracing_core::Metadata::name + pub fn with_event_name(self, display_event_name: bool) -> Layer, W> { + Layer { + fmt_event: self.fmt_event.with_event_name(display_event_name), + ..self + } + } + /// Sets whether or not an event's level is displayed. pub fn with_level(self, display_level: bool) -> Layer, W> { Layer { diff --git a/tracing-subscriber/src/fmt/format/mod.rs b/tracing-subscriber/src/fmt/format/mod.rs index f5da2da66f..1b79a7d589 100644 --- a/tracing-subscriber/src/fmt/format/mod.rs +++ b/tracing-subscriber/src/fmt/format/mod.rs @@ -409,6 +409,7 @@ pub struct Format { pub(crate) display_thread_name: bool, pub(crate) display_filename: bool, pub(crate) display_line_number: bool, + pub(crate) display_event_name: bool, } // === impl Writer === @@ -599,6 +600,7 @@ impl Default for Format { display_thread_name: false, display_filename: false, display_line_number: false, + display_event_name: false, } } } @@ -619,6 +621,7 @@ impl Format { display_thread_name: self.display_thread_name, display_filename: self.display_filename, display_line_number: self.display_line_number, + display_event_name: self.display_event_name, } } @@ -658,6 +661,7 @@ impl Format { display_thread_name: self.display_thread_name, display_filename: true, display_line_number: true, + display_event_name: false, } } @@ -689,6 +693,7 @@ impl Format { display_thread_name: self.display_thread_name, display_filename: self.display_filename, display_line_number: self.display_line_number, + display_event_name: self.display_event_name, } } @@ -718,6 +723,7 @@ impl Format { display_thread_name: self.display_thread_name, display_filename: self.display_filename, display_line_number: self.display_line_number, + display_event_name: self.display_event_name, } } @@ -734,6 +740,7 @@ impl Format { display_thread_name: self.display_thread_name, display_filename: self.display_filename, display_line_number: self.display_line_number, + display_event_name: self.display_thread_name, } } @@ -794,6 +801,35 @@ impl Format { } } + /// Sets whether or not an event's [name] is + /// displayed. + /// This enables the inclusion of the event's name in the formatted output. + /// By default, event names are not displayed. + /// + /// # Example + /// + /// ```rust + /// use tracing_subscriber::fmt; + /// use tracing::{Level, event}; + /// + /// let format = fmt::format() + /// .with_event_name(true); + /// + /// let subscriber = fmt() + /// .event_format(format) + /// .finish(); + /// + ///event!(name: "my_event_name", Level::INFO, "hello"); + /// ``` + /// + /// [name]: tracing_core::Metadata::name + pub fn with_event_name(self, display_event_name: bool) -> Format { + Format { + display_event_name, + ..self + } + } + /// Sets whether or not an event's [source code line number][line] is /// displayed. /// @@ -1008,6 +1044,24 @@ where } } + if self.display_event_name { + let name = meta.name(); + + let should_display = match (meta.file(), meta.line()) { + (Some(file), Some(line)) => name != format!("event {}:{}", file, line), + _ => true, + }; + + if should_display { + write!( + writer, + "{}{} ", + dimmed.paint(meta.name()), + dimmed.paint(":") + )?; + } + } + if let Some(line_number) = line_number { write!( writer, @@ -1119,6 +1173,23 @@ where } } + if self.display_event_name { + let name = meta.name(); + + let should_display = match (meta.file(), meta.line()) { + (Some(file), Some(line)) => name != format!("event {}:{}", file, line), + _ => true, + }; + + if should_display { + if needs_space { + writer.write_char(' ')?; + } + write!(writer, "{}{}", dimmed.paint(name), dimmed.paint(":"))?; + needs_space = true; + } + } + if self.display_line_number { if let Some(line_number) = meta.line() { write!( @@ -1743,11 +1814,7 @@ impl Display for TimingDisplay { #[cfg(test)] pub(super) mod test { use crate::fmt::{test::MockMakeWriter, time::FormatTime}; - use tracing::{ - self, - dispatcher::{set_default, Dispatch}, - subscriber::with_default, - }; + use tracing::{self, dispatcher::{set_default, Dispatch}, event, subscriber::with_default}; use super::*; @@ -1882,6 +1949,80 @@ pub(super) mod test { assert_info_hello(subscriber, make_writer, expected); } + #[test] + fn with_event_name() { + let make_writer = MockMakeWriter::default(); + let subscriber = crate::fmt::Subscriber::builder() + .with_writer(make_writer.clone()) + .with_event_name(true) + .with_level(false) + .with_ansi(false) + .with_timer(MockTime); + + let _default = set_default(&subscriber.into()); + event!(name: "custom_event", Level::INFO, "hello"); + + let expected + = "fake time tracing_subscriber::fmt::format::test: custom_event: hello\n"; + + assert_eq!(expected, make_writer.get_string()); + } + + #[test] + fn with_event_name_compact() { + let make_writer = MockMakeWriter::default(); + let subscriber = crate::fmt::Subscriber::builder() + .with_writer(make_writer.clone()) + .with_event_name(true) + .with_level(false) + .with_ansi(false) + .with_timer(MockTime) + .compact(); + + let _default = set_default(&subscriber.into()); + event!(name: "compact_event", Level::INFO, "hello"); + + let result = make_writer.get_string(); + assert!(result.contains("compact_event:")); + } + + #[test] + fn with_event_name_hides_default() { + let make_writer = MockMakeWriter::default(); + let subscriber = crate::fmt::Subscriber::builder() + .with_writer(make_writer.clone()) + .with_event_name(true) + .with_level(false) + .with_ansi(false) + .with_timer(MockTime); + + let _default = set_default(&subscriber.into()); + tracing::info!("hello"); + + let result = make_writer.get_string(); + assert!(!result.contains("event ")); + assert_eq!("fake time tracing_subscriber::fmt::format::test: hello\n", result); + } + + #[test] + fn without_event_name() { + let make_writer = MockMakeWriter::default(); + let subscriber = crate::fmt::Subscriber::builder() + .with_writer(make_writer.clone()) + .with_event_name(false) + .with_level(false) + .with_ansi(false) + .with_timer(MockTime); + + let _default = set_default(&subscriber.into()); + event!(name: "custom_event", Level::INFO, "hello"); + + let result = make_writer.get_string(); + // adding this test to double check I didnt miss anything + assert!(!result.contains("custom_event:")); + assert_eq!("fake time tracing_subscriber::fmt::format::test: hello\n", result); + } + #[test] fn with_thread_ids() { let make_writer = MockMakeWriter::default(); diff --git a/tracing-subscriber/src/fmt/mod.rs b/tracing-subscriber/src/fmt/mod.rs index 94ebd49c3f..69ae9675d3 100644 --- a/tracing-subscriber/src/fmt/mod.rs +++ b/tracing-subscriber/src/fmt/mod.rs @@ -694,6 +694,20 @@ where } } + /// Sets whether or not an event's [name] is + /// displayed. + /// + /// [name]: tracing_core::Metadata::name + pub fn with_event_name( + self, + display_event_name: bool, + ) -> SubscriberBuilder, F, W> { + SubscriberBuilder { + inner: self.inner.with_event_name(display_event_name), + ..self + } + } + /// Sets whether or not an event's level is displayed. pub fn with_level( self,