#![forbid(unsafe_code)]
use std::path::Path;
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
pub struct LogGuard {
_guard: Option<WorkerGuard>,
}
pub fn init(project_root: Option<&Path>) -> LogGuard {
let env_filter =
EnvFilter::try_from_env("CORALINE_LOG").unwrap_or_else(|_| EnvFilter::new("coraline=info"));
if let Some(root) = project_root {
let log_dir = root.join(".coraline").join("logs");
if std::fs::create_dir_all(&log_dir).is_ok() {
let file_appender = tracing_appender::rolling::daily(&log_dir, "coraline.log");
let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
let result = tracing_subscriber::registry()
.with(env_filter.clone())
.with(fmt::layer().with_writer(non_blocking).with_ansi(false))
.try_init();
if result.is_ok() {
return LogGuard {
_guard: Some(guard),
};
}
}
}
let _ = tracing_subscriber::registry()
.with(env_filter)
.with(fmt::layer().with_writer(std::io::stderr))
.try_init();
LogGuard { _guard: None }
}