use tracing::Level;
use tracing_subscriber::{EnvFilter, fmt, prelude::*};
#[derive(Debug, Clone)]
pub struct ObservabilityConfig {
pub level: Level,
pub target: LogTarget,
}
impl Default for ObservabilityConfig {
fn default() -> Self {
Self {
level: Level::INFO,
target: LogTarget::default(),
}
}
}
#[derive(Debug, Clone, Default)]
pub enum LogTarget {
#[default]
Console,
File(String),
}
pub fn init(config: ObservabilityConfig) -> Result<(), Box<dyn std::error::Error>> {
let filter = EnvFilter::from_default_env()
.add_directive(format!("llm_toolkit={}", config.level).parse()?)
.add_directive(format!("llm_toolkit_macros={}", config.level).parse()?);
let subscriber = tracing_subscriber::registry().with(filter);
match config.target {
LogTarget::Console => {
let layer = fmt::layer().with_writer(std::io::stdout);
subscriber.with(layer).init();
}
LogTarget::File(path) => {
let file = std::fs::File::create(path)?;
let layer = fmt::layer().with_writer(file);
subscriber.with(layer).init();
}
};
Ok(())
}