use std::fs::{self, File};
use std::io::{self, BufWriter};
use std::path::PathBuf;
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
pub fn init_logging(component_name: &str) -> io::Result<Option<WorkerGuard>> {
let file_logging_enabled = std::env::var("GROMNIE_LOG_FILE").is_ok();
if file_logging_enabled {
let log_dir = get_log_directory()?;
fs::create_dir_all(&log_dir)?;
let log_filename = format!("{}.log", component_name);
let log_path = log_dir.join(&log_filename);
let file = File::create(&log_path)?;
let (non_blocking_file, guard) = tracing_appender::non_blocking(BufWriter::new(file));
let env_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
tracing_subscriber::registry()
.with(env_filter)
.with(fmt::layer().with_writer(io::stdout).with_ansi(true))
.with(
fmt::layer()
.with_writer(non_blocking_file)
.with_ansi(false)
.with_target(true),
)
.init();
tracing::info!("Logging to file: {}", log_path.display());
Ok(Some(guard))
} else {
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")),
)
.init();
Ok(None)
}
}
fn get_log_directory() -> io::Result<PathBuf> {
let proj_paths = gromnie_client::config::paths::ProjectPaths::new("gromnie")
.ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Failed to find home directory"))?;
Ok(proj_paths.data_dir().join("logs"))
}