steer_core/utils/
tracing.rs1use chrono::Local;
2use dirs;
3use std::io;
4use tracing_appender::rolling::{self};
5use tracing_subscriber::{
6 EnvFilter,
7 fmt::{self, format::FmtSpan},
8 prelude::*,
9};
10
11pub fn init_tracing() -> io::Result<()> {
17 let now = Local::now();
19 let timestamp = now.format("%Y%m%d_%H%M%S");
20
21 let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| {
23 EnvFilter::new("info")
25 });
26
27 if let Some(home_dir) = dirs::home_dir() {
28 let log_dir = home_dir.join(".steer");
31 std::fs::create_dir_all(&log_dir)?;
32
33 let file_appender = rolling::never(log_dir.clone(), format!("{timestamp}.log"));
35
36 let subscriber = tracing_subscriber::registry()
37 .with(
38 fmt::Layer::new()
39 .with_writer(file_appender)
40 .with_ansi(false)
41 .with_span_events(FmtSpan::CLOSE)
42 .with_file(true)
43 .with_line_number(true),
44 )
45 .with(filter);
46
47 tracing::subscriber::set_global_default(subscriber).map_err(io::Error::other)?;
48
49 tracing::debug!(
50 target: "steer_core::utils::tracing",
51 path = %log_dir.join(format!("{timestamp}.log")).display(),
52 "Tracing initialized with file output. Filter configured via RUST_LOG env var."
53 );
54 } else {
55 let subscriber = tracing_subscriber::registry()
57 .with(fmt::Layer::default().with_ansi(true).with_target(true))
58 .with(filter);
59
60 tracing::subscriber::set_global_default(subscriber).map_err(io::Error::other)?;
61
62 tracing::debug!(
63 target: "steer_core::utils::tracing",
64 "Tracing initialized with stdout output. Filter configured via RUST_LOG env var."
65 );
66 }
67
68 Ok(())
69}