Cactus/logging/
mod.rs

1use env_logger::{Builder, Env, Target};
2use log::LevelFilter;
3use std::fs::File;
4use std::io::{self, Write};
5
6use crate::fs_manager;
7struct Tee<W1: Write, W2: Write> {
8    a: W1,
9    b: W2,
10}
11
12impl<W1: Write, W2: Write> Write for Tee<W1, W2> {
13    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
14        let n = self.a.write(buf)?;
15        let _ = self.b.write(buf)?;
16        Ok(n)
17    }
18    fn flush(&mut self) -> io::Result<()> {
19        self.a.flush()?;
20        self.b.flush()
21    }
22}
23
24pub fn init(log_level: LevelFilter, to_file: bool) {
25    // TODO fix the colors when saving to file
26    if to_file {
27        fs_manager::create_dirs();
28        let file = File::create("logs/latest.log").unwrap();
29        let stderr = io::stderr();
30        let tee = Tee { a: file, b: stderr };
31
32        Builder::from_env(Env::default())
33            .target(Target::Pipe(Box::new(tee)))
34            .filter_level(log_level)
35            .init();
36        return;
37    }
38    let mut builder = Builder::new();
39    builder.filter_level(log_level);
40    builder.init();
41}