Skip to main content

things_mcp/
logging.rs

1//! Tracing setup for things-mcp.
2//!
3//! stderr is always wired; if `log_dir` is provided we also append to
4//! `<log_dir>/stdio.log`. Safe to call exactly once per process.
5
6use 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}