1use std::path::Path;
2
3use tracing_appender::non_blocking::WorkerGuard;
4use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
5
6pub fn init_stderr_only() {
9 tracing_subscriber::registry()
10 .with(EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("oven_cli=info")))
11 .with(fmt::layer().with_writer(std::io::stderr))
12 .init();
13}
14
15pub fn init_with_file(log_dir: &Path, verbose: bool) -> WorkerGuard {
20 let file_appender = tracing_appender::rolling::never(log_dir, "pipeline.log");
21 let (non_blocking, guard) = tracing_appender::non_blocking(file_appender);
22
23 let env_filter = if verbose {
24 EnvFilter::new("oven_cli=debug")
25 } else {
26 EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("oven_cli=info"))
27 };
28
29 tracing_subscriber::registry()
30 .with(env_filter)
31 .with(fmt::layer().with_writer(std::io::stderr))
32 .with(fmt::layer().json().with_writer(non_blocking))
33 .init();
34
35 guard
36}
37
38#[cfg(test)]
39mod tests {
40 #[test]
45 fn init_stderr_only_compiles() {
46 let _ = std::io::stderr;
50 }
51
52 #[test]
53 fn guard_is_send() {
54 fn assert_send<T: Send>() {}
55 assert_send::<tracing_appender::non_blocking::WorkerGuard>();
56 }
57}