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 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}