diff --git a/tracing-subscriber/src/fmt/format/mod.rs b/tracing-subscriber/src/fmt/format/mod.rs index bc7eb40f2c..c6c7bfa95b 100644 --- a/tracing-subscriber/src/fmt/format/mod.rs +++ b/tracing-subscriber/src/fmt/format/mod.rs @@ -380,6 +380,39 @@ impl<'writer> Writer<'writer> { pub fn has_ansi_escapes(&self) -> bool { self.is_ansi } + + pub(in crate::fmt::format) fn bold(&self) -> Style { + #[cfg(feature = "ansi")] + { + if self.is_ansi { + return Style::new().bold(); + } + } + + Style::new() + } + + pub(in crate::fmt::format) fn dimmed(&self) -> Style { + #[cfg(feature = "ansi")] + { + if self.is_ansi { + return Style::new().dimmed(); + } + } + + Style::new() + } + + pub(in crate::fmt::format) fn italic(&self) -> Style { + #[cfg(feature = "ansi")] + { + if self.is_ansi { + return Style::new().italic(); + } + } + + Style::new() + } } impl fmt::Write for Writer<'_> { @@ -654,17 +687,6 @@ impl Format { } writer.write_char(' ') } - - fn bold(&self, is_ansi: bool) -> Style { - #[cfg(feature = "ansi")] - { - if self.ansi.unwrap_or(true) && is_ansi { - return Style::new().bold(); - } - } - - Style::new() - } } #[cfg(feature = "json")] @@ -756,8 +778,11 @@ where write!(writer, "{:0>2?} ", std::thread::current().id())?; } + let dimmed = writer.dimmed(); + if let Some(scope) = ctx.ctx.event_scope(event) { - let bold = self.bold(writer.has_ansi_escapes()); + let bold = writer.bold(); + let mut seen = false; for span in scope.from_root() { @@ -770,7 +795,7 @@ where write!(writer, "{}{}{}", bold.paint("{"), fields, bold.paint("}"))?; } } - writer.write_char(':')?; + write!(writer, "{}", dimmed.paint(":"))?; } if seen { @@ -779,7 +804,12 @@ where } if self.display_target { - write!(writer, "{}: ", meta.target())?; + write!( + writer, + "{}{} ", + dimmed.paint(meta.target()), + dimmed.paint(":") + )?; } ctx.format_fields(writer.by_ref(), event)?; @@ -828,25 +858,17 @@ where } if self.display_target { - let target = meta.target(); - #[cfg(feature = "ansi")] - let target = if writer.has_ansi_escapes() { - Style::new().bold().paint(target) - } else { - Style::new().paint(target) - }; - - write!(writer, "{}:", target)?; + write!( + writer, + "{}{}", + writer.bold().paint(meta.target()), + writer.dimmed().paint(":") + )?; } ctx.format_fields(writer.by_ref(), event)?; - #[cfg(feature = "ansi")] - let dimmed = if writer.has_ansi_escapes() { - Style::new().dimmed() - } else { - Style::new() - }; + let dimmed = writer.dimmed(); for span in ctx .ctx .event_scope(event) @@ -857,9 +879,7 @@ where let exts = span.extensions(); if let Some(fields) = exts.get::>() { if !fields.is_empty() { - #[cfg(feature = "ansi")] - let fields = dimmed.paint(fields.as_str()); - write!(writer, " {}", fields)?; + write!(writer, " {}", dimmed.paint(&fields.fields))?; } } } @@ -965,9 +985,17 @@ impl<'a> field::Visit for DefaultVisitor<'a> { fn record_error(&mut self, field: &Field, value: &(dyn std::error::Error + 'static)) { if let Some(source) = value.source() { + let italic = self.writer.italic(); self.record_debug( field, - &format_args!("{} {}.sources={}", value, field, ErrorSourceList(source)), + &format_args!( + "{} {}{}{}{}", + value, + italic.paint(field.name()), + italic.paint(".sources"), + self.writer.dimmed().paint("="), + ErrorSourceList(source) + ), ) } else { self.record_debug(field, &format_args!("{}", value)) @@ -985,8 +1013,20 @@ impl<'a> field::Visit for DefaultVisitor<'a> { // Skip fields that are actually log metadata that have already been handled #[cfg(feature = "tracing-log")] name if name.starts_with("log.") => Ok(()), - name if name.starts_with("r#") => write!(self.writer, "{}={:?}", &name[2..], value), - name => write!(self.writer, "{}={:?}", name, value), + name if name.starts_with("r#") => write!( + self.writer, + "{}{}{:?}", + self.writer.italic().paint(&name[2..]), + self.writer.dimmed().paint("="), + value + ), + name => write!( + self.writer, + "{}{}{:?}", + self.writer.italic().paint(name), + self.writer.dimmed().paint("="), + value + ), }; } } @@ -1405,7 +1445,7 @@ pub(super) mod test { #[cfg(feature = "ansi")] #[test] fn with_ansi_true() { - let expected = "\u{1b}[2mfake time\u{1b}[0m \u{1b}[32m INFO\u{1b}[0m tracing_subscriber::fmt::format::test: hello\n"; + let expected = "\u{1b}[2mfake time\u{1b}[0m \u{1b}[32m INFO\u{1b}[0m \u{1b}[2mtracing_subscriber::fmt::format::test\u{1b}[0m\u{1b}[2m:\u{1b}[0m hello\n"; test_ansi(true, expected); } diff --git a/tracing-subscriber/src/fmt/format/pretty.rs b/tracing-subscriber/src/fmt/format/pretty.rs index 8629b05183..a8119346d6 100644 --- a/tracing-subscriber/src/fmt/format/pretty.rs +++ b/tracing-subscriber/src/fmt/format/pretty.rs @@ -175,11 +175,7 @@ where writer.write_char('\n')?; } - let bold = if writer.has_ansi_escapes() { - Style::new().bold() - } else { - Style::new() - }; + let bold = writer.bold(); let span = event .parent() .and_then(|id| ctx.span(id))