1#![cfg(any(target_os = "linux", target_os = "windows"))]
7
8use std::sync::Arc;
9use tracing_subscriber::filter::Targets;
10use tracing_subscriber::fmt::format::FmtSpan;
11use tracing_subscriber::layer::SubscriberExt;
12use tracing_subscriber::util::SubscriberInitExt;
13
14pub fn init_tracing() -> mesh::pipe::ReadPipe {
16 let (log_read, log_write) = mesh::pipe::pipe();
17 let targets = Targets::new()
18 .with_default(tracing::level_filters::LevelFilter::DEBUG)
19 .with_target("mesh_remote", tracing::level_filters::LevelFilter::INFO);
20
21 tracing_subscriber::fmt()
22 .compact()
23 .with_ansi(false)
24 .with_timer(tracing_subscriber::fmt::time::uptime())
25 .with_writer(Arc::new(TracingWriter(log_write)))
26 .with_max_level(tracing::level_filters::LevelFilter::DEBUG)
27 .with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
28 .log_internal_errors(true)
29 .finish()
30 .with(targets)
31 .init();
32
33 tracing::info!("tracing initialized");
34 log_read
35}
36
37struct TracingWriter(mesh::pipe::WritePipe);
38
39impl std::io::Write for &TracingWriter {
40 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
41 self.0.write_nonblocking(buf)
44 }
45
46 fn flush(&mut self) -> std::io::Result<()> {
47 Ok(())
48 }
49}