diff --git a/Cargo.lock b/Cargo.lock index e05deff..c93b0a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -730,6 +730,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "icu_collections" version = "2.0.0" @@ -868,6 +874,17 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "is_ci" version = "1.2.0" @@ -1012,7 +1029,7 @@ dependencies = [ "cfg-if", "miette-derive", "owo-colors", - "supports-color", + "supports-color 3.0.2", "supports-hyperlinks", "supports-unicode", "terminal_size", @@ -1205,9 +1222,13 @@ checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "owo-colors" -version = "4.2.2" +version = "4.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" +checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" +dependencies = [ + "supports-color 2.1.0", + "supports-color 3.0.2", +] [[package]] name = "parking_lot" @@ -1798,6 +1819,16 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "supports-color" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89" +dependencies = [ + "is-terminal", + "is_ci", +] + [[package]] name = "supports-color" version = "3.0.2" @@ -2418,6 +2449,7 @@ dependencies = [ "lib", "miette", "nix-compat", + "owo-colors", "serde", "serde_json", "thiserror 2.0.17", diff --git a/wire/cli/Cargo.toml b/wire/cli/Cargo.toml index ddf6714..7a4038a 100644 --- a/wire/cli/Cargo.toml +++ b/wire/cli/Cargo.toml @@ -27,3 +27,4 @@ itertools = "0.14.0" dhat = "0.3.2" clap_complete = "4.5.59" nix-compat = { workspace = true } +owo-colors = { version = "4.2.3", features = ["supports-colors"] } diff --git a/wire/cli/src/tracing_setup.rs b/wire/cli/src/tracing_setup.rs index a6c6592..960182c 100644 --- a/wire/cli/src/tracing_setup.rs +++ b/wire/cli/src/tracing_setup.rs @@ -9,17 +9,13 @@ use std::{ use clap_verbosity_flag::{Verbosity, WarnLevel}; use lib::STDIN_CLOBBER_LOCK; -use tracing::{Level, Subscriber}; +use owo_colors::{OwoColorize, Stream}; +use tracing::{Subscriber}; use tracing_log::AsTrace; use tracing_subscriber::{ - Layer, - fmt::{ - FormatEvent, FormatFields, - format::{self, Format, Full}, - }, - layer::SubscriberExt, - registry::LookupSpan, - util::SubscriberInitExt, + Layer, field::{RecordFields, VisitFmt}, fmt::{ + FormatEvent, FormatFields, FormattedFields, format::{self, DefaultFields, DefaultVisitor, Format, Full} + }, layer::SubscriberExt, registry::LookupSpan, util::SubscriberInitExt }; struct NonClobberingWriter { @@ -72,9 +68,38 @@ impl Write for NonClobberingWriter { } } -struct WireFormat(Format); +struct WireEventFormat(Format); +struct WireFieldFormat; +struct WireFieldVisitor<'a>(DefaultVisitor<'a>); -impl FormatEvent for WireFormat +impl<'a> WireFieldVisitor<'a> { + fn new(writer: format::Writer<'a>, is_empty: bool) -> Self { + Self(DefaultVisitor::new(writer, is_empty)) + } +} + +impl<'writer> FormatFields<'writer> for WireFieldFormat { + fn format_fields(&self, writer: format::Writer<'writer>, fields: R) -> std::fmt::Result { + let mut v = WireFieldVisitor::new(writer, true); + fields.record(&mut v); + // v.finish() + + Ok(()) + } +} + +impl tracing::field::Visit for WireFieldVisitor<'_> { + fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { + match field.name() { + "node" => { + let _ = write!(self.0.writer(), "{:?}", value.if_supports_color(Stream::Stderr, |text| text.bold())); + }, + _ => return, + } + } +} + +impl FormatEvent for WireEventFormat where S: Subscriber + for<'a> LookupSpan<'a>, N: for<'a> FormatFields<'a> + 'static, @@ -82,16 +107,41 @@ where fn format_event( &self, ctx: &tracing_subscriber::fmt::FmtContext<'_, S, N>, - writer: tracing_subscriber::fmt::format::Writer<'_>, + mut writer: tracing_subscriber::fmt::format::Writer<'_>, event: &tracing::Event<'_>, ) -> std::fmt::Result { let metadata = event.metadata(); - if !matches!(metadata.level(), &Level::INFO) { + // if !matches!(metadata.level(), &tracing::Level::INFO) { + // return self.0.format_event(ctx, writer, event); + // } + + let Some(scope) = ctx.event_scope() else { + return self.0.format_event(ctx, writer, event); + }; + + let Some(parent) = scope.last() else { + return self.0.format_event(ctx, writer, event); + }; + + if parent.name() != "execute" { return self.0.format_event(ctx, writer, event); } - self.0.format_event(ctx, writer, event)?; + let Some(node_name) = parent.fields().field("node") else { + return self.0.format_event(ctx, writer, event); + }; + + let format = WireFieldFormat; + + let ext = parent.extensions(); + let fields = &ext + .get::>() + .expect("will never be `None`"); + + write!(writer, "{fields}")?; + + writeln!(writer)?; Ok(()) } @@ -101,9 +151,10 @@ pub fn setup_logging(verbosity: Verbosity) { let filter = verbosity.log_level_filter().as_trace(); let registry = tracing_subscriber::registry(); - let event_formatter = WireFormat(format::format().without_time().with_target(false)); + let event_formatter = WireEventFormat(format::format().without_time().with_target(false)); let layer = tracing_subscriber::fmt::layer() + .fmt_fields(WireFieldFormat) .event_format(event_formatter) .with_writer(NonClobberingWriter::new) .with_filter(filter);