···2424 util::SubscriberInitExt,
2525};
26262727+/// The non-clobbering writer ensures that log lines are held while interactive
2828+/// prompts are shown to the user. If logs where shown, they would "clobber" the
2929+/// sudo / ssh prompt.
3030+///
3131+/// Additionally, the `STDIN_CLOBBER_LOCK` is used to ensure that no two
3232+/// interactive prompts are shown at the same time.
2733struct NonClobberingWriter {
2834 queue: VecDeque<Vec<u8>>,
2935 stderr: Stderr,
···7480 }
7581}
76828383+/// Handles event formatting, which falls back to the default formatter
8484+/// passed.
7785struct WireEventFormat(Format<Full, ()>);
8686+/// Formats the node's name with `WireFieldVisitor`
7887struct WireFieldFormat;
7988struct WireFieldVisitor<'a>(DefaultVisitor<'a>);
8989+/// `WireLayer` injects `WireFieldFormat` as an extension on the event
8090struct WireLayer;
81918292impl<'a> WireFieldVisitor<'a> {
···93103 ) -> std::fmt::Result {
94104 let mut v = WireFieldVisitor::new(writer, true);
95105 fields.record(&mut v);
9696- // v.finish()
9797-98106 Ok(())
99107 }
100108}
···117125 style = match level {
118126 Level::TRACE => style.purple(),
119127 Level::DEBUG => style.blue(),
120120- // info will not change the default
121121- Level::INFO => style,
128128+ Level::INFO => style.green(),
122129 Level::WARN => style.yellow(),
123130 Level::ERROR => style.red(),
124131 };
···149156 ) -> std::fmt::Result {
150157 let metadata = event.metadata();
151158152152- // if !matches!(metadata.level(), &tracing::Level::INFO) {
153153- // return self.0.format_event(ctx, writer, event);
154154- // }
155155-159159+ // skip events without an "event_scope"
156160 let Some(scope) = ctx.event_scope() else {
157161 return self.0.format_event(ctx, writer, event);
158162 };
159163164164+ // skip spans without a parent
160165 let Some(parent) = scope.last() else {
161166 return self.0.format_event(ctx, writer, event);
162167 };
163168169169+ // skip spans that dont refer to the goal step executor
164170 if parent.name() != "execute" {
165171 return self.0.format_event(ctx, writer, event);
166172 }
167173174174+ // skip spans that dont refer to a specific node being executed
168175 if parent.fields().field("node").is_none() {
169176 return self.0.format_event(ctx, writer, event);
170177 }
171178172179 let style = get_style(*metadata.level());
173180174174- let ext = parent.extensions();
175175-176176- let node_name = &ext.get::<FormattedFields<WireFieldFormat>>().unwrap();
177177-181181+ // write the log level with colour
178182 write!(
179183 writer,
180184 "{} ",
181181- fmt_level(*metadata.level()).if_supports_color(Stream::Stderr, |x| {
182182- if *metadata.level() == Level::INFO {
183183- x.style(style.green())
184184- } else {
185185- x.style(style)
186186- }
187187- })
185185+ fmt_level(*metadata.level()).if_supports_color(Stream::Stderr, |x| { x.style(style) })
188186 )?;
189187188188+ // extract the formatted node name into a string
189189+ let parent_ext = parent.extensions();
190190+ let node_name = &parent_ext
191191+ .get::<FormattedFields<WireFieldFormat>>()
192192+ .unwrap();
193193+190194 write!(writer, "{node_name}")?;
191195196196+ // write the step name
192197 if let Some(step) = ctx.event_scope().unwrap().from_root().nth(1) {
193198 write!(writer, " {}", step.name().italic())?;
194199 }
195200196201 write!(writer, " | ")?;
197202203203+ // write the default fields, including the actual message and other data
198204 let mut fields = FormattedFields::<DefaultFields>::new(String::new());
199205200206 ctx.format_fields(fields.as_writer(), event)?;
201207202202- write!(writer, "{fields}",)?;
203203-208208+ write!(writer, "{fields}")?;
204209 writeln!(writer)?;
205210206211 Ok(())
···233238 }
234239}
235240241241+/// Set up logging for the application
242242+/// Uses `WireFieldFormat` if -v was never passed
236243pub fn setup_logging<L: LogLevel>(verbosity: &Verbosity<L>) {
237244 let filter = verbosity.log_level_filter().as_trace();
238245 let registry = tracing_subscriber::registry();