Monorepo for Tangled
tangled.org
1use std::fs::{File, OpenOptions};
2use std::io::{self, Write};
3use tracing_subscriber::EnvFilter;
4use tracing_subscriber::fmt::MakeWriter;
5
6pub fn init() {
7 let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
8 tracing_subscriber::fmt()
9 .with_env_filter(filter)
10 .with_writer(ConsoleAndStderr)
11 .init();
12}
13
14#[derive(Clone, Copy, Debug)]
15struct ConsoleAndStderr;
16
17struct TeeWriter {
18 stderr: io::Stderr,
19 console: Option<File>,
20}
21
22impl<'a> MakeWriter<'a> for ConsoleAndStderr {
23 type Writer = TeeWriter;
24
25 fn make_writer(&'a self) -> Self::Writer {
26 TeeWriter {
27 stderr: io::stderr(),
28 console: OpenOptions::new().write(true).open("/dev/console").ok(),
29 }
30 }
31}
32
33impl Write for TeeWriter {
34 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
35 self.stderr.write_all(buf)?;
36 if let Some(console) = &mut self.console {
37 console.write_all(buf)?;
38 }
39 Ok(buf.len())
40 }
41
42 fn flush(&mut self) -> io::Result<()> {
43 self.stderr.flush()?;
44 if let Some(console) = &mut self.console {
45 console.flush()?;
46 }
47 Ok(())
48 }
49}