1use std::path::Path;
7use tracing_subscriber::{fmt, prelude::*, EnvFilter};
8
9pub fn init(level: &str, log_dir: Option<&Path>) -> anyhow::Result<()> {
10 let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(level));
11
12 let stderr_layer = fmt::layer().with_writer(std::io::stderr).with_ansi(false);
13 let registry = tracing_subscriber::registry()
14 .with(filter)
15 .with(stderr_layer);
16
17 if let Some(dir) = log_dir {
18 std::fs::create_dir_all(dir)?;
19 let file = std::fs::OpenOptions::new()
20 .create(true)
21 .append(true)
22 .open(dir.join("stdio.log"))?;
23 let file_layer = fmt::layer().with_writer(file).with_ansi(false);
24 registry.with(file_layer).try_init()?;
25 } else {
26 registry.try_init()?;
27 }
28 Ok(())
29}